РНР 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; } |
| |
|
В начало ←предыдущая следующая→ ... 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 ... | ||