А это клавиатура, с помощью которой я творю...
http://kurepin.ru/php/news/
Rambler's Top100
Пишем на PHP: Новости на главную страницу

Как и обещал, сегодня работаем с новостями.

Если я еще помню вчерашний выпуск, мы придумали формат для хранения новости.

Исходя из этого формата нам надо бы получить краткий вариант новостей для "морды" и полный вариант для раздела "новости" с разбиением всего списка новостей на страницы.

Начнем с новостей на титульную страницу (морду).

У нас для анонсов предусмотрено специально поле строке записи новости. Кроме нее возьмем дату новости, если новости у нас выходят не часто (раз в день или реже) или время новости, если новости у нас идут как из пулемета.

Еще нам понадобится "ограничитель" количества коротких новостей — еще одна переменная в varsNEWS_MAIN_MAX — мы ее назовем.

А имя файла для титульных новостей мы определили в прошлом выпуске: /news/main.inc.

Этого будет достаточно, мне кажется.

Теперь большой и философский вопрос о том, в какой класс нам запихнуть функции работы с новостями.

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

1. На главной странице
2. На странице "новости"
3. На любой другой странице может вызываться анонс в виде текстового рекламного блока.

Напрашивается класс out... Согласны? Вижу, что согласны.

Ох, люблю я вас поводить за нос!

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

Конечно же нет. Тут разговора быть не может — новостные файлы должны формироваться на диск в момент какого-либо изменения в главном новостном файле и подключаться на сайт простым includ-ом.

А это значит, что все (почти все) функции работы с новостями у нас пойдут в класс in. Вернее, я предлагаю породить от класса in класс class_in_news и в нем хранить все функции обработки новостей.

Итак. Создаем файл /req/in_news.class.

И... снова ударяемся в рассуждения. Рассуждения, друзья мои, — в нашем деле далеко не последняя вещь, если не первая.

Когда нам надо обращаться к формированию файлов новостей? Очевидно, что только после внесения каких-то изменений в основной новостной файл. Это значит, что нам нужна функция, создающая новостные файлы. Эту функцию мы будем вызывать изо всех функций, вносящих какое-либо изменение в основной файл новостей. Перечитывать этот абзац до полного понимания.

Вы можете сейчас сказать, сколько и каких файлов нам надо будет создавать? Я, честно говоря, сильно затрудняюсь это сделать. Поэтому, создадим первую функцию in_news_files_create(), которую и будем вызывать для формирования новостных файлов. То есть это будет некий аккумулятор функций, создающей структуру новостных файлов на диске.

Первой "рабочей" функцией станет in_news_main(). Именно в ней мы сделаем выборку нужных нам строк в файл /news/main.inc.

В одном из выпусков я уже рассказывал о работе с файлами, поэтому не стану заострять внимания на используемых ключевых словах языка, скажу лишь только, что использовать мы будем самые заурядные команды.

Как происходит сборка файла для морды.

Алгоритм прост как барабан. Надо прочесть от начала файла $NEWS_MAIN_MAX строк, выдрать из них дату и анонсную часть текста и записать это в файл.

Проделаем это в реале:

Да, чуть не забыл! Исходный файл для хранения новостей так и будем звать — source.inc — исходник.

Создали файл /news/source.inc:


Ну... ничего страшного, пусть будет такой убогий для начала.

Далее создаем в class_in_news функцию in_news_main(). Вот такой файл у меня получился:


Пояснять надо? Поясняю.

Открыли файл для записи/перезаписи и для чтения.
Установили убывающий счетчик на нужное количество строк новостей.
Начали цикл while по условию счетчика или конца файла
Прочли строку
Проверили, если начинается она не с "тюрьмы" и имеет менее более двух разделителей "~~" (чтобы не обрабатывать строки неправильно созданные)
Разделили строку на четыре составляющие
Две нужные записали в новый файл с нужным форматированием
Уменьшили счетчик на единицу
Закрыли цикл while
Закрыли файлы
Вернули нулевой код ошибки

Все, как всегда, просто и логично. Как и должно быть в коде программы.

Если вы внимательно просмотрели код, то заметили два новых номера ошибки. Добавим их в класс утилит:


Все, новости на морду у нас теперь создаются! Ура! Только эта... как выполнить-то функцию, а? Она же у нас предназначена для автоматического выполнения из других функций...

Вот мы и подошли к созданию еще одной важной директории нашего проекта. Даже не одной, а сразу двух!

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

Кроме этого, существуют функции, которые необходимо запускать как из скриптов, так и с некоторой периодичностью из cron-а.

В директорию /utils/ мы будем складывать файлы для ручного выполнения каких-либо операций, а в директорию /cron/ будем складывать скрипты для периодического выполнения.

Пожалуйста, создайте обе эти директории в своих проектах.

Файлы, живущие в этих директориях имеют, как правило, всего несколько строк кода — они всего лишь подключают нужный класс и вызывают нужную функцию.

Положив в папку /utils/ файл create_news.php такого содержания:


Этот файл мы можем выполнить из командной строки, придав ему вид выполняемой программы. Лично я этого никогда не делаю. Мне приятнее запускать подобные скрипты, подставляя их имена в качестве параметра к php, собранному для командной строки. Но это всего лишь дело привычки.

Главное что? Главное, что скрипт этот я запустил и получил на сайте новостную колонку из коротких анонсов. Потом надо будет снабдить их ссылкой на полную новость, но это уже после того, как будет создана страница трансляции полных новостей.

До завтра!

[шаг назад] [печатать] [в начало сайта]



copyright ©2000-2017 Ruslan Kurepin