| |
атическая генерация названий
Если пользователь находится на сайте "Книжный магазин" в разделе "Философия" на
заинтересовавшей его странице "Современность", то, конечно, в заголовке окна
брау-
зера ему бы хотелось видеть что-то вроде "Книжный магазин | Философия | Совре-
менность", а не просто "Современность". Мы уже договорились хранить название
страницы в блоке Title. Но, конечно, мы бы не хотели записывать в каждой
страни-
це название полностью, потому что:
r в будущем мы можем перенести страницу в другой раздел;
r мы, возможно, захотим сменить разделитель | на /;
r это нарушает концепцию минимальной избыточности данных, что, как мы уже
неоднократно убеждались, не приводит ни к чему хорошему.
Глава 30. Код и шаблон страницы 439
Специально для решения такого рода задач в нашем шаблонизаторе предусмотрим
механизм, который я далее буду называть автоматической склейкой тел блоков. Вот
как он работает. Если при обработке очередного блока шаблонизатор видит, что
его
тело начинается с подстроки [Клей], он определяет, что текст должен быть
"присты-
кован" к предыдущему телу одноименного блока, но не должен заменить его. В
каче-
стве "строки-клея" выступает значение блока с именем Клей. Это позволяет нам в
будущем изменить символ "склейки" лишь в одном месте, чтобы это затронуло весь
сайт. В случае, если указана пустая пара квадратных скобок [] (то есть имя
блока
было опущено), используется тело блока с именем DefaultGlue (см. листинг 30.12),
а если и он отсутствует — то |.
Теперь при загрузке страницы /phil/index.html из листинга 30.11, пользователь
увидит ее полное название, составленное из блоков Title всех "надкаталогов" и
са-
мого файла страницы. Мы добиваемся этого, определив блок Title следующим об-
разом:
Поддержка механизма поиска
включаемых файлов
В шаблонизаторе есть одна полезная функция. Называется она Load() и занимается
тем, что загружает указанный в параметрах файл, который как предполагается,
также
имеет блочную структуру. Имя этого файла можно задавать относительно текущего
каталога (в котором расположен код, вызвавший Load()), либо же в абсолютном
формате (относительно корневого каталога сервера).
С помощью данной функции мы можем разбивать сложные шаблоны на части. На-
пример, так можно было бы поступить с блоком, занимающимся формированием
карты текущего раздела, особенно если существует несколько шаблонов, отображаю-
щих эту карту. Функцию Load() можно вызывать в любом месте страницы или даже
из файла .htaccess. Блоки, генерируемые ей, будут вставлены непосредственно пе-
ред тем блоком, в котором она была вызвана.
На примере использования библиотекаря мы уже убедились, насколько утомитель-
ным может быть указание абсолютных путей к файлам. Поэтому функция Load()
умеет сама искать включаемые файлы по серверу. Она делает это всякий раз, когда
ей задан относительный путь к файлу. Поиск ведется на основе списка так
называе-
мых каталогов для поиска шаблонизатора. Этот список можно пополнять с помощью
вызова Inc(), как это сделано, например, в листинге 30.12. Функция Inc()
доволь-
но интеллектуальна: даже если ей передан относительный путь к каталогу, она
пере-
водит его в абсолютный. Так что при использовании Load() из файла, расположен-
ного в другом каталоге, не происходит никаких недоразумений.
Часть V. Приемы программирования на PHP 440
Фильтры блоков
После того, как тело блока вычислено, шаблонизатор производит его
дополнительную
обработку. Делается это с помощью специальных функций-фильтров. Например,
"склеивание" названий осуществляется именно таким фильтром. Система устроена
таким образом, что позволяет добавлять и удалять ф
|
|