#codeigniter #navigation
#codeigniter #навигация
Вопрос:
У меня есть представление под названием ‘sub_nav’, и в настоящее время оно содержит многомерный массив ссылок для каждого раздела. Это представление просматривает имя контроллера, чтобы получить текущий раздел, а затем перебирает соответствующий набор массивов и выводит ссылки.
это работает, работает, но, похоже, может быть, мне следует создать контроллер только для навигации? и сделайте sub_nav проще, но только вывод …. ? может кто-нибудь посоветовать?
$controllerName = $this->router->class;
$methodName = $this->router->method;
$subLinks['about'] = array(
'introduction' => 'Introduction',
'people' => 'Our People'
);
$subLinks['contact'] = array(
'singapore' => 'Singapore',
'japan' => 'Japan'
);
?>
<ul>
<?php foreach($subLinks[$controllerName] as $link=>$linkName){ ?>
<li <?php if($methodName == $link){ ?>class="on"<? } ?>><a href="<?php echo base_url(); ?><?php echo $controllerName ?>/<?php echo $link ?>/"><?php echo $linkName ?></a></li>
<? } ?>
</ul>
`
Ответ №1:
Если содержимое представляет собой статический массив, я бы поместил его в любой:
- Файл представления. Контроллеры — не единственное место, куда можно загружать представления, нет ничего плохого в вызове
$this->load->view()
из другого файла представления (вашего шаблона). Просто сохраните массив и логику представления там. - Файл конфигурации.Может показаться странным, но это идеальное место для статических данных, подобных этому. Таким образом, вам не придется постоянно загружать данные при каждом вызове load-> view(). Просто загрузите файл конфигурации в
MY_Controller
или что-то еще, и у вас будет доступ к нему в любом месте. Затем вы можете написать навигационное представление или библиотеку, которые будут выводить любой навигационный массив, который вы отправите ему (другими словами, не делайте здесь никакого html-кода — просто данные, затем используйте для элемента конфигурации в вашем представлении). Я говорю использовать базовый контроллер, потому что, вероятно, нет необходимости загружать эти данные автоматически, например, для запроса AJAX. Вам это не всегда понадобится.
Ей определенно не место в контроллере, который больше предназначен для обработки запросов и данных. Библиотека является более вероятным кандидатом. Если бы содержимое было динамическим (например, из базы данных), тогда вы определенно захотели бы использовать модель или библиотеку, но в этом случае я бы предпочел файл представления. Маловероятно, что вы будете использовать данные навигационного массива где-либо еще, кроме ваших представлений.
В любом случае HTML по возможности должен находиться в представлениях. Если вы используете навигационный массив только в представлениях, только в одном представлении, и он не динамический, просто сохраните его прямо там, в файле представления. Модели и библиотеки должны быть повторно используемыми, хранение статических данных там (которые вам, вероятно, потребуется часто обновлять) для меня не имеет смысла, но я был бы готов выслушать оппонентов.
Комментарии:
1. Верно, то, что я делаю сейчас, не совсем дурной тон?
2. Совсем нет. Я думаю, что это оптимально. Зачем отделять данные от логики представления, если они не динамические и используются только в этом представлении? Вы просто создаете массив, чтобы было проще создавать html. Лично у меня есть библиотека навигации, которая создает HTML из любого массива nav, который вы кидаете в нее, и я всегда определяю эти массивы в представлениях и запускаю
$this->navigation->create($my_nav_array)
сразу после.3. Вы определенно хотите проверить, используя библиотеку шаблонов. Я уверен, что есть много хороших, которые все похожи. Я не использовал ни одну, потому что у меня есть своя собственная, и я не буду утруждать себя тем, чтобы делиться ею, потому что она безумно настроена. Просто предложение, вам очень быстро надоест вызывать
$this->load->view('header')
повторно.4. Спасибо, я рассматривал это, но хочу, чтобы все было очень просто, поскольку я новичок в CI. Возможно, это: maestric.com/doc/php/codeigniter_template
5. Я могу настоятельно рекомендовать Smarty, он великолепен с Codeigniter или без него.
Ответ №2:
В зависимости от того, откуда берутся данные для навигации, я мог бы предоставить ему собственную модель (например, если она поступает из базы данных). Что касается логики выбора навигации для отображения, я бы поместил эту логику в общий базовый контроллер, либо запустив ее при всех загрузках страницы, либо разместив код для нее в методе на базовом контроллере, чтобы те страницы, которым это нужно, могли ее использовать.
Если ваши контроллеры используют что-то вроде $this-> data для хранения данных для отправки в представление, то логика базового контроллера также может передавать навигационные данные в представление.
Комментарии:
1. Спасибо. все страницы будут использовать ее, а данные (массивы ссылок / заголовки ссылок) статичны — значит, я должен просто сохранить их в контроллере? хотя, как вы говорите, это помещается в общий базовый контроллер
2. Да, это будет работать нормально. Если вы хотите упростить ее расширение в будущем, возможно, вам все равно захочется поместить массив в модель-заглушку, но в настоящее время это, очевидно, было бы нормально в контроллере.
3. Я понимаю. Еще один вопрос (мой первый набег на CI), есть ли другой законный вариант поместить его в библиотеку? Я хочу создать очень простой шаблонный класс, который оборачивает верхний и нижний колонтитулы вокруг всего, а навигация отображается внутри заголовка. Так может ли все это быть в классе шаблона / библиотеке? или это еще не законченная вещь… Спасибо