/** * Мерджит метаданые пункта меню в порядке * - Пункт меню, помеченный как главная страница (если есть) * - Все предки пункта меню * - Пункт меню * @param $menu MenuItem * @return array */ protected function buildMenuMetaData($menu) { $chain = []; if ($this->menuManager->getMenuMap()->getMainMenu()) { $chain[] = $this->menuManager->getMenuMap()->getMainMenu(); } $chain = array_merge($chain, $menu->parents()->excludeRoots()->all(), [$menu]); $metaDataChain = array_map(function ($value) { /** @var $value MenuItem */ $metaData = []; if (!empty($value->metakey)) { $metaData['keywords'] = $value->metakey; } if (!empty($value->metadesc)) { $metaData['description'] = $value->metadesc; } if (!empty($value->robots)) { $metaData['robots'] = $value->robots; } if (!empty($value->layout_path)) { $metaData['layout'] = $value->layout_path; } return $metaData; }, $chain); return count($metaDataChain) > 1 ? call_user_func_array('yii\\helpers\\ArrayHelper::merge', $metaDataChain) : $metaDataChain[0]; }
/** * @inheritdoc */ public function bootstrap($app) { $app->set($this->id, $this); $this->_moduleConfigDependency = new ExpressionDependency(['expression' => '\\Yii::$app->getModulesHash()']); DbState::bootstrap(); Yii::$container->set('gromver\\models\\fields\\EditorField', ['controller' => 'grom/media/manager', 'editorOptions' => ['filebrowserBrowseUrl' => ['/grom/menu/backend/item/ckeditor-select'], 'extraPlugins' => 'codesnippet']]); Yii::$container->set('gromver\\models\\fields\\MediaField', ['controller' => 'grom/media/manager']); Yii::$container->set('gromver\\modulequery\\ModuleQuery', ['cache' => $app->cache, 'cacheDependency' => $this->_moduleConfigDependency]); Yii::$container->set('gromver\\platform\\basic\\components\\MenuMap', ['cache' => $app->cache, 'cacheDependency' => DbState::dependency(MenuItem::tableName())]); Yii::$container->set('gromver\\platform\\basic\\components\\MenuUrlRule', ['cache' => $app->cache, 'cacheDependency' => $this->_moduleConfigDependency]); Yii::$container->set('gromver\\platform\\basic\\modules\\main\\widgets\\Desktop', ['cache' => $app->cache, 'cacheDependency' => $this->_moduleConfigDependency]); /** @var MenuManager $manager */ $rules['auth'] = 'grom/auth/default/login'; $rules['admin'] = 'grom/backend/default/index'; if (is_array($this->blockedUrlRules) && count($this->blockedUrlRules)) { foreach ($this->blockedUrlRules as $rule) { $rules[$rule] = 'grom/default/page-not-found'; //блокируем доступ напрямую } } $app->urlManager->addRules($rules, false); //вставляем в начало списка $app->set('menuManager', \Yii::createObject(MenuManager::className())); // пропускаем \gromver\models\fields\events\ListItemsEvent событие, через ModuleEvent - не факт, что нужно, но почему бы и нет Event::on('\\gromver\\models\\fields\\ListField', 'fetchItems', function ($event) { /** @var $event \gromver\models\fields\events\ListItemsEvent */ ModuleEvent::trigger(self::EVENT_FETCH_LIST_ITEMS, new ListItemsModuleEvent(['sender' => $event])); }); ModuleQuery::instance()->implement('\\gromver\\platform\\common\\interfaces\\BootstrapInterface')->invoke('bootstrap', [$app]); }