#php #codeigniter
#php #codeigniter
Вопрос:
Есть ли способ загрузить контроллер из представления?
Вот что я имею в виду.. Я хочу использовать одно представление несколько раз, но это представление загружается отдельным контроллером, который предоставляет представление, информацию из базы данных.Итак, из-за этой информации из модели я не могу просто установить $this-load->view();
и т.д. Есть ли способ сделать это, или есть способ получше?
Комментарии:
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; }
-
Создайте помощник для загрузки библиотеки. (Не загружайте библиотеки в представлении!) У меня есть MY_text_helper, который загружает библиотеку и возвращает данные:
function total_items() { $CI =amp; get_instance(); return $CI->common->get_total_items(); }
-
Вызовите вспомогательную функцию из представления.
<p> Total items: <?php echo total_items(); ?> </p>
Комментарии:
1. Интересный способ сделать это, он кажется очень похожим на wordpress и не очень на codeigniter. Если у вас много разных файлов, все они включают эту библиотеку и обращаются к ней; вероятно, вы делаете это неправильно, особенно при создании боковой панели. Вместо этого они должны быть обернуты в контроллер шаблона.
2. Я не уверен, что понимаю «wordpress-ish» против «codeigniter-y», но я всегда открыт для лучших предложений по включению моего sidebar.php заглушка в любом представлении, без репликации кода на всех контроллерах. (Кроме того, каким был бы «контроллер шаблонов» в среде MVC? Вы имеете в виду создание оболочки MY_Controller, которая обрабатывает логику?)
3. Привет. Спасибо за руководство. Мне просто нужно знать, почему я должен загружать как библиотеку, так и помощник. Большое спасибо.
Ответ №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
вот и все