Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Навигация в новостной ленте

Итак, хранение новостей мы организовали, вывод текста новости на страницу тоже. Что остается? Конечно же, показ анонсов и навигация.

Обычно анонсы последних новостей выносятся на главную страницу. Но это не обязательно, никто нам не помешает сделать такую выноску на любой другой странице. А чтобы у нас был выбор, в маске статуса страницы есть бит 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 у нас специально зарезервирован для страниц с полным текстом новости. Ни для чего другого мы его использовать не будем.

Теперь нам нужен скрипт для вывода блока анонсов. Начиная с самой поздней новости, если выноска на главной странице, или начиная с предыдущей, если выноска на странице новости. Этот скрипт мы разместим в файле /libs/announce.inc.php.


<?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);
}
?>

Здесь наблюдается тот же массив с наименованиями месяцев, что и в скрипте вывода новости /libs/news.inc.php. Поскольку на страницах с текстом новостей тоже используется выноска, из скрипта news.inc.php этот массив можно убрать, чтобы не определять его два раза.

В результате действий этого скрипта мы получаем переменную $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).
Также выставляем для нее и для главной страницы признак выноски в маске статуса. Все. Теперь движок будет выводить выноски и тексты новостей.