До сих пор я наслаждался использованием CodeIgniter для создания некоторых простых веб-приложений (на самом деле, просто изучая фреймворк), но я не могу найти простой способ создания блока / модуля.
Я хотел бы иметь блок «Последние изображения», который я могу удалить на любую страницу на сайте, не дублируя запрос в контроллере каждой страницы и передавая его в шаблон с помощью $ vars.
2 вопроса:
Кажется, это должно быть достаточно просто, мне просто нечего верить в правильное решение. Заранее спасибо.
Хорошо, вот мой подход к «виджетам», «модулям», «частичным представлениям» или тому, что вы хотите назвать их. В любом случае мы подразумеваем многоразовые элементы для страниц.
Есть несколько способов сделать это, так что мой путь может быть не для вас – тогда снова это может быть именно то, что вы ищете!
Во-первых, я делаю виджеты в виде представлений, скажем, пути будут такими: views / widgets / myview.php
Я принимаю решение о том, какие виджеты я планирую использовать в своем контроллере. Мой метод заключается в том, чтобы поместить пути к представлениям, которые я хочу в массиве, например:
$data['widgets'] = array('widgets/myview', 'widgets/myview2');
Затем, когда я загружаю свой основной вид (все еще в моем контроллере), я делаю это:
$this->load->view('main_view', $data);
Теперь массив виджетов передается в основное представление.
Затем в моем главном представлении, когда я добираюсь до места, где идут виджеты, я прохожу через свой массив следующим образом:
foreach ($widgets as $widget) { $this->load->view($widget); }
Этот цикл запускается в моем основном представлении. Удобно, что все данные, которые вы передали в основное представление, будут доступны во вложенных вами представлениях.
Я сделал много виджетов в Codeigniter таким образом, и это метод, который я использую в своих CMS.
что вы подразумеваете под частицами? В CodeIgniter нет собственных частичных представлений. Хотя, вы можете $this->load->view()
в представлениях.
Если вы говорите о переменных из контроллера, доступных для всех просмотров, которые вы загрузили, вы должны сделать:
$data['info'] = 'value'; $this->load->vars($data);
$info
будет доступна для всех просмотров, которые вы загружаете.
Обновить:
Вы должны сделать это в своем конструкторе:
class Page extends Controller { function Page() { $this->load->model('page'); $data['images'] = $this->page->get_images(); $this->load->vars($data); // images will now be available to all views } }
Обновление 2:
Должен признать, что я не использовал шаблоны, но это будет работать на всех страницах, созданных вашим контроллером.
Хорошей новостью является то, что CodeIgniter определенно движется в этом направлении. Для начала ознакомьтесь с модульными расширениями от wiredeignz. Его можно найти здесь: https://bitbucket.org/wiredesignz/codeigniter-modular-extensions-hmvc/overview с хорошей документацией, чтобы вы начали. Это может быть идеально для вас, потому что вы можете запустить модуль (т. Е. Вызвать контроллер / метод модуля и вернуть частичный вид) и вставить его в шаблон или глобальный вид или что-то еще. Кроме того, посмотрите на CI 2.0 – https://bitbucket.org/ellislab/codeigniter/overview. Это совсем не так, как в предыдущих версиях codeigniter, и у него много новых функций, которые очень интересны. Хотя в бета-версии это очень, очень стабильно. HMVC написан для работы с CI 2.0.
Кроме того, посмотрите на код для других проектов CI, которые работают таким образом. Я бы порекомендовал pyroCMS от Phil Sturgeon. Он действительно лидирует и написал много интересных статей и сообщений о модуляции и CI 2.0. http://www.philsturgeon.co.uk
Этот способ работы действительно полезен для сохранения отдельных битов сайта независимо, только при необходимости.
Попробовать и помочь вам немного подробнее …
Не забывайте, что вы можете буферизовать вывод, используя дополнительный третий параметр. Если вы не уверены, обратитесь к руководству пользователя.
$partial = $this->load->view('someView', $data, true);