====== Шаг4. Оптимизация шаблонов. Добавление постраничного вывода ====== ===== Вынесение шаблонов form_fields.phtml и form_errors.phtml из шаблонов форм ===== Поля формы и ошибки валидации в шаблонах template/news/create.phtml и template/news/edit.phtml выводятся полностью одинаково. Воспользуемся тегом [[limb3:ru:packages:macro:tags:core_tags:include_tag| {{include}}]], который является как бы аналогом функции include PHP. Создадим шаблон template/news/form_fields.phtml следующего содержания: {{label for="title"}}Title{{/label}} : {{input name='title' type='text' size='60' title='Title'/}}
{{label for="date"}}Date{{/label}} : {{input name='date' type='text' size='15' title='Date'/}}
{{label for="annotation"}}Annotation{{/label}} : {{textarea name='annotation' rows='2' cols='40' title='Annotation'/}}
{{label for="content"}}Content{{/label}} : {{textarea name='content' rows='5' cols='40'/}}
Теперь шаблон template/news/form_errors.phtml следующего содержания: {{form:errors to='$fields_errors'/}} {{list using='$fields_errors' as="$error"}}
This fields contained errors
    {{list:item}}
  1. {$error.message}
  2. {{/list:item}}
{{/list}}
Теперь эти шаблоны подключаем в наши template/news/create.phtml и template/news/edit.phtml: Limb3 tutorial

Create news

{{form id='news_form' name='news_form' method='post'}} {{include file="news/form_errors.phtml" /}} {{include file="news/form_fields.phtml" /}} {{input type='submit' value='Create'/}} {{/form}}
и Limb3 tutorial

Edit news

{{form id='news_form' name='news_form' method='post'}} {{include file="news/form_errors.phtml" /}} {{include file="news/form_fields.phtml" /}} {{input type='submit' value='Edit'/}} {{/form}}
Обратите внимание на использование тега [[limb3:ru:packages:macro:tags:core_tags:include_tag| {{include}}]]. Атрибут **file** указывает на относительное имя шаблона (относительно папки template), который нужно включить в шаблон вместо тега. Что ж, уже лучше, но можно сделать еще компактнее. ===== Выделение общего базового шаблона page.phtml ===== Код в шаблонах create.phtml и edit.phtml до формы и после нее повторяется дважды. В других шаблонных системах мы сделали бы еще 2 шаблона: header.phtml и footer.phtml, но в MACRO есть средства намного лучше. Подход header/footer имеет большой недостаток в том, что разбивает базовый шаблон на 2 составляющие, которые усложняют общее понимание шаблона в целом. При помощи MACRO этот недостаток можно обойти. Воспользуемся тегом [[limb3:ru:packages:macro:tags:core_tags:wrap_tag| {{wrap}}]], который позволяет вставлять содержимое тега внуть другого шаблона, то есть как бы обворачивать один шаблон другим. Но для начала выделим шаблон template/page.phtml следующего содержимого: Limb3 tutorial {{slot id="page_placeholder"/}} Обратите внимание на тег [[limb3:ru:packages:macro:tags:core_tags:slot_tag| {{slot}}]] - при помощи этого тега мы декларируем место, в которое может быть вставлен другой шаблон. Теперь изменим наши шаблоны create.phtml и edit.phtml следующим образом: {{wrap with="page.phtml" into="page_placeholder"}}

Create news

{{form id='news_form' name='news_form' method='post'}} {{include file="news/form_errors.phtml" /}} {{include file="news/form_fields.phtml" /}} {{input type='submit' value='Create'/}} {{/form}} {{/wrap}}
и {{wrap with="page.phtml" into="page_placeholder"}}

Edit news

