%PDF- %PDF-
| Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/interfaces/ |
| Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/modules/calendar/interfaces/CalendarService.php |
<?php
/**
* @link https://www.humhub.org/
* @copyright Copyright (c) 2017 HumHub GmbH & Co. KG
* @license https://www.humhub.com/licences
*
*/
/**
* Created by PhpStorm.
* User: buddha
* Date: 14.09.2017
* Time: 12:33
*/
namespace humhub\modules\calendar\interfaces;
use DateInterval;
use DateTime;
use humhub\modules\calendar\helpers\CalendarUtils;
use humhub\modules\calendar\interfaces\event\CalendarEntryTypeSetting;
use humhub\modules\calendar\interfaces\event\CalendarEventIF;
use humhub\modules\calendar\interfaces\event\CalendarItemsEvent;
use humhub\modules\calendar\interfaces\event\CalendarItemTypesEvent;
use humhub\modules\calendar\interfaces\event\CalendarTypeSetting;
use humhub\modules\calendar\interfaces\event\CalendarTypeArrayWrapper;
use humhub\modules\calendar\models\CalendarEntryQuery;
use humhub\modules\calendar\models\CalendarEntryType;
use humhub\modules\content\components\ContentActiveRecord;
use humhub\modules\content\components\ContentContainerActiveRecord;
use humhub\modules\calendar\interfaces\event\legacy\CalendarEventIFWrapper;
use humhub\modules\content\models\Content;
use yii\base\Component;
use yii\helpers\ArrayHelper;
/**
* This service component supports integration functionality and is responsible for retrieving
* calendar related data from other modules using the calendar interface.
*
* You can receive an instance of this component by calling
*
* ```php
* $calendarService = Yii::$app->getModule('calendar')->get(CalendarService::class);
* ```
* @package humhub\modules\calendar\interfaces
*/
class CalendarService extends Component
{
/**
* Used for assembling all available item types provided by other modules
*/
const EVENT_GET_ITEM_TYPES = 'getItemTypes';
/**
* Used for assembling all calendar items of other modules
*/
const EVENT_FIND_ITEMS = 'findItems';
/**
* @var array
*/
private static $resultCache = [];
/**
* Searches for integrated calendars of other modules.
* Modules can append their event types by calling CalendarItemTypeEvent::addType() and providing
* a unique key and options as for example:
*
* ```php
* $event->addType('myType', [
* 'title' => Yii::t('MyModule.base', 'My Type),
* 'color' => '#2c99d6' // default color for this even type
* ]);
* ```
*
* The module has to get sure it only returns results either if $contentContainer is not provided or the given
* module is enabled for the given ContentContainerActiveRecord.
*
* @param null ContentContainerActiveRecord $contentContainer
* @return array|null
*/
public function getCalendarItemTypes(ContentContainerActiveRecord $contentContainer = null)
{
$containerKey = ($contentContainer) ? $contentContainer->contentcontainer_id : 'global';
if(isset(static::$resultCache[$containerKey])) {
return static::$resultCache[$containerKey];
}
$event = new CalendarItemTypesEvent(['contentContainer' => $contentContainer]);
$this->trigger(self::EVENT_GET_ITEM_TYPES, $event);
$result = [new CalendarEntryTypeSetting(['type' => new CalendarEntryType(), 'contentContainer' => $contentContainer])];
foreach ($event->getTypes() as $key => $type) {
$type = is_array($type) ? new CalendarTypeArrayWrapper(['key' => $key, 'options' => $type]) : $type;
$result[] = new CalendarTypeSetting(['type' => $type, 'contentContainer' => $contentContainer]);
}
return static::$resultCache[$containerKey] = $result;
}
public static function flushCache() {
static::$resultCache = [];
}
/**
* Merges all CalendarItems for a given ContentContainerActiveRecord filtered by $from, $to and $filters.
*
* CalendarItems can either be CalendarEntries or CalendarItems provided
*
* @param DateTime $start
* @param DateTime $end
* @param array $filters
* @param ContentContainerActiveRecord $contentContainer
* @param null $limit
* @param bool $expand
* @param array $types
* @return CalendarEventIF[]
* @throws \Throwable
*/
public function getCalendarItems(DateTime $start = null, DateTime $end = null, $filters = [], ContentContainerActiveRecord $contentContainer = null, $limit = null, $expand = true, $types = [])
{
$result = [];
$event = new CalendarItemsEvent([
'contentContainer' => $contentContainer,
'start' => $start ? clone $start : null,
'end' => $end ? clone $end : null,
'filters' => $filters,
'limit' => $limit,
'expand' => $expand
]);
$this->trigger(static::EVENT_FIND_ITEMS, $event);
foreach($event->getItems() as $itemTypeKey => $items) {
$itemType = $this->getItemType($itemTypeKey, $contentContainer);
if($itemType && $itemType->isEnabled()) {
foreach ($items as $item) {
if(is_array($item)) {
$result[] = new CalendarEventIFWrapper(['itemType' => $itemType, 'options' => $item]);
} elseif($item instanceof CalendarEventIF) {
$result[] = $item;
}
}
}
}
$calendarEntries = CalendarEntryQuery::findForFilter($start, $end, $contentContainer, $filters, null, $expand, $types);
$result = array_merge($calendarEntries, $result);
ArrayHelper::multisort($result, ['startDateTime', 'endDateTime'], [SORT_ASC, SORT_ASC]);
return (count($result) > $limit) ? array_slice($result, 0, $limit) : $result;
}
public static $containerCache = [];
public function getEventColor(CalendarEventIF $event)
{
if($event->getColor()) {
return $event->getColor();
}
$type = $event->getEventType();
if(!$type) {
return null;
}
$typeSettings = null;
if($event instanceof ContentActiveRecord) {
/* @var $content Content */
$content = $event->content;
if($content->contentcontainer_id === null) {
$typeSettings = $this->getItemType($type->getKey());
} else {
$container = isset(static::$containerCache[$content->contentcontainer_id])
? static::$containerCache[$content->contentcontainer_id] : $content->container;
$typeSettings = $this->getItemType($type->getKey(), $container);
}
}
return $typeSettings ? $typeSettings->getColor() : $type->getDefaultColor();
}
/**
* @param ContentContainerActiveRecord|null $contentContainer
* @param int $daysInFuture
* @param int $limit
* @param array $filters
* @param bool $expand
* @return CalendarEventIF[]
* @throws \Throwable
*/
public function getUpcomingEntries(ContentContainerActiveRecord $contentContainer = null, $daysInFuture = 7, $limit = 5, $filters = [], $expand = true)
{
$start = new DateTime('now', CalendarUtils::getUserTimeZone());
$end = ($daysInFuture > 0) ? (new DateTime('now', CalendarUtils::getUserTimeZone()))
->add(new DateInterval('P'.$daysInFuture.'D')) : null;
return $this->getCalendarItems($start, $end, $filters, $contentContainer, $limit, $expand);
}
/**
* @param string $key item key
* @param ContentContainerActiveRecord|null $contentContainer
* @return CalendarTypeSetting|null
*/
public function getItemType($key, ContentContainerActiveRecord $contentContainer = null)
{
$itemTypes = $this->getCalendarItemTypes($contentContainer);
foreach ($itemTypes as $itemType) {
if($itemType->key === $key) {
return $itemType;
}
}
return null;
}
}