コード例 #1
0
ファイル: Navigation.php プロジェクト: trk/ionize
 /**
  * Return a tree navigation based on the given helper.
  * One helper is needed to use this tag.
  * The default helper is /application/helpers/navigation_helper->get_tree_navigation()
  * If you wish to change the
  *
  * @param	FTL_Binding object
  *
  * @return 	string
  *
  * @usage	<ion:tree_navigation [helper="navigation::your_helper_method"] />
  *
  */
 public static function tag_tree_navigation(FTL_Binding $tag)
 {
     // Page : Asked one through the page tag
     $page = $tag->get('page');
     // Current page
     if (is_null($page)) {
         $page = self::registry('page');
     }
     // If 404 : Put empty vars, so the menu will prints out without errors
     /*
     if ( !isset($page['id_page']))
     {
     	$page = array(
     		'id_page' => '',
     		'id_parent' => ''
     	);
     }
     */
     // Menu : Main menu by default
     $menu_name = $tag->getAttribute('menu', 'main');
     $id_menu = 1;
     foreach (self::registry('menus') as $menu) {
         if ($menu_name == $menu['name']) {
             $id_menu = $menu['id_menu'];
             break;
         }
     }
     // Attribute level, else parent page level + 1
     $from_level = $tag->getAttribute('level', 0);
     // Depth
     $depth = $tag->getAttribute('depth', -1);
     // Attribute : active class, first_class, last_class
     $active_class = $tag->getAttribute('active_class', 'active');
     $first_class = $tag->getAttribute('first_class', '');
     $last_class = $tag->getAttribute('last_class', '');
     // Display hidden navigation elements ?
     $display_hidden = $tag->getAttribute('display_hidden', FALSE);
     // Includes articles as menu elements
     $with_articles = $tag->getAttribute('articles', FALSE);
     // Attribute : HTML Tree container ID & class attribute
     $id = $tag->getAttribute('id');
     if (strpos($id, 'id') !== FALSE) {
         $id = str_replace('\'', '"', $id);
     }
     $class = $tag->getAttribute('class');
     if (strpos($active_class, 'class') !== FALSE) {
         $active_class = str_replace('\'', '"', $active_class);
     }
     // Attribute : Helper to use to print out the tree navigation
     $helper = $tag->getAttribute('helper', 'navigation');
     // Get helper method
     $helper_function = substr(strrchr($helper, ':'), 1) ? substr(strrchr($helper, ':'), 1) : 'get_tree_navigation';
     $helper = strpos($helper, ':') !== FALSE ? substr($helper, 0, strpos($helper, ':')) : $helper;
     // load the helper
     self::$ci->load->helper($helper);
     // Page from locals : By ref because of active_class definition
     // $pages =  $tag->locals->_pages;
     $pages = self::registry('pages');
     /* Get the reference parent page ID
      * Note : this is depending on the whished level.
      * If the curent page level > asked level, we need to find recursively the parent page which has the good level.
      * This is done to avoid tree cut when navigation to a child page
      *
      * e.g :
      *
      * On the "services" page and each subpage, we want the tree navigation composed by the sub-pages of "services"
      * We are in the page "offer"
      * We have to find out that the level 1 parent is "services"
      *
      *	Page structure				Level
      *
      *	home						0
      *	 |_ about					1		
      *	 |_ services				1		<- We want all the nested nav starting at level 1 from this parent page
      *	 	   |_ development		2
      *		   |_ design			2
      *				|_ offer		3		<- We are here.
      *				|_ portfolio	3	
      */
     $page_level = isset($page['level']) ? $page['level'] : 0;
     // Asked Level exists
     $parent_page = array('id_page' => $from_level > 0 ? $page['id_page'] : 0, 'id_parent' => isset($page['id_parent']) ? $page['id_parent'] : 0);
     if ($from_level !== FALSE) {
         $parent_page = array('id_page' => $from_level > 0 ? $page['id_page'] : 0, 'id_parent' => isset($page['id_parent']) ? $page['id_parent'] : 0);
     } else {
         foreach ($pages as $p) {
             // Parent page is the id_subnav page
             if ($p['id_page'] == $page['id_subnav']) {
                 $parent_page = $p;
             }
         }
     }
     // Find out the wished parent page
     while ($page_level >= $from_level && $from_level > 0) {
         $potential_parent_page = array();
         foreach ($pages as $p) {
             if ($p['id_page'] == $parent_page['id_parent']) {
                 $potential_parent_page = $p;
                 break;
             }
         }
         if (!empty($potential_parent_page)) {
             $parent_page = $potential_parent_page;
             $page_level = $parent_page['level'];
         } else {
             $page_level--;
         }
     }
     // Active pages array. Array of ID
     $active_pages = Structure::get_active_pages($pages, $page['id_page']);
     foreach ($pages as $key => $p) {
         $pages[$key]['active_class'] = in_array($p['id_page'], $active_pages) ? $active_class : '';
     }
     // Filter on 'appears'=>'1'
     $nav_pages = $pages;
     if ($display_hidden === FALSE) {
         $nav_pages = array_values(array_filter($pages, array('TagManager_Page', '_filter_appearing_pages')));
     }
     $final_nav_pages = $nav_pages_list = array();
     foreach ($nav_pages as $k => $np) {
         if ($np['id_menu'] == $id_menu) {
             $final_nav_pages[] = $np;
             $nav_pages_list[] = $np['id_page'];
         }
     }
     // Should we include articles ?
     $articles = FALSE;
     if ($with_articles == TRUE) {
         $entity = self::get_entity();
         $id_active_article = $entity['type'] == 'article' ? $entity['id_entity'] : NULL;
         foreach ($final_nav_pages as $key => $p) {
             // TODO : Change for future "Articles" lib call
             $tag->set('page', $p);
             $articles = TagManager_Article::get_articles($tag);
             // Set active article
             if (!is_null($id_active_article)) {
                 foreach ($articles as $akey => $a) {
                     if ($a['id_article'] == $id_active_article) {
                         $articles[$akey]['active_class'] = $active_class;
                         $articles[$akey]['is_active'] = TRUE;
                     }
                 }
             }
             $final_nav_pages[$key]['articles'] = $articles;
         }
     }
     // Get the tree navigation array
     $tree = Structure::get_tree_navigation($final_nav_pages, $parent_page['id_page'], $from_level, $depth, $articles);
     // Return the helper function
     if (function_exists($helper_function)) {
         return call_user_func($helper_function, $tree, $id, $class, $first_class, $last_class);
     }
 }
