parser

Текстовый скроллер

Автор: Misha v.3 [16 августа 2008]
Версия: 1.14
Тэги: SQL

Предлагаемый вашему вниманию скроллер это фактически то, что вы можете видеть в форуме на данном сайте.

Этот скроллер не имеет столь гибких и многообразных настроек как предыдущий, зато имеет некоторые специфические настройки и сразу вычисляет offset необходимый для получения от SQL сервера записей, которые находятся на текущей странице.

Перед использованием скроллера сначала необходимо узнать, сколько записей мы будет отображать постранично, что в применении к новостному разделу сайта может выглядеть примерно так:

$iNewsCount(^pSQL.int{
	SELECT
		COUNT(*)
	FROM
		news
	WHERE
		is_published = 1
})

Теперь мы можем создать объект-скроллер и вывести постраничную навигацию (не забыв подключить scroller.p с помощью @USE):

$iItemsPerPage(20)
$oPage[^scroller::init[$iNewsCount;$iItemsPerPage;page]]
^oPage.print[
	$.target_url[/news/]
	$.nav_count(9)
	$.mode[html]
]

И наконец мы можем получить список новостей, находящихся на текущей странице и вывести их:

$tNews[^pSQL.table{
	SELECT
		news_id AS id,
		title,
		^pSQL.date_format[dt;%d.%m.%Y] AS dt
	FROM
		news
	ORDER BY
		news.dt DESC
}[
	$.offset($oPage.offset)
	$.limit($oPage.limit)
]]
<ul>
^tNews.menu{
	<li><b>$tNews.dt</b>
	<br /><a href="/news/?id=$tNews.id">$tNews.title</a></li>
}
</ul>

Вуаля.

Да, чуть не забыл… Пару слов про его «специфические» настройки… Фактически такая настройка одна (direction). Можно сказать конструктору, что мы хотим, чтобы самая последняя (а не первая) страница у нас имела номер 1. Для чего это надо? Ну представьте, что у нас есть форум (страница с новостями, гостевая книга и т.д.) где у нас постоянно добавляются данные. И было-бы очень хорошо, чтобы страница с ?page=1 всегда содержала одни и те-же данные, не зависимо от того, сколько записей добавилось… Вот с помощью параметра direction эта задача и решается (конструктору надо передать значение -1).

При разбиении на страницы с параметром direction=-1 следует иметь ввиду, что на страницах 1 и 2 (но не с page=1 и page=2) информация частично пересекается. Это не баг, это фича. Происходит это из-за того, что заполнение страниц происходит с конца, т.е. последняя страница (у которой page=1) заполнена полностью, предпоследняя - тоже и т.д. до первой страницы. Но на первой странице нужно вывести остаток сообщений. При этом иногда может получиться, что этот остаток равен одному сообщению. И чтобы не выводить на первой странице одно сообшение, на ней выводятся последние добавленные корневые сообщения. Это жертва, на которую приходится идти для того, чтобы страница с определенным url (например ./?page=1) всегда содержала одни и те же сообщения (например для правильной индексации поисковиками).

P.S. Для того, чтобы понять что означает $pSQL в примере, необходимо ознакомиться со статьей о переноcимости SQL запросов, скачать и подключить в auto.p один из упомянутых в ней sql-классов. Класс скроллера никаких запросов не делает, и $pSQL не использует.

Скачать:

scroller.zip (16.08.2005  2,1 КБ)
Архив файла с классом скроллера. Комментарии внутри.