РНР 5 в подлиннике

Страница 517 из 554


Гпава 46. Код и шаблон страницы

1045

/I Сначала — загрузка гостевой книги. $tmpBook = LoadBook(GBook);

// Добавить в книгу запись пользователя — она у нас хранится в массиве $New, // см. форму в шаблоне. Запись добавляется, как водится, в начало книги. $tmpBook = array(time () => $_REQOEST['new1]) + $tmpBook; // Записать книгу на диск. SaveBook(GBook, $tmpBook);

}

// Данный компонент не генерирует никаких данных.

$Data = null;

?>

Показ записей

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

I Листинг 46.11. Файл comp/component_gbook_show.php

<?php ## Компонентный подход. Компонент показа гостевой книги, define("GBook", "gbook.dat"); // имя файла с данными гостевой книги require_once "model.php"; // подключаем Модель (ядро)

// Загрузка гостевой книги. $Data = LoadBook(GBook);

// Переменная $Data теперь доступна вызывающему Шаблону (см. view.php). ?>

Хотя наш Компонент и называется "показом гостевой книги", в действительности он ничего не печатает, поручая этот процесс вызывающему Шаблону. Вообще, Компонент, как и Модель, не должны ничего выводить в браузер напрямую (за исключением, может быть, отладочных сообщений, которые не должны присутствовать в окончательной версии сайта), в противном случае это считается грубым нарушением компонентного подхода.

Показ новостей

Компонент показа новостей очень похож на предыдущий. Он загружает из файла максимум пять записей, которые, после удаления ведущих и концевых пробелов, помещаются в результирующий массив $Data (листинг 46.12).

| Листинг 46.12. Файл comp/component_news_show.php

<?php ## Компонентный подход. Компонент показа новостей.

// Подгружаем данные 5 новостей с диска. Вообще говоря, этой работой

// должна заниматься Модель новостей, однако для экономии места

// мы размещаем код непосредственно в Компоненте (ибо он очень прост).

1046

Часть VII. Приемы программирования на РНР 5

$Data = array(); $f = fopen("../news.txt", "r"); 'for ($i=l; !feof($f) && $i<=5; $i++) {

$n = trim(fgets($f, 1024));

if (!$n) continue;

$Data[] = $n;

)

?>

По правилам мы должны были бы завести для новостей отдельный элемент — Модель новостей, однако из соображений лаконичности мы этого не делаем.

Проверка корректности входных данных

Обратите еще внимание на то, что Компонент добавления записи в гостевую книгу component_gbook_add.php не генерирует никаких выходных данных для Шаблона (более того, он даже на всякий случай присваивает переменной $Data значение null).

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

Например, мы можем ввести в нашу гостевую книгу цензуру, которая будет запрещать пользователям употреблять в сообщениях ненормативную лексику. Конечно, при вводе недопустимого текста он не должен добавиться в гостевую книгу; вместо этого в браузер пользователя хотелось бы вывести предупреждение. Но как осуществить желаемую модерацию в соответствии с компонентным подходом? И какая часть программы должна за это отвечать?

На второй вопрос ответить довольно просто. Так как Модель не в состоянии "общаться" с Шаблоном напрямую, а Шаблон не может исполнять сложный код, остается единственный вариант — Компонент. А что касается того, как выводить сообщение об ошибке, — вопрос довольно спорный. Мы рассмотрим лишь самое простое решение.

Итак, Компонент должен сгенерировать признак (флаг) ошибки и как-то передать его Шаблону. Последний, "заметив" этот флаг, может вывести текст контрастными буквами, например, вверху страницы.

Пусть Компонент в случае ошибки заводит в результирующем массиве $Data ключ с именем error и присваивает соответствующему значению информацию об ошибке:

$new = $_REQUEST['new' ] ; do {

if (empty!trim($new['name']))) {

$Data[1 error1]['no_user_name'] = true; break;

}




  Hostland.Ru

 «Бесплатный хостинг Hostland.Su» © 2006