コード例 #2
0
ファイル: Page.php プロジェクト: pompalini/emngo
 /**
  * Returns pages from one given parent page
  *
  * @TODO	Check and finish writing
  * 			Planned for 1.0
  *
  * @param FTL_Binding
  *
  * @return mixed
  */
 public static function tag_pages(FTL_Binding $tag)
 {
     $cache = $tag->getAttribute('cache', TRUE);
     // Tag cache
     //		if ($cache == TRUE && ($str = self::get_cache(FTL_Binding $tag)) !== FALSE)
     //			return $str;
     // Returned string
     $str = '';
     $parent = $tag->getAttribute('parent');
     $mode = $tag->getAttribute('mode', 'flat');
     $levels = $tag->getAttribute('levels');
     $menu_name = $tag->getAttribute('menu');
     $parent_page = NULL;
     // Display hidden navigation elements ?
     $display_hidden = $tag->getAttribute('display_hidden', FALSE);
     $limit = $tag->getAttribute('limit');
     if (!is_null($parent)) {
         if (strval(abs((int) $parent)) == (string) $parent) {
             $parent_page = self::get_page_by_id($parent);
         } else {
             if (substr($parent, 0, 1) == '-') {
                 $parent_page = self::get_relative_parent_page(self::registry('page'), $parent, $display_hidden);
             } else {
                 if ($parent == 'this') {
                     $parent_page = self::registry('page');
                 } else {
                     $parent_page = self::get_page_by_code($parent);
                 }
             }
         }
     }
     $data = self::registry('pages');
     if (!empty($parent_page)) {
         if ($mode == 'tree') {
             $pages = Structure::get_tree_navigation($data, $parent_page['id_page']);
         } else {
             $pages = array();
             Structure::get_nested_structure($data, $pages, $parent_page['id_page']);
         }
     } else {
         $pages = self::registry('pages');
     }
     // Limit pages to a certain level
     if (!is_null($levels)) {
         $levels = (int) $levels;
         for ($i = count($pages) - 1; $i >= 0; $i--) {
             if ($pages[$i]['level'] > $levels) {
                 unset($pages[$i]);
             }
         }
         $pages = array_values($pages);
     }
     // Limit pages to a certain menu
     if (!is_null($menu_name)) {
         // By default main menu
         $id_menu = 1;
         foreach (self::registry('menus') as $menu) {
             if ($menu_name == $menu['name']) {
                 $id_menu = $menu['id_menu'];
             }
         }
         for ($i = count($pages) - 1; $i >= 0; $i--) {
             if ($pages[$i]['id_menu'] != $id_menu) {
                 unset($pages[$i]);
             }
         }
         $pages = array_values($pages);
     }
     if ($display_hidden == FALSE) {
         $pages = array_values(array_filter($pages, array('TagManager_Page', '_filter_appearing_pages')));
     }
     if (!is_null($limit)) {
         $pages = array_slice($pages, 0, $limit);
     }
     $count = count($pages);
     foreach ($pages as $key => $page) {
         // Render the article
         $tag->set('page', $page);
         $tag->set('index', $key);
         $tag->set('count', $count);
         $str .= $tag->expand();
     }
     $output = self::wrap($tag, $str);
     // Tag cache
     self::set_cache($tag, $output);
     return $output;
 }
