Code Igniter: эта логика навигации в контроллере или представлении?

#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), есть ли другой законный вариант поместить его в библиотеку? Я хочу создать очень простой шаблонный класс, который оборачивает верхний и нижний колонтитулы вокруг всего, а навигация отображается внутри заголовка. Так может ли все это быть в классе шаблона / библиотеке? или это еще не законченная вещь… Спасибо