Лента новостей
Строго говоря, новостная лента – это не плагин, а изменение функциональности движка. Лента требует собственных средств управления и собственной отдельной структуры данных. Вот со структуры данных и начнем. Используем тот же принцип хранения данных, что и в основной структуре: «индексный» файл, в котором хранятся идентификаторы всех новостей и файлы данных – по одному на каждую новость. Обычно лента новостей не имеет иерархии и рубрикации, поэтому структура данных получается очень простой.
В «индексе» мы можем разместить всего два поля – дату новости и ее анонс (краткое содержание). Даты и анонсы будут выводиться в ленте, дата будет ссылкой на полный текст новости. А можно сделать ссылкой анонс. Как будет удобнее.
Теперь о маленьких хитростях, которые упростят нам жизнь. Дату и время новости можно установить автоматически, взяв системное время, когда новость была добавлена. А если мы возьмем время в формате 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;
Продолжение следует...