コード例 #3
0
ファイル: Navigation.php プロジェクト: nbourguig/ionize
 /**
  * Return a tree navigation based on the given helper.
  *
  * @param	FTL_Binding object
  *
  */
 public static function tag_tree_navigation($tag)
 {
     // Current page
     $page = $tag->locals->page;
     // If 404 : Put empty vars, so the menu will prints out without errors
     if (!isset($page['id_page'])) {
         $page = array('id_page' => '', 'id_parent' => '');
     }
     // Menu : Main menu by default
     $menu_name = isset($tag->attr['menu']) ? $tag->attr['menu'] : 'main';
     $id_menu = 1;
     foreach ($tag->globals->menus as $menu) {
         if ($menu_name == $menu['name']) {
             $id_menu = $menu['id_menu'];
         }
     }
     // If set, attribute level, else parent page level + 1
     $from_level = isset($tag->attr['level']) ? $tag->attr['level'] : 0;
     //		$from_level = (isset($tag->attr['level']) ) ? $tag->attr['level'] : FALSE ;
     // If set, depth
     $depth = isset($tag->attr['depth']) ? $tag->attr['depth'] : -1;
     // Attribute : active class, first_class, last_class
     $active_class = isset($tag->attr['active_class']) ? $tag->attr['active_class'] : 'active';
     $first_class = isset($tag->attr['first_class']) ? $tag->attr['first_class'] : '';
     $last_class = isset($tag->attr['last_class']) ? $tag->attr['last_class'] : '';
     // Display hidden navigation elements ?
     $display_hidden = isset($tag->attr['display_hidden']) ? TRUE : FALSE;
     // Includes articles as menu elements
     $with_articles = isset($tag->attr['articles']) ? TRUE : FALSE;
     // Attribute : HTML Tree container ID & class attribute
     $id = isset($tag->attr['id']) ? $tag->attr['id'] : NULL;
     if (strpos($id, 'id') !== FALSE) {
         $id = str_replace('\'', '"', $id);
     }
     $class = isset($tag->attr['class']) ? $tag->attr['class'] : NULL;
     if (strpos($active_class, 'class') !== FALSE) {
         $active_class = str_replace('\'', '"', $active_class);
     }
     // Attribute : Use lang_url or url ?
     //		$lang_url = (isset($tag->attr['lang']) && $tag->attr['lang'] === 'TRUE') ? TRUE : FALSE ;
     //		if ($lang_url == FALSE)
     //			$lang_url = (isset($tag->attr['lang_url']) && $tag->attr['lang_url'] === 'TRUE') ? TRUE : FALSE ;
     // Attribute : Helper to use to print out the tree navigation
     $helper = isset($tag->attr['helper']) && $tag->attr['helper'] != '' ? $tag->attr['helper'] : 'navigation';
     // Get helper method
     $helper_function = substr(strrchr($helper, ':'), 1) ? substr(strrchr($helper, ':'), 1) : 'get_tree_navigation';
     $helper = strpos($helper, ':') !== FALSE ? substr($helper, 0, strpos($helper, ':')) : $helper;
     // load the helper
     self::$ci->load->helper($helper);
     // Page from locals : By ref because of active_class definition
     $pages =& $tag->locals->pages;
     /* Get the reference parent page ID
      * Note : this is depending on the whished level.
      * If the curent page level > asked level, we need to find recursively the parent page which has the good level.
      * This is done to avoid tree cut when navigation to a child page
      *
      * e.g :
      *
      * On the "services" page and each subpage, we want the tree navigation composed by the sub-pages of "services"
      * We are in the page "offer"
      * We have to find out that the level 1 parent is "services"
      *
      *	Page structure				Level
      *
      *	home						0
      *	 |_ about					1		
      *	 |_ services				1		<- We want all the nested nav starting at level 1 from this parent page
      *	 	   |_ development		2
      *		   |_ design			2
      *				|_ offer		3		<- We are here.
      *				|_ portfolio	3	
      *
      */
     $page_level = isset($page['level']) ? $page['level'] : 0;
     $parent_page = array();
     // Asked Level exists
     $parent_page = array('id_page' => $from_level > 0 ? $page['id_page'] : 0, 'id_parent' => isset($page['id_parent']) ? $page['id_parent'] : 0);
     if ($from_level !== FALSE) {
         $parent_page = array('id_page' => $from_level > 0 ? $page['id_page'] : 0, 'id_parent' => isset($page['id_parent']) ? $page['id_parent'] : 0);
     } else {
         foreach ($pages as $p) {
             // Parent page is the id_subnav page
             if ($p['id_page'] == $page['id_subnav']) {
                 $parent_page = $p;
             }
         }
     }
     // Find out the wished parent page
     while ($page_level >= $from_level && $from_level > 0) {
         // $potential_parent_page = array_values(array_filter($pages, create_function('$row','return $row["id_page"] == "'. $parent_page['id_parent'] .'";')));
         $potential_parent_page = array();
         foreach ($pages as $p) {
             if ($p['id_page'] == $parent_page['id_parent']) {
                 $potential_parent_page = $p;
                 break;
             }
         }
         // if (isset($potential_parent_page[0]))
         if (!empty($potential_parent_page)) {
             $parent_page = $potential_parent_page;
             $page_level = $parent_page['level'];
         } else {
             $page_level--;
         }
     }
     // Active pages array. Array of ID
     $active_pages = Structure::get_active_pages($pages, $page['id_page']);
     foreach ($pages as $key => $p) {
         $pages[$key]['active_class'] = in_array($p['id_page'], $active_pages) ? $active_class : '';
     }
     // Filter on 'appears'=>'1'
     $nav_pages = $pages;
     if ($display_hidden === FALSE) {
         $nav_pages = array_values(array_filter($pages, array('TagManager_Page', '_filter_appearing_pages')));
     }
     // $nav_pages = array_filter($nav_pages, create_function('$row','return ($row["id_menu"] == "'. $id_menu .'") ;'));
     $final_nav_pages = $nav_pages_list = array();
     foreach ($nav_pages as $k => $np) {
         if ($np['id_menu'] == $id_menu) {
             $final_nav_pages[] = $np;
             $nav_pages_list[] = $np['id_page'];
         }
     }
     // Should we include articles ?
     $articles = FALSE;
     if ($with_articles == TRUE) {
         $uri = preg_replace("|/*(.+?)/*\$|", "\\1", self::$ci->uri->uri_string);
         $uri_segments = explode('/', $uri);
         $current_article_uri = array_pop($uri_segments);
         $tag->attr['scope'] = 'global';
         $articles = TagManager_Page::get_articles($tag);
         foreach ($articles as &$article) {
             if (array_pop(explode('/', $article['url'])) == $current_article_uri) {
                 $article['active_class'] = $active_class;
             }
         }
     }
     // Get the tree navigation array
     $tree = Structure::get_tree_navigation($final_nav_pages, $parent_page['id_page'], $from_level, $depth, $articles);
     // Return the helper function
     if (function_exists($helper_function)) {
         return call_user_func($helper_function, $tree, $id, $class, $first_class, $last_class);
     }
 }