/**
  * Creates data provider instance with search query applied
  *
  * @param array $params        	
  *
  * @return ActiveDataProvider
  */
 public function search($params)
 {
     $query = CmsMenuItem::find();
     $dataProvider = new ActiveDataProvider(['query' => $query]);
     if (!($this->load($params) && $this->validate())) {
         return $dataProvider;
     }
     $query->andFilterWhere(['id' => $this->id, 'cms_hierarchy_item_id' => $this->cms_hierarchy_item_id, 'language' => $this->language, 'page_content_id' => $this->page_content_id, 'document_id' => $this->document_id]);
     $query->andFilterWhere(['like', 'name', $this->name]);
     return $dataProvider;
 }
 /**
  * show the page for the given alias name
  * @menuLabel __HIDDEN__
  * @param String $menuItemAlias
  * @return View
  */
 public function actionAlias($menuItemAlias)
 {
     $menuItemAlias = preg_replace('/[^a-zA-Z0-9_\\-]/', '', $menuItemAlias);
     $menuItem = CmsMenuItem::find()->where(['alias' => $menuItemAlias])->with('pageContent')->with('cmsHierarchyItem')->one();
     return $this->renderPage($menuItem);
 }
 /**
  * get the complete menu / hierarchy tree for the cms navigation structure
  *
  * @functionalRight cmsBackendRead
  *
  * @param
  *        	language integer the language id to get the cms menu items for
  * @param
  *        	expandLevel integer the level depth, until which the folders should be marked as expanded ($expanded = true)
  * @param
  *        	hideMissingLanguages boolean hide or show hierarchy items that do not have a translation (cms menu item) in the requested language
  * @param
  *        	filterDisplayState array an array if integers indicating which displayStates should be filtered from the results (@see CmsHierarchyItem::DISPLAYSTATE_PUBLISHED_VISIBLE_IN_NAVIGATION)
  * @return SimpleHierarchyItem an SimpleHierarchyItem instance, containing all subnodes in a node-tree structure (children property holds children of each node)
  */
 public static function getMenuTree($language, $expandLevel, $hideMissingLanguages, $removeHierarchyItemsWithNoContent = false, $filterDisplayState = [])
 {
     $language = intval($language);
     $expandLevel = intval($expandLevel);
     // query all hierarchy items (including hidden, etc.)
     $hierarchyQuery = CmsHierarchyItem::find()->orderby('parent_id ASC, position DESC')->asarray(true);
     // ****** IMPORTANT ******* do not modify the order by clause, since it is required by the recursive subroutine to work properly
     if (count($filterDisplayState) > 0) {
         $hierarchyQuery->where(['display_state' => $filterDisplayState]);
     }
     $hierarchyItems = $hierarchyQuery->all();
     // query all menu items (check if missing should be filtered)
     $query = CmsMenuItem::find()->orderby('id ASC')->asarray(true);
     $menuItemsForLanguage = $query->all();
     $menuItemIndex = [];
     // two dimensions, first dimension is id, second is language
     foreach ($menuItemsForLanguage as $menuItem) {
         $menuItemIndex[$menuItem['cms_hierarchy_item_id']][$menuItem['language']] = $menuItem;
     }
     $itemIndex = [];
     foreach ($hierarchyItems as $hierarchyItem) {
         // check if menu is available in current language, skip get fallback language if not
         if (isset($menuItemIndex[$hierarchyItem['id']]) || !$removeHierarchyItemsWithNoContent) {
             if (isset($menuItemIndex[$hierarchyItem['id']][$language])) {
                 $hierarchyItem['menu_item'] = $menuItemIndex[$hierarchyItem['id']][$language];
             } else {
                 if (!$hideMissingLanguages) {
                     // get fallback language as menu item if primary requested language not available (and missing items should not be hidden)
                     if (isset($menuItemIndex[$hierarchyItem['id']]) && $menuItemIndex[$hierarchyItem['id']] != null) {
                         $hierarchyItem['menu_item'] = reset($menuItemIndex[$hierarchyItem['id']]);
                         // return first language item found
                     }
                     $hierarchyItem['displaying_fallback_language'] = true;
                 }
             }
             if (isset($menuItemIndex[$hierarchyItem['id']]) && $menuItemIndex[$hierarchyItem['id']] != null) {
                 $hierarchyItem['available_menu_items_all_languages'] = $menuItemIndex[$hierarchyItem['id']];
             } else {
                 $hierarchyItem['available_menu_items_all_languages'] = [];
             }
             if (isset($hierarchyItem['menu_item']) || !$removeHierarchyItemsWithNoContent) {
                 if ($hideMissingLanguages && !isset($hierarchyItem['menu_item'])) {
                 } else {
                     $itemIndex[$hierarchyItem['id']] = $hierarchyItem;
                 }
             }
         }
     }
     if (isset($itemIndex[DefaultController::$ROOT_HIERARCHY_ITEM_ID])) {
         $rootItem = new SimpleHierarchyItem($itemIndex[DefaultController::$ROOT_HIERARCHY_ITEM_ID], $expandLevel > 0, 0);
         unset($itemIndex[DefaultController::$ROOT_HIERARCHY_ITEM_ID]);
         DefaultController::populateChildrenRecursive($rootItem, $itemIndex, $expandLevel, 1);
         return $rootItem;
     } else {
         throw new \Exception('Missing root hierarchy item (with id = ' . DefaultController::$ROOT_HIERARCHY_ITEM_ID . '). Can not build page tree.');
     }
     return null;
 }