Я работаю над сайтом, где в навигации может быть до 3 уровней иерархии.
Раньше, когда я сворачивал свой собственный с PHP, я бы создал файл navigation.php, содержащий класс и массивы для всех разделов и подсекций и пару функций для вывода навигации. Я бы установил переменные на каждой странице сайта (current_section = '', current_sub_section = ''), чтобы навигационная функция знала, что выделить.
В CodeIgniter мне интересно, если это хороший подход к использованию?
Я собираюсь предположить, что ваши основные навигационные разделы почти напрямую отображаются на ваши контроллеры, т.е.
Home | News | Events
В верхней панели отображаются карты:
Если это так, у вас уже есть простой способ выбора вашего массива nav.
Вы можете поместить массив пар элементов ссылки в конструктор контроллера и передать их в подвыборку вашего вывода.
Пример:
class HomeController extends CI_Controller { private $nav; public function __construct() { parent::__construct(); $this->nav = array( array('Browse', site_url('news/browse')), array('Edit', site_url('news/edit')) ); $this->load->vars(array('NavigationArray' => $this->nav)); } // ... }
Теперь вы сделали автоматическую регистрацию переменной во всех ваших представлениях $NavigationArray
которая содержит массив пар Display Name – Link .
Затем вы можете загрузить базовый вид навигации, который создает ваш субнав из этой переменной (поскольку он доступен везде).
<? foreach($NavigationArray as $entry): ?> <a href="<?=$entry[1];?>"><?=$entry[0];?></a> <? endforeach; ?>
И ниже вы можете посмотреть на существование суб-навигационного массива, который вы могли бы установить в своем контроллере, или что-то еще (третий дополнительный навигатор, о котором вы говорили)
<? if(exists($SubNavigationArray)): ?> <? foreach($SubNavigationArray as $entry): ?> <a href="<?=$entry[1];?>"><?=$entry[0];?></a> <? endforeach; ?> <? endif; ?>
Пожалуйста, помните, что этот пример очень простой, но, как правило, мы передаем данные, я бы не хотел, чтобы вы размещали глобальные переменные в любом месте и пытались отложить их. Просто «загружайте» переменные в движок просмотра, и они будут доступны при просмотре ваших представлений / подзаголовков.
Таким образом, контроллер контролирует, какие навигационные элементы отображаются.
Также обратите внимание:
Вы можете передать переменные явно, а не доверять, что они будут существовать в области вашего представления.
$this->load->view('myview', array('NavigationArray' => $this->nav));
Надеюсь это поможет.
Вот в основном, что я делаю, чтобы определить «активные» ссылки в Codeigniter:
$active_class = ''; $url = site_url('your/link/url'); if ($url == current_url()) { $active_class = ' class="active"'; } $link = '<a href="'.$url.'"'.$active_class.'>Link Text</a>";
Имейте в виду, что это базовый пример и обычно выполняется в цикле. Лучший способ зависит от того, как выглядит ваш навигационный массив, и что вы считаете «активным» (f вы хотите «активировать» ссылки, чей href частично соответствует URL-адресу).
Лучший способ – использовать 3 разных вида, вид сверху, левый вид и вид снизу, а затем в вашем контроллере вы можете передать атрибутивные вары каждому виду, чтобы вы делали что-то вроде
$top[current] = something; $top[current_sub] = somethingelse; $this->load->view('top_nav', $top); $this->load->view('left_nav',$left); ...
Затем в ваших представлениях вы можете обрабатывать переданные им переменные.