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

Шаг 159: http://php.kurepin.ru/step/159/

С наступающим вас праздником, если кто еще считает, что современная Российская Армия — это праздник.

Ну что, продолжим битву с новостями, или сначала новую задачку? Две предыдущие были блестяще решены Serg_Simf на форуме.

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

Давайте попробуем разработать описание свойств оптимального для одного сайта механизма такого "баннерообмена".

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

А теперь вернемся к новостям.

Предлагаю разбивать новости по N штук на странице и хранить их в готовом виде в папке /news/pages/. А показывать их на странице /news.php, указывая в качестве параметра номер страницы новостей.

Нам для этого понадобится.

1. Глобальная переменная $NEWS_PAGE_SIZE, в которой будем хранить количество новостей в одном файле. Или нам лучше отделять страницы не по новостям, а по размеру страницы? Да, правильнее будет — по размеру.

2. Подпапка /news/pages/.

3. "Куча" новостей для проверки. Это я возьму откуда-нибудь.

4. Функция разбиения новостей на страницы: in_news_pages

5. Создать страницу news.php, которая будет отображать страницы новостей

Приступим к реализации.

Переменной присвоим "6" — это будет 6 килобайт. Можно было бы даже меньше.

Подпапку /news/pages/ создали. Следите за правами доступа в папки.

Кучу новостей я, наверное, стащу со своего caricatura.ru.

Ну-с, теперь главное — функция.

Попробую изложить алгоритм работы функции на словах, а потом его реализовать.

Функция открывает для чтения файл новостей и начинает его читать с головы (с последней новости) в цикле, "переворачивая" страницы после каждого достижения предельного размера страницы, определенного в переменной $NEWS_PAGE_SIZE. Каждый фрагмент записывается в директорию pages под очередным номером: 1, 2, 3...

Вот такой простой алгоритм. Начало и конец каждой страницы украсим ссылкой на предыдущую и последующую страницу новостей.

Вот, что у меня получилось.


Я постарался написать максимум комментариев, разберетесь, ничего сложного, все как всегда.

Теперь надо вызвать эту функцию из нашего "конструктора новостей", но это вы сделаете самостоятельно.

Осталось только создать файл news.php.

Для этого мы берем любой наш php-файл и записываем туда, где надо вставить текст страницы:


Очевидно. Мы просто подсасываем страницу по ее номеру и все.

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

Но нам еще надо обработать нестандартный ввод параметра p.

Для этого добавим в начале файла, сразу после создания экземпляра класса:


Поясняю.

Сначала приводим номер страницы к целочисленному виду.

Затем проверяем на нулевое или отрицательное значение. Если условие выполняется, то это противоречит логике и надо вернуться на первую страницу. То есть p=1. Почему на первую? Потому, что p будет равно 0, если запросить news.php без параметров. А это равнозначно запросу последних новостей, логично? Логично. Значит надо показать первую страницу.

Далее нам надо проверить существование такой страницы на диске. Если его по каким-то причинам нет (скорее всего, такое возникнет, если пользователь попробует ввести слишком большой номер страницы), мы так же пуляем его на первую страницу.

Не забудьте добавить новую ошибку в utils и подредактировать переменную навигатора, чтобы показывала раздел новостей и номер новостной страницы.

Ну что еще? Добавим ссылку на новости на главную страницу нашего проекта и можно отправляться играть в бильярд. Мне на день рождения такой кий подарили... а я до сих пор его не опробовал.

До завтра!

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



copyright ©2000-2017 Ruslan Kurepin