В CodeIgniter или ядре PHP; есть ли эквивалент партитур Rails и шаблонов?
Частичное позволило бы мне сделать еще один фрагмент представления внутри моего представления. Я мог бы иметь общее представление navbar.php
которое я мог бы указать на внутреннее представление моей homepage.php
. Шаблоны определяли бы общую оболочку HTML-страницы в одном месте и позволяли каждому виду просто заполнять тело.
Самое близкое, что я мог найти в документации CodeIgniter, – это загрузка нескольких представлений , где последовательно отображаются несколько представлений в контроллере. Кажется странным диктовать визуальный внешний вид моей страницы внутри контроллера. (т. е. для перемещения навигатора мой дизайнер должен будет отредактировать контроллер).
Я искал переполнение стека для PHP-способа для достижения этого. Я нашел эту страницу , в которой говорится об имитации частичных данных с помощью ob_start . Это рекомендуемый подход внутри CodeIgniter?
Я могу нарушить правило MVC, но я всегда просто размещал свои «фрагменты» в отдельных представлениях и загружал их, стиль CodeIgniter, из других видов, которые в них нуждаются. Практически все мои взгляды загружают верхний и нижний верхний и нижний нижние колонтитулы соответственно:
<? $this->load->view( "header" ); ?> //Page content... <? $this->load->view( "footer" ); ?>
Заголовок может затем включать NavBar таким же образом и т. Д.
это по существу то, что я использую:
function render_partial($file, $data = false, $locals = array()) { $contents = ''; foreach($locals AS $key => $value) { ${$key} = $value; } ${$name . '_counter'} = 0; foreach($data AS $object) { ${$name} = $object; ob_start(); include $file; $contents .= ob_get_contents(); ob_end_clean(); ${$name . '_counter'}++; } return $contents; }
это позволяет вам называть что-то вроде:
render_partial('/path/to/person.phtml', array('dennis', 'dee', 'mac', 'charlie'), array('say_hello' => true));
и в /path/to/person.phtml:
<?= if($say_hello) { "Hello, " } ?><?= $person ?> (<?= $person_counter ?>)
это какая-то магия, хотя это может помочь вам лучше понять, что происходит. полный файл: view.class.php
В PHP вы будете использовать include
Я также обнаружил, что перехожу из Rails в CI, и то, что я делал с частичными, в основном делает частичные представления в виде переменной и устанавливает ее из контроллера.
Таким образом, в представлении у вас будет что-то вроде (_partial.php):
<h2>Here Comes The Partials</h2> <?= $some_partials ?>
И вы можете установить его с контроллера, как:
$this->load->view('the_view', array('some_partials', $this->load->view('_partial', array(), TRUE) ) );
Лично я предпочитаю использовать представление CI вместо ob_start, но это me =) PS: при загрузке представлений первый аргумент – это имя представления, второй – параметры, которые нужно передать в представление, а третий – «ECHO», флаг, который в основном сообщает CI, следует ли его напрямую отображать или возвращать значение представления, что в основном является тем, что я сделал в примере.
Я не думаю, что это хорошее решение, но оно работает для меня. У кого-то есть лучшие решения?
Моя недавно выпущенная библиотека шаблонов работает таким образом.
Эта библиотека шаблонов также отлично сочетается с моей реализацией Dwoo, которая придаст вашим взглядам гораздо большую мощность.
Это, к сожалению, совсем не CodeIgniter, но я предлагаю вам взглянуть на систему шаблонов Savant3 . Он позволяет отображать шаблон в строке. Тогда вы можете просто прикрепить его туда, где хотите.
Может быть, в CodeIgniter есть что-то подобное?
Я могу придумать способ добавления объекта при рендеринге представления, визуализации шаблона, а затем всего содержащегося в нем подшаблона.
CodeIgniter и Smarty прекрасно играют вместе.
Вот сообщение в блоге, в котором описывается, как использовать smarty с codeigniter . Также реализована asp.net как masterpage.
Попробуйте Ocular – http://codeigniter.com/wiki/Ocular_Layout_Library/ – его рельсы, вдохновленные библиотекой шаблонов.
Вы можете проверить это, для частичных и шаблонов
http://code.google.com/p/ocular/wiki/Introduction
Symfony делает это с помощью частичной / компонентной настройки.