Всё что связано с функцией mailОписание возможностей mail |
||||||||||||||||||||||||||||||
| qmail Жизнь с qmail (статья) & Инструкция по установке CMS e107 & Mail & |
||||||||||||||||||||||||||||||
| Конфигурирование пол Котроль за ***видом* Геморой описание Маршрутизация входящ Маршрутизация входящ Маршрутизация входящ Перенаправления и ре Разное Шаблонизатор Учебник по Unix для Управление почтовой Установка серверов |
|
|||||||||||||||||||||||||||||
| В прошлом тысячелетии в Интернете было написано особенно много ругательных статей по поводу фразы «отделение представления от содержания». Не буду пересказывать все эти статьи (вы можете найти их сами, хотя бы при помощи незабвенного Яндекса, введя в качестве запроса нечто вроде «отделение представления от содержания неправильно бессмысленно»). Лично я полностью согласен с аргументами противников, вроде «если в документ вставлена картинка, генерируемая "на лету", то ее представление будет невозможно отделить от содержания документа, то есть смысла». Потому-то и предлагаю пользоваться гораздо более мягкой
Можно сказать уйму слов про код и шаблон страницы, однако эта набла имеет одно неприятное свойство: она ограничена в размере и, значит, не может разрастаться до 200 печатных страниц. Так что моя
Всего можно выделить четыре способа (вообще-то, даже пять) написания Web-скриптов, что, кстати, сильно отличает последние от обычных GUI-приложений. Давайте рассмотрим эти способы (не все из них приемлемы, кстати). Но вначале предположим для определенности, что результат работы скрипта пользователь видит, введя в браузере адрес
Способ первый. Кодовая фраза: «лепи все в print».Скрипты этого вида выглядят примерно так (на Perl): #!/usr/bin/perl -w
use CGI::WebOut;
print "<HTML><BODY>\n";
print "<h2>Последние новости:</h2>";
open(local *F, "news.txt");
for(my $i=1; !eof(F) && $i<=5; $i++) {
print "<li>$i-я новость: ".<F>;
}
print "</BODY></HTML>\n";
Достоинства: а их нет вообще. См. дальше. Недостатки: когда придет дизайнер в обнимку с
См. также: вторую, третью и четвертую наблы. Способ второй. Кодовая фраза: «
|
||||||||||||||||||||||||||||||
И это несмотря на то, что существует множество скриптов, написанных «плохим» |
Вот тут-то и выделяется понятие «шаблона» и «кода программы». Идея чрезвычайно проста: все, что относится к вычислениям и получению данных из внешнего хранилища и никак не связано с форматом отображения данных, помещаем в отдельный файл (это будет «код программы»). С шаблоном чуть посложнее: это также отдельный файл, он должен содержать много HTML-разметки и мало кода, предназначенного, например, для запуска цикла.
Слово «мало» тут надо понимать в смысле «как можно меньше», потому что совсем без кода (или его заменителя) в шаблоне обойтись будет тяжело. Дальше я поясню этот момент подробнее. Сейчас же важно запомнить: в файле с кодом программы вообще нет никакого HTML-оформления, а в |
Если вы помните, пользователь за последними новостями обращается к URI
Под URI я здесь и далее понимаю часть URL, следующую после имени хоста и, возможно, номера порта. |
В соответствии с кодовой фразой программист гордо помещает на место
$f=fopen("news.txt","r");
for($News=array(); !feof($f);) {
$News[]=trim(fgets($f,10000));
}
include "$DOCUMENT_ROOT/_templates/news.html";
Этот скрипт считывает из файла с новостями все данные и помещает их в массив
<HTML><BODY>
<h2>Последние новости:</h2>
<?for($i=0; $i<5; $i++) {?>
<li><?=$i?>-я новость:
<?=$News[$i]?>
<?}?>
</BODY></HTML>
Из-за краткости этого примера он выглядит слегка квадратно (как в десятой набле), но в больших скриптах такой подход оказывается существенно более удобен, чем второй способ. Код цикла
Судя по разглагольствованиям в недрах http://www.sun.com, они («люди на Солнце») называют это «моделью 2», но только по отношению к сервлетам. Они также утверждают, что такой способ удобен для работы. Может быть, товарищи слишком много писали под Windows (или под что-то еще) GUI-шных приложений, которые действительно всегда устроены именно таким образом. Но Web- |
Достоинства: навсегда исчезли абсолютно все вызовы
Положа руку на сердце, было бы гораздо удобнее вместо длинного |
Недостатки: дизайнер, правящий файл шаблона
Использование абсолютных путей типа |
Вообще говоря, есть и еще один
См. также: некуда уже смотреть, надо просто все взвесить.
Есть также и разновидность «третьего способа», которая позволяет (как будто бы) вообще обходиться без кода в шаблонах. Ее любители (обычно фанатики MySQL, хранящие в базе данных все, что только можно: картинки, файлы, деньги, драгоценности...) часто создают огромное количество файлов, каждый содержащий малый кусочек всего шаблона. Например, тело цикла, шапку, концовку и т. д. записывают в разные файлы. Затем эти «кусочки» радостно подгружаются в коде программы
Как вы думаете, кто из команды разработчиков менее сообразителен в технических вопросах (вроде выбора места расположения для картинки, когда шаблон вызывается неизвестно кем): программист или дизайнер/верстальщик?.. Конечно же, дизайнер. А потому программист должен стараться всячески упрощать ему жизнь (особенно если это одновременно упрощает жизнь и самому программисту, см. одно из лирических отступлений в начале наблы). А значит, раз хочет дизайнер поместить картинку в ту же директорию, что и шаблон (или даже скопировать шаблон страницы под другим именем в надежде, что он заработает) быть по сему.
Реализовать это несложно. Тут как раз проявляется закон существования беспроигрышных ситуаций: мы одним махом лишаемся всех недостатков, которые ранее над нами тяготели.
Корпорация Sun называет этот трюк «моделью 1» и утверждает, что настоящие профессионалы не боятся трудностей. Они забыли, наверное, что мудрый человек просто не попадает в такие ситуации, из которых умный с блеском выкручивается. |
Итак, поместим шаблон на место
<?include "$DOCUMENT_ROOT/_kernel/news.php"?>
<HTML><BODY>
<h2>Последние новости:</h2>
<?for($i=0; $i<5; $i++) {?>
<li><?=$i?>-я новость:
<?=$News[$i]?>
<?}?>
</BODY></HTML>
Итак, еще раз: теперь шаблон первичен, а
$f=fopen("news.txt","r");
for($News=array(); !feof($f);) {
$News[]=trim(fgets($f,10000));
}
Кстати, к вопросу о первичности. Вот представьте, что вы сидите перед монитором и пытаетесь попасть мышью в полосу прокрутки на окне. С чем вы тогда общаетесь: с окном и линейкой прокрутки, или же с той программой, которая обрабатывает движения курсора (на ассемблере), перерисовывает линейку прокрутки (на Си) и подкачивает данные с диска (опять на ассемблере)?.. Иными словами, вы ведь «разговариваете» именно с интерфейсом объекта, а не с его «внутренностями», не так ли?.. Так почему же идея использовать шаблон в качестве первичного элемента действует на некоторых так ошарашивающе?.. |
Давайте сразу же оговорим единственный недостаток этой модели. Он невелик: всего один лишний вызов
Теперь о достоинствах. Одно из них мы уже рассмотрели: дерево сайта с точки зрения дизайнера (и подвластных ему шаблонов) начинает выглядеть точно так же, как и с точки зрения пользователя. Не забывайте, что
Второе достоинство вытекает из первого: так как шаблон теперь полностью автономен (он лишь обращается к коду программы, чтобы тот выдал ему данные), мы можем его (шаблон) размножать и копировать в любую директорию на сайте: он заработает откуда угодно. Это похоже на идеологию Drag&Drop.
Чтобы подчеркнуть, что программный код в недоступной директории не имеет никакого отношения к оформлению результата, а лишь загружает и вычисляет некоторые данные, я буду называть его далее «генератором данных». Важно понимать, что генератор данных никоим образом не знает, из какого шаблона (шаблонов) он был подключен. Его |
Третий плюс, пожалуй, самый впечатляющий: теперь любой шаблон может быть построен на компонентной основе. Поясню, что это означает. Предположим, ваш шаблон страницы новостей модернизируется, и теперь вам нужно добавить в его конец вывод, например, погоды на завтра.
Посмотрите, как просто и изящно решается поставленная задача с использованием «четвертого способа»:
<HTML><BODY>
<!-- Блок новостей -->
<?include "$DOCUMENT_ROOT/_kernel/news.php"?>
<h2>Последние новости:</h2>
<?for($i=0; $i<5; $i++) {?>
<li><?=$i?>-я новость:
<?=$News[$i]?>
<?}?>
<hr>
<!-- Блок погоды -->
<?include "$DOCUMENT_ROOT/_kernel/weather.php"?>
По сообщениям синоптиков, дождь, объявленный
на сегодня, переносится на завтра на те же часы.
Также завтра ожидается: <?=$Weather?>
</BODY></HTML>
В роли компонент выступают генераторы данных. Любая компонентная модель характеризуется следующими свойствами (выдумываю на ходу):
Как видите, все эти условия тут прекрасно удовлетворяются. Вспомните теперь «третий способ», с ведущим программным кодом. Моментально становится ясно, что он не способен удовлетворить требованиям, жизненно необходимым для нас (во всяком случае, без дополнительного программирования).
Если бы корпорация Sun продавала на базаре помидоры, как бы она поступила: раздала помидоры прохожим, чтобы те самостоятельно навязывали часть плодов выбранным ими же покупателям, или же выложила бы все помидоры в одном лотке и выдавала бы их клиентам в затребованном количестве?.. Первый вариант кажется совершенно абсурдным! Между тем, именно так выглядит «способ третий», или «модель |
Наконец, последняя точка над «i». Возможно, кто-то возразит, что компонентная модель делает невозможной экстренную передачу управления другой странице на
Если помните, нам так и не удалось избавиться от одного, казалось бы, неустранимого недостатка в шаблонах. Я о малом, но все же использовании кода на языке программирования, недоступном дизайнеру. Есть ли выход?..
Конечно. Идея опять же проста: «если муж не идет к жене, то жена идет к Магомету». В смысле, если дизайнер не понимает языка программирования, переделаем этот язык так, чтобы он стал понятным. Что, звучит невероятно сложно?.. В общем-то, это не очень далеко от истины и называется Templating System, или шаблонизатор (так, прошу отнестись с
Пока неясно, что точно должно входить в концепцию идеального шаблонизатора, но конец, похоже, уже виден, потому что проблемой наконец-то заинтересовались. Знаете, бывают такие задачи, про которые вы можете сказать: «предчувствую, она имеет точное решение». Это как у математиков: доказать существование
Про шаблонизатор я обязательно буду еще писать в следующих наблах, а пока хочу лишь донести отдельные моменты, существенные в данной статье:
Замечу снова, что некоторые из этих вопросов (особенно о тэгах) до сих пор относятся к крайне мало разработанным. Поэтому не спрашивайте
Под конец приведу пример шаблона страницы, запускаемой на шаблонизаторе, который может уже быть отнесен к почти идеальному варианту. Чтобы далеко не ходить за примерами, возьмем опять нашу страницу новостей с информацией о погоде в нижней части. Вот она:
<HTML><BODY>
<!-- Блок новостей -->
<h2>Последние новости:</h2>
<DATASRC src="News">
<FOREACH src=News>
<li>$i-я новость: $news
</FOREACH>
<hr>
<!-- Блок погоды -->
<DATASRC src="Weather">
По сообщениям синоптиков, дождь, объявленный
на сегодня, переносится на завтра на те же часы.
Также завтра ожидается: $weather
</BODY></HTML>
Хотя изменения в этом коде кажутся смехотворными для программиста (
А что, этот сайт (http://www.dklab.ru) построен на «настоящем» шаблонизаторе?..
Да. Вернее, на его прототипе.
Фирма
Наверное. Но возьмем тогда Microsoft, который будет покрупнее Sun. Вы видели, что из себя представляет BAT-язык (язык командного интерпретатора) Windows и DOS?.. И после этого вы все еще считаете, что крупные компании не могут предлагать решения «на коленке»?.. Почему бы и нет?..
В примерах имеются недостатки. Например, генератор данных новостной системы берет новости из текстового файла, расположенного непонятно где. А если у нас две новостных системы?.. Им же надо использовать разные файлы...
Да. Но это всего лишь примеры. Конечно, реальный шаблонизатор в тэге
Почему столько опечаток?..
Для исправлений есть система Orphus, которая видна в верхней части страницы. Как показывает практика, автор практически никогда не может исправить все опечатки в своем тексте. Нужен кто-то со стороны, кем и являются читатели: если вы заметили опечатку, вам достаточно просто выделить ее мышью и нажать Ctrl+Enter. Все остальное я сделаю сам.
|
Другие разделы блога: Mail & qmail Жизнь с qmail (статья) & Инструкция по установке CMS e107 & ©GRoM |