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

Лента новостей

Строго говоря, новостная лента – это не плагин, а изменение функциональности движка. Лента требует собственных средств управления и собственной отдельной структуры данных. Вот со структуры данных и начнем. Используем тот же принцип хранения данных, что и в основной структуре: «индексный» файл, в котором хранятся идентификаторы всех новостей и файлы данных – по одному на каждую новость. Обычно лента новостей не имеет иерархии и рубрикации, поэтому структура данных получается очень простой.

В «индексе» мы можем разместить всего два поля – дату новости и ее анонс (краткое содержание). Даты и анонсы будут выводиться в ленте, дата будет ссылкой на полный текст новости. А можно сделать ссылкой анонс. Как будет удобнее.

Теперь о маленьких хитростях, которые упростят нам жизнь. Дату и время новости можно установить автоматически, взяв системное время, когда новость была добавлена. А если мы возьмем время в формате Unix Timestamp, то получим заведомо уникальный идентификатор новости – десятичное число (число секунд, прошедших с начала 1970 года, если кто не знает). Этот идентификатор вполне пригоден в качестве имени файла с текстом. Он же отлично подойдет и для формирования ссылки на полный текст новости. А уникальность обеспечивается тем, что написать и сохранить две новости в течение одной секунды вы явно не сможете.

Все необходимые средства для этого в php есть. Функция time() без параметров возвращает текущее время в формате таймштампа, функция date() всегда сделает нам из таймштампа дату и время в том формате, который мы зададим маской. Но еще лучше использовать getdate(), которая отдает все элементы даты и времени в виде ассоциативного массива. Что мы и сделаем – так нам будет удобнее сформировать дату с русским наименованием месяца.

Поступаем так же, как и с основным контентом. Создаем директорию /news, кладем туда файл .htaccess с запретом для всех и пока что пустой файл index.dat. Выставляем права на директорию 0777 и на файл index.dat 0666, чтобы скрипт мог создавать и модифицировать файлы. Файлы вида 1234567890.dat будут создаваться там же для каждой новости и содержать ее текст (1234567890 здесь изображает время публикации новости в формате тайштампа). В файл index.dat будем складывать то же время публикации и анонсы новостей в таком виде:


1234567891|А сегодня у нас есть вторая новость для вас
1234567890|Анонс самой первой новости

Обратите внимание, анонсы новостей «складываются» в файл в обратном порядке – самая поздняя новость стоит первой, самая старая последней. Это несложно реализовать при вводе новостей, чтобы при выводе просто выбирать строки в порядке следования.

Как видите, этих данных вполне достаточно, чтобы вывести – например, на главной странице – столбец с новостной лентой. Для этого нам нужно считать и разобрать в массив только «индексный» файл. И вывести N первых элементов массива (число можно задать в файле конфигурации). А идентификатор (он же время публикации) новости является одновременно именем файла, в котором содержится полный текст, так что для вывода текста новости тоже не нужны большие усилия.

И еще немного схитрим – вместе с текстом новости поместим в тот же файл и ее анонс. С точки зрения нормализации структуры данных это избыточно. Но есть маленький секрет: не нужно делать из нормализации идола. Ценой небольшой избыточности данных мы получаем возможность считывать только один файл, а не два – и когда выводим анонсы, и когда выводим полный текст. Это несомненно быстрее и отнимает меньше памяти. А анонсы всегда короткие, так что большого утяжеления это не даст. Этот же подход пригодится и в работе с базами данных: такая избыточность даст возможность обойтись запросом к одной таблице вместо связывания двух таблиц join'ом.
Вот так будет выглядеть файл с текстом новости:


Анонс самой первой новости|Полный текст самой первой новости нашего сайта...

Вот так мы можем вывести полный текст новости (параметр pg – таймштамп даты):


<?php
// Массив названий месяцев для замены
$monar=array(1=>' января ',
 2=>' февраля ',
 3=>' марта ',
 4=>' апреля ',
 5=>' мая ',
 6=>' июня ',
 7=>' июля ',
 8=>' августа ',
 9=>' сентября ',
 10=>' октября ',
 11=>' ноября ',
 12=>' декабря ');
// Строка вывода, ее значение добавляется к $CONTENT
$outstr='';
// Проверяем, существует ли файл с текстом
if (is_file('./'.$newspath.$pg.'.dat')) {
  // Считываем и разбираем файл
  $nwc=explode('|',file_get_contents('./'.$newspath.$pg.'.dat'));
  // Получаем из таймштампа дату и время в массив
  $cur=getdate($pg);
  // «Собираем» дату в заголовок (месяц берем из массива $monar)
  $outstr.='<h2>'.$cur['mday'].$monar[$cur['mon']].$cur['year']." г.</h2>\n";
  // Отдельным абзацем присоединяем анонс жирным шрифтом
  $outstr.='<p><b>'.$nwc[0]."</b></p>\n";
  // Добавляем полный текст (переводы строк заменяем <br>)
  $outstr.='<p>'.stripslashes(nl2br(str_replace('\n',"\n",$nwc[1])));
} else {
  // Если файла с текстом новости нет, генерируем ошибку 404
  err404(TRUE);
}
?>

Этот скрипт мы кладем в директорию /libs под названием news.inc.php – теперь можно создать алиас news и «назначить» его плагином, выставив бит 1 в битовой маске статуса (см. раздел «Разбор структуры сайта»).

Да, чуть не забыл. В файле конфигурации движка, конечно же, добавятся две переменные:


// Путь к директории, где хранятся файлы новостей
$newspath = 'news/';
// Число анонсов, выводимых в ленте
$nwcount = 10;

Продолжение следует...