Эффективная навигация по сайту с помощью CodeIgniter

Я работаю над сайтом, где в навигации может быть до 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); ... 

Затем в ваших представлениях вы можете обрабатывать переданные им переменные.