Обзор
Примерно в конце 2009 года я написал простую систему шаблонов для PHP / HTML, которая будет использоваться нашими дизайнерами для веб-сайтов типа брошюр.Цель системы - разрешить использование шаблонов в чистом HTML-коде с помощью пользовательских тегов, которые обрабатываются PHP.Например, шаблонная страница может выглядеть так:
<tt:Page template="templates/main.html">
<tt:Content name="leftColumn">
<p> blah blah </p>
...
</tt:Content>
<tt:Content name="rightColumn">
<p> blah blah </p>
...
</tt:Content>
</tt:Page>
Сам шаблон может выглядеть примерно так:
<html>
<head>...</head>
<body>
<div style="float:left; width:45%">
<tt:Container name="leftColumn" />
</div>
<div style="width:45%">
<tt:Container name="rightColumn" />
</div>
</body>
</html>
Помимо тегов Page и Content / Container, естьнесколько других тегов, включенных в ядро для таких вещей, как управление потоком, итерации по коллекции, вывод динамических значений и т. д. Каркас спроектирован так, что очень легко добавить свой собственный набор тегов, зарегистрированных под другим префиксом и пространством имен.
Пользовательские теги в PHP
Как мы можем проанализировать эти пользовательские теги?Поскольку нет гарантии, что HTML-файл представляет собой правильно сформированный XML, такие решения, как XSLT / XPATH, не будут надежными.Вместо этого мы используем регулярное выражение для поиска тегов с зарегистрированными префиксами и заменяем их на код PHP.Код PHP представляет собой конструкцию на основе стека ... при обнаружении открывающего тега объект, представляющий тег, создается помещенным в стек, и запускается его "функция инициализации" (если есть).Всякий раз, когда встречается зарегистрированный закрывающий тег, самый последний объект извлекается из стека и запускается его «функция рендеринга».
Итак, после того, как каркас заменит шаблонные теги на PHP, наша примерная страница может выглядеть как-товот так (на самом деле это немного уродливее):
<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
<?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->pop(); ?>
Хорошо, плохо, и eval
Теперь, как выполнить наши новыесгенерированный код PHP?Я могу придумать несколько вариантов здесь.Самый простой - просто eval
строка, и это работает достаточно хорошо.Тем не менее, любой программист скажет вам: «eval - это зло, не используйте его ...», поэтому вопрос в том, есть ли что-нибудь более подходящее, чем eval
, которое мы можем использовать здесь?
Я рассмотрел использование временного или кэшированного файла, использование php://
выходных потоков и т. Д., Но, насколько я понимаю, они не дают какого-либо реального преимущества перед eval
.Кэширование может ускорить процесс, но на практике все сайты, которые у нас есть, уже работают невероятно быстро, поэтому я не вижу необходимости в оптимизации скорости на этом этапе.
Вопросы
Для каждой вещи из этого списка: это хорошая идея?Можете ли вы придумать лучшую альтернативу?
- вся идея в целом (пользовательские теги для html / php)
- преобразование тегов в код php вместо прямой обработки
- основанный на стеке подход
- использование
eval
(или аналогичного)
Спасибо за чтение и TIA за любые советы.:)