CodeIgniter вложенные контроллеры? - PullRequest
1 голос
/ 13 июля 2011

Я новичок в CodeIgniter и надеюсь, что на мой вопрос будет простой ответ.

У меня есть веб-сайт с парой пунктов меню (menuA, menuB и menuC). Я смоделировал это с одним основным контроллером, index (), menuA (), menuB () и menuC () в контроллере. Вызываемая функция устанавливает значение сеанса currentMenu и включает заголовок, X, нижний колонтитул. Где X зависит от вызываемой функции. Заголовок затем подсвечивает выбранное меню.

В menuC (настройки учетной записи в моем веб-приложении) я хотел бы иметь другой контроллер, который управляет подпредставлениями AccountSettings / NotLoggedIn.

По логике вещей, я бы хотел, чтобы menuC () включала верхний и нижний колонтитулы, но затем перенаправлял вызов субконтроллеру, который управлял входом в систему или подстраницам.

Я неправильно использую фреймворк или есть прямой способ добиться этого?

1 Ответ

5 голосов
/ 13 июля 2011

Кажется, вы не понимаете, как применить MVC к вашей структуре.Представьте это следующим образом:

Контроллеры представляют некоторые аспекты вашего приложения, с которыми пользователи могут взаимодействовать.Например, у меня может быть контроллер items, который позволяет пользователям создавать, читать, обновлять или удалять items.Вся логика взаимодействия с items обрабатывается этим контроллером (то есть он вызывает модель items и отображает необходимые представления).

В вашем случае это звучит так, как будто вы строите контроллер pagesэто обрабатывает отображение контента для определенных страниц, которые пользователь может вызвать.Таким образом, ваш контроллер может выглядеть примерно так:

class Page extends CI_Controller {

    public function index()
    {
        // Logic to render home page
    }

        public function about()
    {
        // Logic to render the about page
    }

    //  ... etc ...

Представления могут быть немного сложнее, когда вы имеете дело со сложными сайтами, которые перекрываются.Один из самых полезных приемов, которые я обнаружил на этом пути, - использование библиотеки библиотек для уменьшения избыточности.Это тот, который я использую все время: http://williamsconcepts.com/ci/codeigniter/libraries/template/reference.html.Используя библиотеку шаблонов, вы можете легко определить макет, который включает в себя ваш верхний и нижний колонтитулы, а затем просто передать часть для содержимого, которое вы хотите отобразить.

Когда вы хотите разобраться с логикой в ​​чем-то вроде меню,все, что вам нужно сделать, это передать переменную с именем страницы, а затем выполнить базовый PHP-рендеринг меню.

// Say we pass in a variable called $current to our view
// $current contains the name of the current page
// So say $current = 'About' for this example.


$sitemenu = array(
    array('/', 'Home'),
    array('/about', 'About'),
    array('/help', 'Page 2'),
    array('/contact', 'Page 3')
); ?>
<nav>
  <ul>
  <?php foreach( $sitemenu as $page) { ?>
     <?php if($current == $page[1]) { ?>
         <li class="current"><a href="<?php echo $page[0]; ?>"><?php echo $page[1]; ?></a></li>
     <?php } else { ?>
         <li><a href="<?php echo $page[0]; ?>"><?php echo $page[1]; ?></a></li>
     <?php } ?>
  <?php } ?>
  </ul>
</nav>

Надеюсь, это поможет!

...