PHP: про eval и его друзей :-)

Mammoth

Guest
Автор оригинала: Crazy
Шаблоны -- независимо от того, допускают ли они использование PHP-кодов -- можно разделить на следующие группы:

1. Исполняемые непосредственно PHP-энжином (приведенный мной вариант).
2. Исполняемые энжином, написанным на PHP.
3. Прпеобразуемые (при первом обращении или специальной командой) в код, непосредственно исполняемый PHP.

Ну и, разумеется, смешанные варианты. Для начала вопрос: какой подход использует упомянутый тобой энжин?
Компилирование в код ПХП.
 

Crazy

Developer
Автор оригинала: Mammoth
Приведи пример кода и темплейта, который выводит это:
Это неспортивно. В мой энжин входит функция markup_select() с очевидной семантикой. :)
 

Crazy

Developer
Компилирование в код ПХП.
О! Тогда вопрос по существу: не обращал ли ты внимания, производится ли при этом защита от конкурентной компиляции?

Второй вопрос: если в скомпиленном коде возникают ошибки, то производится ли трансляция их номеров в номера, соответствующие исходному шаблону? Лично я на этом обломался.
 

Mammoth

Guest
Да, согласен, это неспортивно...

Но если бы я в жизни столкнулся с такой задачей, которую ты поставил, то я решал бы ее по-другому - в концепции Смарти. И там бы это выглядело гораздо менее громоздко.
 

Mammoth

Guest
Автор оригинала: Crazy

О! Тогда вопрос по существу: не обращал ли ты внимания, производится ли при этом защита от конкурентной компиляции?

Второй вопрос: если в скомпиленном коде возникают ошибки, то производится ли трансляция их номеров в номера, соответствующие исходному шаблону? Лично я на этом обломался.
Первый вопрос - да. Второй - не знаю.
 

Crazy

Developer
Автор оригинала: Mammoth
я решал бы ее по-другому - в концепции Смарти. И там бы это выглядело гораздо менее громоздко.
У меня получилось вот так (для первого селекта):

PHP:
<?php echo
markup_select(
  array("name"=>"Date_Month"), Null,
  array(1=>"January",2=>"February",3=>"March",
4=>"April",5=>"May",6=>"June",
7=>"July",8=>"August",9=>"September",
10=>"October",11=>"November",12=>"December"),
  $month);
?>
Код пишу без проверки, так что возможны очепятки. Без "1=>" и иже с ними, в принципе, можно было бы обойтись.

А как это будет выглядеть на Смарти?
 

Mammoth

Guest
Темплейт: {html_select_date}

ПХП:

PHP:
<?php
require 'Smarty.class.php';
$smarty=new Smarty;
$smarty->display('1.tpl');
?>
 

Mammoth

Guest
Вышеприведенный код, само собой для всего ХТМЛ-вывода... :)
 

Crazy

Developer
А если я захочу месяцы с нуля или трехбуквенными индексами?
 

Mammoth

Guest
Автор оригинала: Crazy
А если я захочу месяцы с нуля или трехбуквенными индексами?
У html_select_date 21 параметр, но такого изврата, как январь - нулевой месяц - нет. Трехбуквенный индекс - есть
 

Crazy

Developer
(а русский язык есть? :) )

Собственно, ничего неожиданного нет -- вшитые в энжин фичи использовать легко. Готовой функции вроде markup_date у меня нет, посему и получается кучерявее. :)

Но вернемся к компиляции шаблонов. Как ведет себя Смарти при возникновении ошибки? Выкидывает родной сообщение энжина PHP или делает что-то более интеллектуальное?

Я пытался сохранять в отдельном файле информацию о номерах строк исходного шаблона и при возникновении ошибки выводит дополнительное указание на строку исходного шаблона. Но выходило это криво и косо, поскольку часто ошибка детектируется не в реальном месте возникновения, а не последующем коде, возникшем при компиляции. И указания на ошибки становились не только шизофреническими, но и просто вводили в заблуждение.

Проверь, please, как будет себя вести Смарти.
 

Mammoth

Guest
Автор оригинала: Crazy
(а русский язык есть? :) )

Собственно, ничего неожиданного нет -- вшитые в энжин фичи использовать легко. Готовой функции вроде markup_date у меня нет, посему и получается кучерявее. :)
html_select_date не относится к встроенным в энджин функциям, хотя и является стандартным. Стандартным плагином. В виде ПХП-файла. Так что есть у дизайнера (верстальщика) желание писать русскими буквами - вопрос к программеру и нет проблем. Решается тривиально.

Автор оригинала: Crazy
Но вернемся к компиляции шаблонов. Как ведет себя Смарти при возникновении ошибки? Выкидывает родной сообщение энжина PHP или делает что-то более интеллектуальное?

Я пытался сохранять в отдельном файле информацию о номерах строк исходного шаблона и при возникновении ошибки выводит дополнительное указание на строку исходного шаблона. Но выходило это криво и косо, поскольку часто ошибка детектируется не в реальном месте возникновения, а не последующем коде, возникшем при компиляции. И указания на ошибки становились не только шизофреническими, но и просто вводили в заблуждение.

Проверь, please, как будет себя вести Смарти.
Судя по документации, Смарти отлавливает синтаксические ошибки в темплейте (показывая варнинги и фатал ерроры, с указанием имени темплейта, номера строки и описания ошибки), а также парсинг ерроры (со ссылкой на номер строки скомпилированного ПХП-кода). У самого у меня пока не было времени все это проверить. Работа, блин :)
 

Crazy

Developer
Автор оригинала: Mammoth
html_select_date не относится к встроенным в энджин функциям, хотя и является стандартным. Стандартным плагином.
Дык значит и с нуля можно сделать. :)
 

Crazy

Developer
Следующий этап наших извращений -- шаблоны на базе XML. Но это, вероятно, уже завтра, ибо сейчас под рукой нет исходников проекта...
 

Mammoth

Guest
Не... до этого я еще не дорос. Нет такой необходимости. Абсолютно.
 

Mammoth

Guest
Хорошо. Не уверен. Но тогда до понедельника. В выходные я отдыхаю...
 

Crazy

Developer
Ok. Я постараюсь кинуть до того времени текстик на эту тему -- может и еще кому будет любопытно.
 
Сверху