artabro/wire/modules/System/SystemNotifications/NotificationArray.php
2024-08-27 11:35:37 +02:00

285 lines
7.1 KiB
PHP

<?php namespace ProcessWire;
/**
* Contains multiple Event objects for a single page
*
* @class NotificationArray
*
*/
class NotificationArray extends WireArray {
/**
* User or Page that these notifications are for
*
* @var Page|User
*
*/
protected $page;
/**
* Create a new NotificationArray
*
* @param Page|User $page User (or page) that these notifications are for
*
*/
public function __construct(Page $page) {
$this->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;
}
}