Первоначальная автоматизация появляется тогда, когда вебмастер решает, что
обновлять сайт с помощью Notepad или FrontPage становится слишком сложно, долго
и так далее. Тогда он берет скрипт, который худо-бедно помогает обновлять сайт
без помощи упомянутых программ (надо сказать, что Notepad - это тоже стадия
автоматизации автоматизации :). Код такой страницы выглядит примерно так:
[PHP]
<h1>Новости</h1>
<?
$handle=opendir(".");
while ($file = readdir($handle))
if (!ereg("[^0-9-]", $file)) {
print("$file". implode("", file($file)). "
");
}
?>
Присылайте свои новости нам на email.
[/PHP]
Впрочем, это так, для примера, не стоит много внимания уделять. В двух словах,
это программа, которая считывает имена файлов в директории, и файлы, у которых
имена представляют собой дату ("5-1-2001"), читает и выводит в документ.
Разумеется, здесь нет никакой сортировки по дате - новости выводятся сходу, а
по-хорошему, их надо считать в массив (если, конечно, массив не будет очень
большим) и отсортировать. Благо, специальные функции есть (о них расскажу на
следующей неделе в выпуске про массивы).
Разумеется, если автор начнет увеличивать функциональность сайта (нескромно
скажу, хотя бы до уровня данного), работать с файлами, в которых есть смесь HTML
и кода PHP станет очень неудобно. Если понадобится что-то изменить, придется
копаться в нескольких файлах (в основном методом copy/paste), следить за
ошибками и так далее - словно FrontPage вернулся в новом обличьи. Можно,
конечно, сделать" представляет собой цельный код PHP, в котором все данные
выводятся при помощи echo/print), но это тоже не спасает - по выражению моего
знакомого, получится "шумный код". Можно оптимизировать его сколько угодно,
рассовать операции по множеству функций, но
Еще один вариант автоматизации вывода HTML я недавно увидел на сайте PHP Builder.
Вещь эта называется PHP Layout class. Процитирую переведенный мною текст:
[PHP]
<?php
class Anchor {
var $source = "";
var $attributes = array();
function Anchor ($s,$a) {
$this->source = $s;
$this->attributes = $a;
}
function printit() {
echo "Homepage" можно создать при помощи таких строк:
[PHP]
<?php
$a = new Anchor("/index.html",array("href" => "Homepage"));
$a->printit;
?>
[/PHP]
Ну, это еще так себе. Дальше начинаются ужасы.
[PHP]
<?php
newhtml($w);
insert($w,wheader("A Test Page"));
insert($w,$t = table(array("cols"=>"2","width"=>"650")));
insert($t,$c = cell(array("colspan"=>"2")));
insert($c,text("TEST o-nLY"));
printhtml($w);
?>
[/PHP]
Кстати, парсер студии А. Лебедева, судя по документации, автоматизирует работу
примерно до той же степени, что и PHP Layout class. Вы не подумайте, что я
"кладу" на всё, что не использую. Используйте эти средства! Единственное
ограничение - гибкость сайта. В статье авторы пишут "Achieve the most flexbility
in web page creation" ("достигнете наибольшей гибкости в создании веб-страниц").
Это не совсем так. При помощи Layout class (а так же Parser-а) можно
сравнительно гибко изменять страницы "по кирпичикам", но чтобы целиком...
Представьте себе такой диалог между начальиком студии и программистом:
- Как дела с сайтами заказчиков Иванова и Петрова?
- Все отлично, шэф (Иван Иванович, Вано - кому как нравится)! Вчера перевели
сайт Иванова на Layout class, а Петрова, как и просили, на Parser. Все работает.
- А теперь поменяйте дизайн на обоих сайтах. На сетевом диске в директории
dezign новый вариант оформления.
- Надеюсь, там не много нового?
- Там все новое! Таблицы в других местах, флэш стоит, лэеры (тег <layer> -
Д.Л.). Да, кстати, чтобы пользователи старых броузеров не грузили все эти
финтифлюшки, сделайте определение user-agent и пусть они будут получать
упрощенную версию страниц.
- О, боже! Только не это, шэф!
- Заказчик тре-бу-ет!
В такой ситуации HTML+PHP или "чистый php" выглядят куда безобиднее - "всего-то"
несколько дней copy/paste. А ведь, как мы видели, чтобы создать таблицу в Layout
class, надо вызвать специальную функцию и указать ей свойства таблицы - тут
придется вытаскивать много маленьких кусочков текста. Но, разумеется, если
вашему проекту не грозят бурные изменения, флаг в руки! А мы поговорим про
шаблоны. Позвольте мне в этот раз не переходить на конкретику, а порассуждать в
общих чертах, что нам надо от них.
На чем это все должно работать? На ООП. Так удобнее всего. Мы создаем класс, в
котором прописаны все используемые функции (о них - ниже) и свойства шаблона (в
том числе и его содержимое).
Собственно, что нам нужно от скрипта? Достать какие-то данные из файлов/БД или
откуда-то еще и вставить их в некоторый шаблон форматирования. Возможно,
шаблонов формата может быть несколько (как у меня в версии для печати). Поэтому
зачем городить огород и держать "все прямо здесь", в скрипте? Итак, первое
свойство шаблонов - хранение исходных текстов в файлах.
Второе - переменные. Вот как может выглядеть исходный текст страницы:
[PHP]
<html><head><title>%%TITLE%%</title></head>
<body bgcolor=#%%BGCOLOR%% link=#%%LINK%%>
<h1>%%HEADER%%</h1>
%%MAINTEXT%%
</body>
</html>
[/PHP]
Вызвав специальную функцию, можно указать программе, чем заменить переменную %%TITLE%%
и т.д. Причем, желательно, чтобы функция принимала не только пару имя-значение,
но и сразу несколько таких пар, то бишь ассоциативные массивы.
Следующее требование к шаблонам - возможность вложенных шаблонов. При этом можно
держать корневой файл со всеми заголовками, meta-тегами, таблицей стилей (CSS),
а в него в нужное место вставлять нужные шаблоны. У меня для этого есть
специальные слоты (%%+PAGEBODY%%).
И еще одна важная вещь - блоки. Например, нам надо вывести на странице список
ссылок. Естественно, мы не будем прописывать формат вывода для каждой из них. Мы
пойдем проще:
[PHP]
<h1>Ссылки</h1>
<h2>%%CATEGORY%%</h2>
%%LINKTITLE%%
[/PHP]
А в программе сделаем функцию, которой можно было бы задать массив данных,
который нужно отформатировать так, как написано в блоке.
И вот, что у нас получается в итоге (названия условны):
Функции: set_var, set_block, drop_var, drop_block, parse, fetch, insert.
Свойства класса: content, vars, block, и некоторые служебные свойства типа
указателей, что делать с неопознанными переменными (удалить, оставить, поставить
тег комментария).