Навигация в новостной ленте
Итак, хранение новостей мы организовали, вывод текста новости на страницу тоже. Что остается? Конечно же, показ анонсов и навигация.
Обычно анонсы последних новостей выносятся на главную страницу. Но это не обязательно, никто нам не помешает сделать такую выноску на любой другой странице. А чтобы у нас был выбор, в маске статуса страницы есть бит 3, который включает на странице выноску новостей. Можно включить хоть на каждой, если это кому-нибудь нужно.
Вопрос навигации решается просто – каждый анонс имеет ссылку на полный текст новости. Можно сделать ссылкой дату публикации, можно сам анонс, можно даже прицепить снизу слова «подробнее» или «полный текст» (но это совершенно ни к чему, нормальный читатель не нуждается в таких подсказках для круглых идиотов).
Но страница не бесконечная, все анонсы недолго смогут на ней помещаться – нужно выводить только последние (скажем, 10 последних) и куда-то девать архив. Эта задача тоже решается просто. Достаточно включить выноску анонсов еще и на странице с текстом новости, но выводить с каждой новостью не последнюю десятку, а анонсы предыдущих десяти новостей. Получаем скользящую навигацию, когда можно «перелистывать» заметки десятками или по одной, как будет удобнее. Блок ссылок для постраничного вывода становится просто ненужным.
Сценарий продумали, приступаем к реализации. Для формирования ссылки на новость нам полезно написать отдельную функцию – как вы помните, формирование ссылок мы делаем разными способами для разных реализаций URL. И функции формирования ссылок складываем в подгружаемую библиотеку, которая выбирается в зависимости от режима. Вот очень простая функция для режима реальных ссылок без ЧПУ – помещаем ее в файл /libs/m_none.inc.php.
function newslink($tstamp) { global $_pageid; return '<a href="main.php?'.$_pageid.'=news&pg='.$tstamp.'">'; }
Глобальная переменная $_pageid у нас содержит название параметра с алиасом страницы (у нас он называется id, но название параметра, как вы помните, мы можем и поменять). А алиас news у нас специально зарезервирован для страниц с полным текстом новости. Ни для чего другого мы его использовать не будем.
Теперь нам нужен скрипт для вывода блока анонсов. Начиная с самой поздней новости, если выноска на главной странице, или начиная с предыдущей, если выноска на странице новости. Этот скрипт мы разместим в файле
<?php // Массив с русскими названиями месяцев $monar=array( 1=>' января ', 2=>' февраля ', 3=>' марта ', 4=>' апреля ', 5=>' мая ', 6=>' июня ', 7=>' июля ', 8=>' августа ', 9=>' сентября ', 10=>' октября ', 11=>' ноября ', 12=>' декабря '); // Строка вывода анонса. Пока она пустая. // Если новостей нет, она и останется пустой $annstr=''; // Проверяем индексный файл (если его нет, то нет и новостей) if (is_file('./'.$newspath.'index.dat')) { // Считываем индексный файл в массив $n_arr=file('./'.$newspath.'index.dat'); // Все остальное стоит делать, если число новостей не нулевое if (!empty($n_arr)){ // Сколько всего новостей? Столько же, сколько элементов массива $nwtotal=count($n_arr); if (empty($pg)) { // Если параметра pg нет, это выноска на главной $nwstart=0; $nwstop=$nwcount; } else { // А если параметр pg не пуст, мы на странице новости // Уточняем идентификатор текущей новости $pg=(int)$pg; // Ищем в массиве начало выноски (это следующая новость) $nwstart=array_search($pg,$n_arr)+1; // Определяем последнюю новость в выноске $nwstop=$nwstart+$nwcount; } // А если осталось меньше новостей, чем нужно в выноске? if ($nwstop > ($nwtotal)) $nwstop=$nwtotal; // Открываем блок выноски $annstr="<div id=news>\n<h2 align=center>Новости</h2>\n"; // Выбираем нужные строки из массива for ($c=$nwstart;$c<$nwstop;$c++) { // Разбиваем строку на дату и анонс $a=explode('|',trim($n_arr[$c])); // Преобразуем дату в массив элементов $cur=getdate($a[0]); // Создаем ссылку на новость $curdate='<p><b>'.newslink($a[0]); // Присоединяем день, название месяца и год $curdate.=$cur['mday'].$monar[$cur['mon']].$cur['year']; // Закрываем ссылку – дата готова $curdate.=" г.</a></b><br>\n"; // Добавляем ссылку и текст анонса в блок выноски $annstr.=$curdate.$a[1]."</p>\n"; } // Закрываем блок выноски $annstr.="</div>\n"; } // Уничтожаем массив анонсов – он нам больше не нужен unset($n_arr); } ?>
Здесь наблюдается тот же массив с наименованиями месяцев, что и в скрипте вывода новости
В результате действий этого скрипта мы получаем переменную $annstr, в которой содержится блок <div id=news> с полностью сформированной выноской. Независимо от того, какой будет верстка шаблона страницы, этот блок можно вставить на отведенное для него место в шаблоне. Естественно, все свойства для этого блока нужно определить в CSS.
А как мы будем его вставлять? Да тоже несложно. Потребуется небольшая доработка главного скрипта main.php. В него нужно добавить определение переменной $ANNOUNCE. Для этого после сборки главного меню и меню раздела в main.php добавляем вот эти строки:
// Проверка и формирование выноски на странице
$ANNOUNCE='';
if (((int)$some & 8) > 0) {
include('libs/announce.inc.php');
$ANNOUNCE.=$annstr;
}
Этот код проверяет в описателе страницы 3-й разряд маски статуса. Если этот бит выставлен в 1, значит, на странице должна быть выноска новостной ленты. Вызывается скрипт формирования выноски и результат его работы – готовый фрагмент HTML-кода – помещается в переменную $ANNOUNCE. Остается просто вставить в нужное место шаблона страницы {$ANNOUNCE}
Теперь добавляем страницу новостей с алиасом news, выставляем ей в маске статуса признак «плагин» – теперь ее контентом будет то, что сформирует скрипт /libs/news.inc.php в зависимости от идентификатора новости (он передается в ссылке параметром pg).
Также выставляем для нее и для главной страницы признак выноски в маске статуса. Все. Теперь движок будет выводить выноски и тексты новостей.