%PDF- %PDF-
Direktori : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/menu/widgets/ |
Current File : /home/vacivi36/intranet.vacivitta.com.br/protected/humhub/modules/ui/menu/widgets/Menu.php |
<?php /** * @link https://www.humhub.org/ * @copyright Copyright (c) 2018 HumHub GmbH & Co. KG * @license https://www.humhub.com/licences */ namespace humhub\modules\ui\menu\widgets; use humhub\components\Event; use humhub\libs\Sort; use humhub\modules\ui\menu\MenuEntry; use humhub\modules\ui\menu\MenuLink; use humhub\widgets\BaseStack; use humhub\widgets\JsWidget; use Yii; use yii\helpers\Url; use yii\web\View; /** * Base class for menus and navigations. * * @since 1.4 * @package humhub\modules\ui\widgets */ abstract class Menu extends JsWidget { /** * @event MenuEvent an event raised before running the navigation widget. */ const EVENT_RUN = 'run'; /** * @var string template view file of the navigation */ public $template; /** * @var MenuEntry[] the menu entries */ protected $entries = []; /** * Add new menu entry to the navigation * * @param MenuEntry $entry */ public function addEntry(MenuEntry $entry) { $this->entries[] = $entry; } /** * Removes the entry from the navigation * * @param MenuEntry $entry * @return boolean */ public function removeEntry($entry) { foreach ($this->entries as $i => $e) { if ($e === $entry) { unset($this->entries[$i]); return true; } } return false; } /** * Executes the navigation widget. * * @return string the result of navigation widget execution to be outputted. */ public function run() { $this->trigger(static::EVENT_RUN); if (empty($this->template) || empty($this->entries)) { return ''; } if ($this->template === '@humhub/widgets/views/leftNavigation') { Yii::debug('Deprecated usage of leftNavigation view!'); $this->template = '@ui/menu/widgets/views/left-navigation.php'; } return $this->render($this->template, $this->getViewParams()); } /** * Returns the parameters which are passed to the view template * * @return array the view parameters */ protected function getViewParams() { return [ 'menu' => $this, 'entries' => $this->getSortedEntries(), 'options' => $this->getOptions(), // Deprecated 'items' => $this->getItems(), 'numItems' => count($this->getItems()) ]; } /** * Sorts the entry list by sortOrder and returns the sorted entry list. * * @return MenuEntry[] */ public function getSortedEntries() { return Sort::sort($this->entries, 'sortOrder', BaseStack::DEFAULT_SORT_ORDER); } /** * @inheritdoc */ public function getData() { return [ 'menu-id' => $this->id ]; } /** * Returns the first entry with the given URL * * @param $url string|array the url or route * @return MenuLink */ public function getEntryByUrl($url) { if (is_array($url)) { $url = Url::to($url); } foreach ($this->entries as $entry) { if (!$entry instanceof MenuLink) { continue; } if ($entry->getUrl() === $url) { return $entry; } } return null; } /** * Returns the first entry with the given id * * @param $id string the menueId * @return MenuEntry */ public function getEntryById($id) { foreach ($this->entries as $entry) { if (!$entry instanceof MenuEntry) { continue; } if ($entry->getId() === $id) { return $entry; } } return null; } /** * Returns the first active menu entry * * @return MenuEntry */ public function getActiveEntry() { foreach ($this->entries as $entry) { if ($entry->getIsActive()) { return $entry; } } } /** * Sets an menu entry active and inactive all other entries * * @param MenuEntry $entry */ public function setEntryActive(MenuEntry $entry) { foreach ($this->entries as $currentEntry) { $currentEntry->setIsActive(($currentEntry->compare($entry))); } } /** * ------------------------------------------------------------------- * Compatibility Layer * ------------------------------------------------------------------- */ /** * @param array $entryArray * @deprecated since 1.4 */ public function addItem($entryArray) { $entry = MenuLink::createByArray($entryArray); $this->addEntry($entry); } /** * @return array item group * @deprecated since 1.4 not longer supported! */ public function addItemGroup($itemGroup) { //throw new InvalidCallException('Item groups are not longer supported'); } /** * @return array the item group * @deprecated since 1.4 */ public function getItemGroups() { return [ ['id' => 'default', 'label' => '', 'icon' => '', 'sortOrder' => 1000] ]; } /** * @return array the menu items as array list * @deprecated since 1.4 */ public function getItems($group = '') { $items = []; foreach ($this->entries as $entry) { if ($entry instanceof MenuLink) { $items[] = $entry->toArray(); } } return $items; } /** * Returns all entries filtered by $type. If no $type filter is given all entries * are returned. * * If $filterVisible is set, only visible entries will be returned * * @param null|string $type * @param bool $filterVisible * @return MenuEntry[] */ public function getEntries($type = null, $filterVisible = false) { $result = []; foreach ($this->getSortedEntries() as $entry) { if ((!$filterVisible || $entry->isVisible()) && (!$type || get_class($entry) === $type || is_subclass_of($entry, $type))) { $result[] = $entry; } } return $result; } /** * @param null $type * @param bool $filterVisible * @return MenuEntry|null */ public function getFirstEntry($type = null, $filterVisible = false) { $entries = $this->getEntries($type, $filterVisible); if (count($entries)) { return $entries[0]; } return null; } /** * Checks if this menu contains multiple entries of the given $type, or at all if no $type filter is given. * * @param null $type * @return bool */ public function hasMultipleEntries($type = null) { return count($this->getEntries($type)) > 1; } /** * Activates an entry by given id or url search string. * @param $searchStr menu entry id or url */ public function setActive($searchStr) { $entry = $this->getEntryById($searchStr); if (!$entry) { $entry = $this->getEntryByUrl($searchStr); } if ($entry) { $this->setEntryActive($entry); } } /** * Deactivates an entry by given id or url search string. * @param $searchStr menu entry id or url */ public function setInactive($searchStr) { $entry = $this->getEntryById($searchStr); if (!$entry) { $entry = $this->getEntryByUrl($searchStr); } if ($entry) { $entry->setIsActive(false); } } /** * This function provides static menu entry activation, by entry id or url. */ public static function markAsActive($searchStr) { Event::on(static::class, static::EVENT_RUN, function ($event) use ($searchStr) { $event->sender->setActive($searchStr); }); } /** * This function provides static menu entry inactivation, by entry id or url. */ public static function markAsInactive($url) { Event::on(static::class, static::EVENT_RUN, function ($event) use ($url) { $event->sender->setInactive($url); }); } /** * @return array the menu entry as array * @deprecated since 1.4 */ public function getActive() { $activeEntry = $this->getActiveEntry(); if ($activeEntry && $activeEntry instanceof MenuLink) { return $activeEntry->toArray(); } return null; } /** * @param $url string the URL or route * @deprecated since 1.4 */ public function deleteItemByUrl($url) { $entry = $this->getEntryByUrl($url); if ($entry) { $this->removeEntry($entry); } } /** * @deprecated since 1.4 */ public static function setViewState() { $instance = new static(); if (!empty($instance->id)) { $active = $instance->getActive(); $instance->view->registerJs('humhub.modules.ui.navigation.setActive("' . $instance->id . '", ' . json_encode($active) . ');', View::POS_END, 'active-' . $instance->id); } } }