CodeIgniter загружает контроллер из представления

#php #codeigniter

#php #codeigniter

Вопрос:

Есть ли способ загрузить контроллер из представления?

Вот что я имею в виду.. Я хочу использовать одно представление несколько раз, но это представление загружается отдельным контроллером, который предоставляет представление, информацию из базы данных.Итак, из-за этой информации из модели я не могу просто установить $this-load->view(); и т.д. Есть ли способ сделать это, или есть способ получше?

Комментарии:

1. Можете ли вы привести пример кода вашего сайта / что он делает?

Ответ №1:

Я думаю, что многие сайты сталкиваются с подобными проблемами, включая тот, над которым я работаю, который загружает одно и то же содержимое БД на боковую панель почти на каждой странице сайта. Я реализовал это с помощью комбинации библиотеки и помощника:

  1. Поместите логику данных в библиотеку (моя называется common.php ). В дополнение к взаимодействию с базой данных, вы можете захотеть, чтобы библиотека сохраняла данные в локальной переменной на случай, если вы захотите ссылаться на нее несколько раз при одной загрузке.
     public function get_total_items()
    {
        if ($this->_total_items === NULL)
        {
            $row = $this->ci->db->query("SELECT COUNT(*) FROM items")->row();
            $this->_total_items = $row[0];
        }
        return $this->_total_items;
    }
      
  2. Создайте помощник для загрузки библиотеки. (Не загружайте библиотеки в представлении!) У меня есть MY_text_helper, который загружает библиотеку и возвращает данные:

     function total_items()
    {
        $CI =amp; get_instance();
        return $CI->common->get_total_items();
    }  

  3. Вызовите вспомогательную функцию из представления.

     <p> Total items: <?php echo total_items(); ?> </p>  

Комментарии:

1. Интересный способ сделать это, он кажется очень похожим на wordpress и не очень на codeigniter. Если у вас много разных файлов, все они включают эту библиотеку и обращаются к ней; вероятно, вы делаете это неправильно, особенно при создании боковой панели. Вместо этого они должны быть обернуты в контроллер шаблона.

2. Я не уверен, что понимаю «wordpress-ish» против «codeigniter-y», но я всегда открыт для лучших предложений по включению моего sidebar.php заглушка в любом представлении, без репликации кода на всех контроллерах. (Кроме того, каким был бы «контроллер шаблонов» в среде MVC? Вы имеете в виду создание оболочки MY_Controller, которая обрабатывает логику?)

3. Привет. Спасибо за руководство. Мне просто нужно знать, почему я должен загружать как библиотеку, так и помощник. Большое спасибо.

Ответ №2:

Проще говоря, вы не можете и не должны загружать контроллер из представления. Это печально, я понимаю ваше разочарование, потому что вы хотите повторно использовать логику вытягивания / действия модели в контроллере в нескольких представлениях.

Существуют различные способы сделать это;

  1. Повторно используйте модели.Ваши модели должны быть очень простыми в выборе данных и должны быть изящными, но если вы делаете одно и то же снова и снова, это кажется глупым. В этом случае…

  2. Используйте контроллер в качестве «основного контейнера» и extend используйте на нем любую логику, которая вам нужна. Таким образом, вы в основном используете контроллер в качестве шаблона, который извлекает данные из модели, загружает соответствующее представление.

Ответ №3:

MVC таким образом не работает… Просто повторно используйте модель — вот почему она отделена от контроллера. Если это не соответствует вашим потребностям, вам, вероятно, следует реализовать библиотеку, которая выполняет логику.

Комментарии:

1. Да, я знаю, но просто спрашиваю.. это не проблема со многими реализациями view, но это длиннее. И библиотека может быть ответом 🙂

Ответ №4:

Я бы использовал библиотеку.

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

Ответ №5:

просто сделайте это, если ваш контроллер с именем controller1 просто так помещает ссылку в представление

http://your-site.com/index.php/controller1/

если вам нужна конкретная функция, добавьте ее в свой URL

http://your-site.com/index.php/controller1/myfunction

вот и все