Тег <active_record:fetch> шаблонизатора поддерживает установку порядка сортировки записей прямо из шаблона, например:
<active_record:fetch using='src/model/News' target='news' navigator='pager' order='date=DESC'/>
Есть еще один способ задания сортировки - это изменить класс News:
class News extends lmbActiveRecord { protected $_default_sort_params = array('date' => 'DESC'); }
Атрибут класс lmbActiveRecord :: $_default_sort_params позволяет указать параметры сортировки, которые будут применяться по-умолчанию, если не указаны другие параметры. Если бы мы указали в шаблоне другие параметры сортировки, тогда значение $_default_sort_params будет игнорироваться.
Знание способа установки сортировки позволит нам вывести последние несколько новостей на главной странице.
Для этого создадим в папке template/main_page/ шаблон display.html следующего содержания:
<core:WRAP file="page.html" in="page_placeholder"> <h1>Main page</h1> <active_record:fetch using='src/model/News' target="last_news" order='date=DESC' limit='3'/> <list:LIST id="last_news"> <list:ITEM> <table> <tr> <td>{$date}</td> <td>{$title}</td> </tr> <tr> <td colspan='2'>{$annotation} <route_url params='controller:news,action:detail,id:{$id}'>more...</route_url> </td> </tr> </table> <hr/> </list:ITEM> <route_url params='controller:news'>all news...</route_url> </list:LIST> </core:wrap>
Обратите внимание на новый атрибут тега <active_record:fetch> limit. При помощи этого атрибута, а также offset, где это необходимо, можно указывать ограничения на размер выборки объектов из базы данных. На главной странице мы будем выводить только 3 самые свежие новости.
При помощи строки
<route_url params='controller:news,action:detail,id:{$id}'>more...</route_url>
мы вывели ссылки на страницы с подробным описание новости.
Теперь осталось только добавить контроллер главной страницы src/controller/MainPageController.class.php:
<?php lmb_require('limb/web_app/src/controller/lmbController.class.php'); class MainPageController extends lmbController { } ?>
Для создания страницы детального описания новости нам необходимо будет создать еще один шаблон template/news/detail.html:
<core:WRAP file="page.html" in="page_placeholder"> <active_record:fetch using='src/model/News' target="current_news" first="true"> <fetch:params record_id='{$#request.id}'/> </active_record:fetch> <core:DATASOURCE id='current_news'> <h1>{$title}</h1> <b>Date</b> : {$date}<br/> {$content|raw} </core:DATASOURCE> </core:wrap>
Обратите внимание на атрибут first тега <active_record:fetch>, который указывает что необходимо получить не список объектов, а только один объект. В качестве контейнера данных, который будет принимать загруженный объект новости выступает тег <core:datasource>.
При помощи тега <fetch:params> мы задаем дополнительные параметры для тега <active_record:fetch>, в частности, указываем идентификатор записи, который необходимо загрузить.
Значение идентификатора объекта новости мы берем из глобального контейнера (при помощи модификатора # в выражении {$#request.id}) данных шаблона, в котором по-умолчанию в переменной request находится все данные, что пришли в запросе к приложению.
Также надо сделать возможность детального просмотра на странице списка всех новостей, для этого подкорректируем шаблон template/news/display.html:
[...] <tr> <td colspan='4'> {$annotation} <route_url params='controller:news,action:detail,id:{$id}'>more...</route_url> </td> </tr> [...]
Обсуждение