page = $page; parent::__construct(); } /** * Template method from WireArray * * @param Notification $item * @return bool * */ public function isValidItem($item) { return $item instanceof Notification; } /** * Add a Notification instance to this NotificationArray * * @param Notification $item * @return self|NotificationArray|WireArray * */ public function add($item) { $item->page = $this->page; $duplicate = false; $itemID = $item->getID(); foreach($this as $notification) { if($notification === $item) continue; if($notification->getID() == $itemID) { // already have it $duplicate = $notification; break; } } // don't add if it's a duplicate, just update it if($duplicate) { $item = $duplicate; $item->modified = time(); $item->progress = $duplicate->progress; $item->qty++; } return parent::add($item); } /** * Retrieve a Notification by index or by id * * @param int|string $key * @return Notification|null * */ public function get($key) { if(is_string($key) && strpos($key, 'noID') === 0) { $found = null; foreach($this as $notification) { if($notification->getID() === $key) { $found = $notification; break; } } return $found; } return parent::get($key); } /** * Get a notification that contains the given value for $property * * @param string $property * @param mixed $value * @return null|Notification * */ public function getBy($property, $value) { $found = null; foreach($this as $notification) { if($notification->get($property) == $value) { $found = $notification; break; } } return $found; } /** * Save any changes or additions that were made to these Notifications * * @return bool * */ public function save() { $of = $this->page->of(); if($of) $this->page->of(false); $result = $this->page->save(SystemNotifications::fieldName, array('quiet' => true)); if($of) $this->page->of(true); return $result; } /** * Get string value of this NotificationArray * * @return string * */ public function __toString() { $out = ''; foreach($this as $item) $out .= "\n$item"; return trim($out); } /** * Get a new Notification * * @param string $flag Specify any flag, flag name or space-separated combination of flag names * @param bool $addNow Add it to this NotificationArray now? * @return Notification * */ public function getNew($flag = 'message', $addNow = true) { $notification = $this->wire(new Notification()); $notification->setFlags($flag, true); $notification->created = time(); $notification->modified = time(); $notification->title = 'Untitled'; $notification->page = $this->page; $notification->src_id = $this->wire('page')->id; if($addNow) parent::add($notification); return $notification; } /************************************************************************************** * The following methods are based on those in the base Wire class, but they override * them to replace Notices functionality with Notifications * */ /** * Record an informational or 'success' message * * @param string $text * @param int|bool $flags See Notification flags * @return Notification * */ public function message($text, $flags = 0) { $notification = $this->getNew(Notification::flagMessage, true); $notification->title = $text; if($flags) $notification->setFlags($flags); return $notification; } /** * Record a warning notification * * @param string $text * @param int|bool $flags See Notification flags * @return Notification * */ public function warning($text, $flags = 0) { $notification = $this->getNew(Notification::flagWarning, true); $notification->title = $text; if($flags) $notification->setFlags($flags); return $notification; } /** * Record an error notification * * @param string $text * @param int|bool $flags See Notification flags * @return Notification * */ public function error($text, $flags = 0) { $notification = $this->getNew(Notification::flagError, true); $notification->title = $text; if($flags) $notification->setFlags($flags); return $notification; } /** * Return all error Notifications * * @param string|array $options One or more of array elements or space separated string of: * first: only first item will be returned (string) * last: only last item will be returned (string) * clear: clear out all items that are returned from this method (includes both local and global) * @return Notices|string Array of NoticeError error messages or string if last, first or str option was specified. * */ public function errors($options = array()) { return parent::errors($options); } /** * Return warnings recorded by this object * * @param string|array $options One or more of array elements or space separated string of: * first: only first item will be returned (string) * last: only last item will be returned (string) * clear: clear out all items that are returned from this method (includes both local and global) * @return Notices|string Array of NoticeError error messages or string if last, first or str option was specified. * */ public function warnings($options = array()) { return parent::warnings($options); } /** * Return messages recorded by this object * * @param string|array $options One or more of array elements or space separated string of: * first: only first item will be returned (string) * last: only last item will be returned (string) * clear: clear out all items that are returned from this method (includes both local and global) * errors: returns errors rather than messages. * warnings: returns warnings rather than messages. * @return Notices|string Array of NoticeError error messages or string if last, first or str option was specified. * */ public function messages($options = array()) { if(!is_array($options)) $options = explode(' ', strtolower($options)); if(in_array('errors', $options)) $type = 'error'; else if(in_array('warnings', $options)) $type = 'warning'; else $type = 'message'; $clear = in_array('clear', $options); $value = $this->wire(new NotificationArray($this->page)); foreach($this as $notification) { if(!$notification->is($type)) continue; /** @var Notification $notification */ $value->add($notification); if($clear) $this->remove($notification); // clear global } if(in_array('first', $options)) $value = $clear ? $value->shift() : $value->first(); else if(in_array('last', $options)) $value = $clear ? $value->pop() : $value->last(); return $value; } }