2009-04-19 2 views
5

В CodeIgniter или ядре PHP; есть ли эквивалент партитур Rails и шаблонов?CodeIgniter или эквивалент PHP Rails Partials and Templates

Частично разрешить мне визуализировать фрагмент другого вида внутри моего представления. Я мог бы иметь общий вид navbar.php, который я мог бы указать на внутренний вид homepage.php. Шаблоны определяли бы общую оболочку HTML-страницы в одном месте и позволяли каждому виду просто заполнять тело.

Ближайшая вещь, которую я мог найти в документации CodeIgniter, - Loading multiple views, где в контроллере последовательно отображаются несколько представлений. Кажется странным диктовать визуальный внешний вид моей страницы внутри контроллера. (т. е. для перемещения навигатора мой дизайнер должен будет отредактировать контроллер).

Я искал в стеке переполнение для способа PHP для этого. Я нашел this page, в котором говорится о моделировании партитур с ob_start. Это рекомендуемый подход внутри CodeIgniter?

+0

попытка глазными: http://codeigniter.com/wiki/Ocular_Layout_Library/ – Geshan

ответ

13

Возможно, я нарушаю правило MVC, но я всегда просто размещал свои «фрагменты» в отдельных представлениях и загружал их, стиль CodeIgniter, из других видов, которые в них нуждаются. Практически все мои взгляды загрузить представление верхнего и нижнего колонтитула в верхней и нижней части, соответственно:

<? $this->load->view("header"); ?> 
//Page content... 
<? $this->load->view("footer"); ?> 

Заголовок затем может включать в себя NavBar в той же манере, и т.д.

+1

Это путь для частичных, не требующих собственных данных. Но в случае частичных представлений, требующих данных («виджетов»), что-то вроде сторонних «Модульных расширений HMVC» является хорошим выбором. – rick

+0

Я думаю, что это самый простой способ рендеринга частичных. Убедитесь, что вы помещаете функцию '$ this-> load-> view()' в файл ** просмотра **, а не в контроллер (через ключ массива '$ data'), потому что это будет просто повторять это. – hohner

0

Это, к сожалению, совсем не CodeIgniter, но я предлагаю вам взглянуть на систему шаблонов Savant3. Он позволяет отображать шаблон в строке. Тогда вы можете просто прикрепить его туда, где хотите.

Возможно, в CodeIgniter есть что-то подобное?

Я могу придумать способ добавления объекта при визуализации представления, визуализации шаблона, а затем всего содержащегося в нем подматрица.

3

В PHP вы будете использовать include

+0

я не знаю, если это именно то, что ОП просит. Я считаю, что он запускает прилагаемый файл в момент оценки; OP запрашивает включение стиля Rails (сначала включается первый файл, IIRC, затем компонованный позже). Это имеет большое значение, когда вы делаете такие вещи, как выбор шаблона страницы на основе того, что происходит на странице/частичном/просмотре-содержимом. –

5

это по существу то, что я использую:

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

+4

экстракт ($ locals); – Mario

+0

jeej i tkRenderPartial() много себя;) +1 – Ropstah

2

я обнаружил, что переход от Рельсы к 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) 
    ) 
); 

Лично я предпочитаю использовать вид Конфигурационными вместо ob_start, но это я =) PS: При загрузке просмотров , первым аргументом является имя представления, второе - параметры, которые должны быть переданы в представление, а третий - это флаг «ECHO», который в основном сообщает CI, следует ли его напрямую отображать или возвращать значение представления, а именно в основном то, что я сделал в этом примере.

Я не думаю, что это хорошее решение, но оно работает для меня. У кого-то есть лучшие решения?

+0

Я не верю, что вы могли бы использовать 'ob_start()' в контроллере, потому что 'CI_Loader' использует его при загрузке представлений. Таким образом, вы получите ошибку. Лучше использовать представление '$ this-> load-> ('view_name', $ data, true);' метод для возврата визуализированного представления в виде строки. – sholsinger

2

Этот недавно выпущенный Template library работает таким образом.

Эта библиотека шаблонов также отлично сочетается с моим Dwoo implementation, который придаст вашим взглядам гораздо больше мощности.

0

Вы можете проверить это, для обертонов и шаблон

http://code.google.com/p/ocular/wiki/Introduction