{{form id='news_form' name='news_form' method='post'}} {{include file="news/form_errors.phtml" /}} {{include file="news/form_fields.phtml" /}} {{input type='submit' value='Edit'/}} {{/form}} {{/wrap}}
Тег [[limb3:ru:packages:macro:tags:core_tags:wrap_tag| {{wrap}}]] имеет атрибуты **with**, указывающий на относительное имя файла, в какой шаблон делать вставку, и **into**, который указывает, в какое место этого шаблона нужно её делать. Тег [[limb3:ru:packages:macro:tags:core_tags:wrap_tag| {{wrap}}]] имеет обязательный закрывающий тег, который как бы отмечает зону, которая должна быть обвернута в другой шаблон. На самом деле тег [[limb3:ru:packages:macro:tags:core_tags:wrap_tag| {{wrap}}]] дает очень широкий простор для разбиения шаблонов, однако эти возможности и принципы их использования выходят за рамки данного примера. Обвернуть шаблон news/display.phtml с помощью [[limb3:ru:packages:macro:tags:core_tags:wrap_tag| {{wrap}}]] мы оставляем вам возможность самостоятельно. ===== Добавление постраничного вывода ===== Список новостей может быть слишком большим для отображения на одной странице. В этом случае обычно применяют разбиение списка на страницы (пейджинация). При помощи MACRO сделать разбиение на страницы проще простого. Создадим шаблон template/pager.phtml следующего содержимого: {{paginate iterator='$this->news' pager='pager'/}} {{pager id="pager" items="3"}} total items : {$total_items}. shown: from {$begin_item_number} to {$end_item_number} {{pager:first}}first{{/pager:first}} {{pager:list}} {{pager:current}}{$number}{{/pager:current}} {{pager:number}}{$number}{{/pager:number}} {{pager:separator}}-{{/pager:separator}} {{/pager:list}} {{pager:last}}last{{/pager:last}} {{/pager}} Центральный тег при постраничном разбиении - [[limb3:ru:packages:macro:tags:pager_tags:paginate_tag| {{paginate/}}]], собственно он и разбивает список на страницы. Он содержит атрибут **iterator**, который указывает на переменную, содержащую список для разбиения на страницы, а так же атрибут **pager**, указывающий на ID тега [[limb3:ru:packages:macro:tags:pager_tags:pager_tag| {{pager}}]], который будет отображать постраничную навигацию. Тег [[limb3:ru:packages:macro:tags:pager_tags:pager_tag| {{pager}}]] содержит **items**, указывающий какое количество элементов списка выводить на одной странице. Остальными тегами выводятся ссылки на первую (тег [[limb3:ru:packages:macro:tags:pager_tags:pager_frontier_tag| {{pager::first}}]]), предыдущую(тег [[limb3:ru:packages:macro:tags:pager_tags:pager_frontier_tag| {{pager:prev}}]]), текущую (тег [[limb3:ru:packages:macro:tags:pager_tags:pager_current_tag| {{pager:current}}]]), следующую(тег [[limb3:ru:packages:macro:tags:pager_tags:pager_frontier_tag| {{pager:next}}]]) и последнюю(тег [[limb3:ru:packages:macro:tags:pager_tags:pager_frontier_tag| {{pager:last}}]]) страницы, а также на некоторое количество страниц в середине (тег [[limb3:ru:packages:macro:tags:pager_tags:pager_number_tag| {{pager:number}}]]). Также при помощи выражений {$total_items}, {$begin_item_number} и {$end_item_number}, которые по-умолчанию поддерживаются внутри тега [[limb3:ru:packages:macro:tags:pager_tags:pager_tag| {{pager}}]] мы выводим общее количество элементов в списке, а также номера элементов, с которого начинается текущая страница и которым заканчивается текущая страница. Теперь необходимо этот шаблон подключить на странице отображения списка новостей и связать список новостей с пейджером. Вот новый вид шаблона template/news/display.phtml (вы ведь использовали здесь тег [[limb3:ru:packages:macro:tags:core_tags:wrap_tag| {{wrap}}]], как и в шаблонах форм?): {{wrap with="page.phtml" into="page_placeholder"}}

Newsline

Create news

{{include file='pager.phtml' /}} {{list using="$#news" as="$item"}} {{list:item}} {{/list:item}}
ID Date Title Actions
{$item.id} {$item.date} {$item.title} Edit   Delete
{$item.annotation}
{{/list}} {{/wrap}}
Если вы все сделали правильно, тогда у вас должно получиться нечто подобное этому: {{{:limb3:ru:tutorials:basic:main_page.png|:limb3:ru:tutorials:basic:main_page.png}}} ===== Что дальше? ===== Далее: [[step5|Шаг5. Финальные штрихи(сортировка, отображение новости целиком, пять свежих новостей на главной странице).]]