Xpoint
   [напомнить пароль]

Про шаблонизатор и eval

Метки: [без меток]
2008-01-24 14:36:18 [обр] Василий Ефремов[досье]

День добрый.

Есть самопальный движек для сайтов, достаточно простой, особых нагрузок сайты под его управлением не испытывают.
В нем есть шаблонизатор (если я не верно использую терминологию, поправьте пожалуйста), идея шаблонизатора в том, что в обычный сверстанный HTML-код вместо некоторых ключвых слов вставляется php-код из базы данных(или файла).
При этом этот HTML-код храниться в базе данных и редактируется через админку (в случае например контента, при помощи FCKeditor'а)
Простой пример:

<html>
<head>{#google#}</head>
<body>
{#news#}
</body>
</html>

В данном примере, на место {#google#} будет вставлен JS-код Google Analytics.
А на место {#news#} "модуль", который отобразит новости на сайте. По сути, этот модуль — это содержимое PHP-файла, т.е. выглядеть это может например так:

<?
print "Новости";
?>

Ну и далее все это отдается eval'у. Но в принципе есть понимание того, что eval — это зло. Собственно вопрос, как в текущем случае можно обойтись без eval ? И можно услышать в двух словах(или кинуть пару ссылок) как решаются похожие задачи именно в шаблонизаторах ?

ЗЫ: Прикручивать какой-нибудь страшный смарти нет никакого желания.

Спасибо.

спустя 1 час 2 минуты [обр] Андрей Пахомов(77/310)[досье]

В данном случае есть 2 варианта:

  1. Компилятор. Пишется скрипт, который подставляет вместо ваших конструкций {#что то там#} нужные куски PHP кода, сохраняет как файл, и инклюдит его. Соотвественно, перед сохранением можно сделать проверку, существует ли такой файл и если да, то компиляция не выполняется а сразу вызывается уже готовый.
  2. Интерпретатор. Все обработчики оформляются не в виде отдельных кусков кода, а функций (классов,или методов класса, по вкусу), которые возвращают готовый HTML код с данными, и при разборе конструкций вызываются эти обработчики и подставлются результаты, после чего через echo выводится готовая страница.

Но если честно - то что вы хотите - это велосипед, причем с одним колесом. Ваша схема по любому предполагает, что ваши обработчики будут генерить HTML, таким образом, смена дизайна простой правкой шаблонов невозможна, и значит, если вы захотите от этого уйти, вы придете либо к варианту а ля Smarty, либо к XML+XSLT.

спустя 25 минут [обр] Василий Ефремов[досье]
смена дизайна простой правкой шаблонов невозможна
Минимальная смена дизайна все же возможна, ибо данные, которые формирует "модуль" зачастую обрамленны тегами div, которые имеют соответствующие css-селекторы.
Но понятно, если мне надо будет вывести данные например не в колонку, а в строчку да ещё и таблицей.. то тут, конечно, спорить с Вами глупо, Вы правы.
В любом случае, если не брать во внимание то, что я хочу велосипед, второй предложенный Вами вариант мне понравился.
спустя 4 дня [обр] Владимир Лучанинов[досье]
Вот пример простейшего шаблонизатора без eval
http://php.southpark.com.ua/2008/your-smarty/
спустя 23 минуты [обр] Василий Ефремов[досье]
Да, спасибо Владимир, это именно то, о чем написал Андрей Пахомов во втором случае.
спустя 3 часа 13 минут [обр] xxx+++(4/10)[досье]

Василий Ефремов[досье] Шаблонизатором у Вас тут и не пахнет. Вы в конечном итоге все сводите к тому, что бы в скрипте генерировать HTML код. Об этом Андрей Пахомов[досье] Вам и написал.

Владимир Лучанинов[досье] Не надо давать дурацкие ссылки.

Василий Ефремов[досье] Вот Вам пример качественного шаблона. В качестве шаблонизатора выступает замечательная штука — PHP называется. Не поверите, но я полностью отделяю шаблон от кода программы:

Привет, меня зовут <b><?=$name?><b>!

Я живу в городе <?=$town?>. У меня много друзей:

<ul>
<? foreach($friends as $friend): ?>
     <li><?=$friend?></li>
<? endforeach; ?>
<ul>

<? if($girls): ?>
   ...и подруг!
<? else: ?>
   а вот подруг нет(((
<? endif; ?>

Переменные $name, $town, $friends и $girls генерирует программа — логика приложения. В шаблоне мы прописываем логику представления данных, т.е. их вывод. В шаблоне нет никакого кода приложения, только структуры управления, которые и занимаются выводом данных в том или ином виде.

спустя 32 минуты [обр] xxx+++(4/10)[досье]

В догонку: http://spectator.ru/technology/php/easy_templates

Единственное, с чем я не согласен в этой статье — в шаблоне не надо использовать встроенные функции PHP напрямую (Смирнов использует strtoupper, а нужно сделать какую-то абстракцию. Т.е. пускай придется написать функцию tpl_strtoupper(), в которую тупо запихнуть strtoupper, но это будет уже независимый от функционала PHP шаблон.

Лично у меня для подобного формирования текста есть класс format. Форматирование примерно так происходит:

<input type="text" maxlength="<?=$_HTML["ml_user_login"]?>" name="user_login" id="user_login" value="<?=$out->format($_HTML["user_login"], "entDec", "hsc")?>" />

Т.е. в качестве аргументов, после переменной, которую надо отформатить, я передаю ещё и имена методов и\или стандартных функций PHP, которые необходимо применить к данным. В данном случае "entDec" мнемоники преобразовывает "обратно", после чего делается "hsc" — htmlspecialchars с установленным ENT_QUOTES. Естественно, в классе есть методы и более сложные, но суть думаю понятна.

Powered by POEM™ Engine Copyright © 2002-2005