После того, как мы обозначили, где в шаблонах дизайна мы собираемся выводить ленты новостей, нам необходимо определить то, каким образом мы будем отображать новости, — то есть оформить результаты работы макросов.
Результатом работы макроса %news lastlist()%, в случае успешного завершения, является вывод блока lastlist_block заданного шаблона. Этот блок отвечает за отображение всего списка в целом, а вид отдельных элементов списка мы определим далее. Оформим этот блок в шаблоне в соответствии с нашими задачами:
файл ~/tpls/news/home.tpl
$FORMS['lastlist_block'] = <<<END
<div id="news" class="block">
<h2>Новости и публикации</h2>
<hr/>
</div>
END;
Для того, чтобы указать макросу, куда нужно вывести список новостей, используется локальный макрос %items%. Здесь этот макрос поочередно вставляет каждую новость, из списка последних новостей запрошенной ленты. Для оформления отдельной новости используется блок lastlist_item, в котором задается то, как будет выглядеть каждый отдельный элемент списка новостей. Поэтому мы модифицируем файл шаблона следующим образом — указываем макросом %items% место, где будет отображен список, и добавляем в шаблон оформление блока lastlist_item:
файл ~/tpls/news/home.tpl
$FORMS['lastlist_block'] = <<<END
<div id="news" class="block">
<h2>Новости и публикации</h2>
%items%
<hr/>
</div>
END;
$FORMS['lastlist_item'] = <<<END
<div class="item">
<span class="date">
</span> |
<a href="#ссылка_на_ленту">
</a>
<a href="#ссылка_на_новость" class="title">
</a>
<div>
</div>
<div class="comments">
<a href="#ссылка_на_все_комментарии" >
</a> |
<a href="#ссылка_на_добавление_комментария">
</a>
</div>
</div>
END;
Рассмотрим поля блока lastlist_item по порядку:
-
Дата публикации новости. Для вывода этого поля воспользуемся макросом %publish_time%, который на этом уровне (в блоке lastlist_item) вернет значение соответствующего поля для конкретной новости. Этот макрос возвращает дату в формате UNIX TIMESTAMP, поэтому для конвертации нам понадобится системный макрос %system convertDate()%.
Заменяем комментарий на %system convertDate(%publish_time%, 'd.m.Y')%
-
Название ленты и ссылка на всю ленту, содержащую данную новость. Воспользуемся локальными макросами модуля "Новости" — %lent_name% и %lent_link%, подставив их в соответствующие места кода:
<a href="%lent_link%">%lent_name%</a>
-
Ссылка на полный текст новости и заголовок новости. Для получения ссылки на текущий объект, являющийся страницей (в данном случае это страница с полным текстом новости), воспользуемся макросом %link%. Аналогично, для получения заголовка объекта-страницы существует макрос %header%:
<a href="%link%" class="title">%header%</a>
-
Html-код картинки анонса новости. Для того, чтобы картинки анонсов были одинаковых размеров, воспользуемся макросом %system makeThumbnail()%. Оформим для этого макроса свой собственный шаблон, так чтобы у нас была возможность указать нужные нам стили:
файл
~/tpls/thumbs/news.anons.tpl
<?php $FORMS = Array(); $FORMS['image'] = <<<END <img src="%src%" width="%width%" height="%height%" style="border: #777 1px solid;" class="preview" /> END; ?>
Значения, которые будут подставлены вместо %src%, %width% и %height% мы передадим через параметры макроса %system makeThumbnail()%:
%system makeThumbnail('path_to_anons_pic', '50', '50', 'news.anons')%
Таким образом мы задаем ширину и высоту равную 50px, и нам осталось передать параметр path_to_anons_pic, указывающий путь к картинке анонса, для каждой конкретной новости из списка.
Для получения этого параметра воспользуемся макросом %data getProperty()% модуля шаблоны данных. Передадим специальным макросом %id% id текущей новости и запросим значение интересующего поля с идентификатором anons_pic. Локальный макрос %filepath% (см. описание блока file макроса %data getProperty()%) позволяет получить путь к файлу картинки анонса. Поскольку у нас стоит задача передать этот путь макросу %system makeThumbnail()% — оформим нужным образом шаблон для макроса %data getProperty()%:
файл
~/tpls/data/news.anons.home.tpl
<?php $FORMS = Array(); $FORMS['img_file'] = <<<END %system makeThumbnail('%filepath%', '50', '50', 'news.anons')% END; ?>
В итоге, вызов макроса в шаблоне
~/tpls/news/home.tpl
будет выглядеть следующим образом:%data getProperty(%id%, 'anons_pic', 'news.anons.home')%
-
Текст анонса новости. Макрос %anons% в этом блоке выведет нужное нам поле на странице. Подставляем в шаблон:
<div>%anons%</div>
-
Комментарии, число комментариев и ссылка на добавление комментариев. Для отображения числа комментариев к текущей новости мы можем воспользоваться макросом %comments countComments()% модуля "Комментарии", которому мы передадим id текущей новости макросом %id%. Воспользуемся якорями для быстрого перемещения к списку комментариев и к полю добавления нового комментария на странице просмотра полного текста новости. Ссылку на полный текст новости мы получим макросом %link%, а якоря уже включены в шаблон
~/tpl/comments/default.tpl
(см. описание блоков comments_block и comments_block_line шаблона модуля "Комментарии"). Нас интересуют следующие якоря: #comments и #add_comment.Оформим ссылку просмотра комментариев:
<a href="%link%#comments">Комментарии (%comments countComments(%id%)%)</a> |
И ссылку на добавление комментария:
<a href="%link%#add_comment">Добавить комментарий</a>
Итак, если внести все замены в блоке lastlist_item в шаблон ~/tpls/news/home.tpl
, то этот блок будет выглядеть следующим образом:
$FORMS['lastlist_item'] = <<<END
<div class="item">
<span class="date">
%system convertDate(%publish_time%, d.m.Y)%
</span> |
<a href="%lent_link%">%lent_name%</a>
<a href="%link%" class="title">%header%</a>
%data getProperty(%id%, 'anons_pic', 'news.anons.home')%
<div>
%anons%
</div>
<div class="comments">
<a href="%link%#comments" >Комментарии (%comments countComments(%id%)%)</a> |
<a href="%link%#add_comment">Добавить комментарий</a>
</div>
</div>
END;
Для отображения этой ссылки существует локальный макрос %archive% модуля "Новости" — этот макрос выводит содержимое блока lastlist_archive. Подставим макрос в нужное место и оформим соответствующий блок в шаблоне ~/tpls/news/home.tpl
:
$FORMS['lastlist_archive'] = <<<END
<a id="archive" href="%archive_link%">Архив новостей</a>
END;
Для подписки по rss существует одноименный метод модуля "Шаблоны данных". Вызов метода можно осуществить непосредственно из url, указав идентификатор ленты при помощи макроса %id%:
<a id="rss" href="/data/rss/%id%/">RSS</a>
Для подписки по e-mail существует отдельный модуль "Рассылки", который для вывода формы подписки использует макрос %dispatches subscribe()%. Оформим нужным образом отдельный шаблон для отображения результатов работы этого макроса:
файл ~/tpls/dispatches/home.tpl
:
<?php
$FORMS = Array();
$FORMS['subscribe_unregistred_user'] = <<<END
<form method="post" name="sbs_frm" enctype="multipart/form-data" action="%pre_lang%/dispatches/subscribe_do/">
<label for="subscribe">
<div>Подписка на новости:</div>
</label>
<input name="sbs_mail" id="subscribe" class="textinputs" type="text" value="Введите E-mail" onfocus="if (this.value == 'Введите E-mail') this.value=''" onblur="if (!this.value.length) this.value='Введите E-mail';" />
<input type="submit" value="Ok"/>
</form>
END;
$FORMS['subscribe_registred_user'] = <<<END
<form method="post" name="sbs_frm" enctype="multipart/form-data" action="%pre_lang%/dispatches/subscribe_do/">
<label for="subscribe">
<div>Вы подписаны на рассылки:</div>
</label>
%subscriber_dispatches%
<input type="submit" value="Ok"/>
</form>
END;
$FORMS['subscriber_dispatches'] = <<<END
<table border="0" cellpadding="0" cellspacing="2">
%rows%
</table>
END;
$FORMS['subscriber_dispatch_row'] = <<<END
<tr>
<td>
<input type="checkbox" %checked% name="subscriber_dispatches[]" value="%disp_id%" />
<span>
%disp_name%
</span>
</td>
</tr>
END;
?>
Блок subscribe_unregistred_user отвечает за отображение формы для незарегистрированных пользователей, а subscribe_registred_user с двумя вложенными блоками subscriber_dispatches и subscriber_dispatch_row — за отображение формы и списка существующих подписок для текущего зарегистрированного пользователя. Подробнее с работой макроса %dispatches subscribe()% и его блоков можно ознакомиться в соответствующей главе этой документации.
файл ~/tpls/news/home.tpl
<?php
$FORMS = Array();
$FORMS['lastlist_block'] = <<<END
<div id="news" class="block">
<h2>Новости и публикации</h2>
%items%
<hr/>
%archive%
<a id="rss" href="/data/rss/%id%/">RSS</a>
%dispatches subscribe('home')%
</div>
END;
$FORMS['lastlist_item'] = <<<END
<div class="item">
<span class="date">
%system convertDate(%publish_time%, d.m.Y)%
</span> |
<a href="%lent_link%">%lent_name%</a>
<a href="%link%" class="title">%header%</a>
%data getProperty(%id%, 'anons_pic', 'news.anons.home')%
<div>
%anons%
</div>
<div class="comments">
<a href="%link%#comments" >Комментарии (%comments countComments(%id%)%)</a> |
<a href="%link%#add_comment">Добавить комментарий</a>
</div>
</div>
END;
$FORMS['lastlist_archive'] = <<<END
<a id="archive" href="%archive_link%">Архив новостей</a>
END;
?>
Здесь, как и в предыдущем случае, мы используем макрос %news lastlist()%, но уже с другим шаблоном — для внутренних страниц ~/tpls/news/akcii_inner.tpl
. Оформим нужным образом блоки этого шаблона.
файл ~/tpls/news/akcii_inner.tpl
<?php
$FORMS = Array();
$FORMS['lastlist_block'] = <<<END
<div id="promo" class="block">
<h2>%h1%</h2>
%items%
</div>
END;
$FORMS['lastlist_item'] = <<<END
<div class="description">
<h3>%header%</h3>
<p>%anons%</p>
</div>
END;
?>
lastlist_block — отвечает за вывод всей ленты новостей, поэтому макрос %h1% в данном случае выведет поле h1 для ленты (см. Рисунок 8.1, «Организация лент новостей»). Локальный макрос %items% отвечает за вывод отдельных новостей оформленных по блоку lastlist_item. В этом блоке макрос %header% выведет заголовок для отдельной новости, а макрос %anons% отобразит анонс новости.
Как уже было сказано ранее, эти страницы являются обычными внутренним страницами сайта, для которых мы используем шаблон дизайна ~/tpls/content/inner.tpl
. В этом шаблоне макрос %content% выводит результаты работы макроса %news lastlist()% для ленты и результаты работы макроса %news view()% — для страницы полного текста новости. И в том, и в другом случае макросы вызываются с шаблоном по умолчанию ~/tpls/news/default.tpl
.
Оформим для макроса %news lastlist()% блок вывода всей ленты и блок отдельной новости из списка. Для блока вывода всей ленты нам необходимо предусмотреть возможность разбиения списка по страницам — пейджинг. Оформление анонсов сделаем таким же, как и на главной странице (см. «Лента новостей на главной странице сайта»).
файл ~/tpls/news/default.tpl
<?php
$FORMS = Array();
$FORMS['lastlist_block'] = <<<END
<div>
%items%
</div>
END;
$FORMS['lastlist_item'] = <<<END
END;
Локальный макрос %items%, как и в предыдущих примерах, указывает куда выводить список элементов, оформленных по блоку lastlist_item.
Для отображения списка страниц при постраничном выводе существует специальный макрос %system numpages()%, для вывода результатов которого мы создадим свой собственный шаблон:
файл ~/tpls/numpages/standart.tpl
<?php
$FORMS = Array();
$FORMS['pages_block'] = <<<END
<div class="numpage" style="padding-left: 10px;">
<div class="small">
Страницы: %pages%
</div>
</div>
END;
$FORMS['pages_item'] = <<<END
<a href="%link%">
<b>%num%</b>
</a>
%quant%
END;
$FORMS['pages_item_a'] = <<<END
<span class="active_num">%num%</span>
%quant%
END;
$FORMS['pages_quant'] = <<<END
|
END;
$FORMS['pages_block_empty'] = <<<END
<div class="numpage" style="padding-left: 10px;">
</div>
END;
?>
Блок pages_block задает оформление всего списка страниц, где pages_item задает оформление номеров страниц, pages_item_a — оформление текущего номера страницы, pages_quant — разделитель списка номеров. Описание всех блоков шаблона для макроса %system numpages()% можно посмотреть в топике посвященному этому макросу.
Для правильной работы макроса %system numpages()% необходимо передать ему еще 2 параметра: общее количество новостей и количество новостей, выводимых на странице. Для получения общего количества новостей воспользуемся специальным макросом %total%. Для получения количества элементов, выводимых на странице, воспользуемся макросом %per_page%, который в данном случае вернет значение, указанное в настройках модуля "Новости".
В итоге вызов макроса должен выглядеть следующим образом:
%system numpages(%total%, %per_page%, 'standart')%
Для вывода полного текста новости макрос %news view()% использует блок view. Поэтому оформим его в шаблоне ~/tpls/news/default.tpl
с учетом поставленных задач:
$FORMS['view'] = <<<END
END;
Рассмотрим поля блока view по порядку:
-
Стандартизованная картинка к новости. Аналогичная задача уже разбиралась подробно выше, когда мы оформляли вывод стандартизованной картинки для анонса (см. «Список анонсов новостей», вывод html-кода картинки анонса). Поэтому отметим лишь основные шаги.
Воспользуемся макросом %system makeThumbnail()%, которому мы назначим свой собственный шаблон
~/tpls/thumbs/news.view.tpl
:<?php $FORMS = Array(); $FORMS['image'] = <<<END <img src="%src%" width="%width%" height="%height%" border="0" style="border: #777 1px solid;" class="news_photo" /> END; ?>
Для передачи параметров макросу %system makeThumbnail()% воспользуемся макросом %data getProperty()%, для которого оформим свой собственный шаблон
~/tpls/data/news.view.tpl
:<?php $FORMS = Array(); $FORMS['img_file'] = <<<END %system makeThumbnail(%filepath%, '200', 'auto', 'news.view')% END; ?>
Локальный макрос %filepath% передает путь до картинки макросу %system makeThumbnail()%, ширину мы назначаем 200px, параметр auto указывает, что высота задается с сохранением пропорций, и мы указываем шаблон
~/tpl/thumbs/news.view.tpl
В итоге для получения кода картинки мы вызываем в шаблоне
~/tpls/news/default.tpl
следующее:%data getProperty(%id%, 'publish_pic', 'news.view')%
где %id% укажет идентификатор данной новости, publish_pic — это запрос поля "картинка публикации" для данной новости,
~/tpls/data/news.view.tpl
— шаблон с макросом %system makeThumbnail()%, обрабатывающим картинку. -
Полный текст новости. Вывод осуществляется макросом %content%.
-
Блок со списком связанных новостей. Для вывода этого списка существует макрос %news related_links()%. Этот макрос по умолчанию также использует шаблон
~/tpl/news/default.tpl
, с двумя собственными блоками related_block — для оформления списка целиком и related_line — для оформления отдельного элемента списка. Оформим нужным нам образом эти блоки в шаблоне:файл
~/tpl/news/default.tpl
$FORMS['related_block'] = <<<END <div id="related_news" style="margin-top:150px"> <p>Похожие новости:</p> <ul> %related_links% </ul> </div> END; $FORMS['related_line'] = <<<END <li> <a href="%link%"> <b>%name%</b> (%system convertDate(%publish_time%, 'Y-m-d')%) </a> </li> END;
Локальный макрос %related_links% указывает куда выводить элементы списка, оформленные по блоку related_line. Макрос %link% выведет ссылку на связанную новость, а макрос %name% ее заголовок.
Для указания даты публикации воспользуемся уже знакомой конструкцией: макрос %publish_time% отобразит дату публикации (в формате UNIX TIMESTAMP), а макрос%system convertDate()% приведет ее к нужному нам виду.
-
Добавление формы для ввода комментария. Для этого существует макрос модуля "Комментарии" %comments insert()%, которому надо передать %id% новости:
%comments insert(%id%)%
<?php
$FORMS = Array();
$FORMS['lastlist_block'] = <<<END
<div>
%items%
%system numpages(%total%, %per_page%, 'standart')%
</div>
END;
$FORMS['lastlist_item'] = <<<END
<div class="item">
<span class="date">
%system convertDate(%publish_time%, d.m.Y)%
</span> |
<a href="%lent_link%">%lent_name%</a>
<a href="%link%" class="title">%header%</a>
%data getProperty(%id%, 'anons_pic', 'news.anons.home')%
<div>
%anons%
</div>
<div class="comments">
<a href="%link%#comments" >Комментарии (%comments countComments(%id%)%)</a> |
<a href="%link%#add_comment">Добавить комментарий</a>
</div>
</div>
END;
$FORMS['view'] = <<<END
%data getProperty(%id%, 'publish_pic', 'news.view')%
%content%
%news related_links(%id%)%
%comments insert(%id%)%
END;
$FORMS['related_block'] = <<<END
<div id="related_news" style="margin-top:150px">
<p>Похожие новости:</p>
<ul>
%related_links%
</ul>
</div>
END;
$FORMS['related_line'] = <<<END
<li>
<a href="%link%">
<b>%name%</b>
(%system convertDate(%publish_time%, 'Y-m-d')%)
</a>
</li>
END;
?>