Концепции работы шаблонизатора

  • Автор темы Автор темы DexizeR
  • Дата начала Дата начала
Я вот Вас давно хочу спросить -- а как этот шаблон вызывается? Внутри функции, где переменные из массива с данными экстрактятся в область данных функции и там же шаблон прогоняется через eval() или он просто инклюдится и все переменные там глобальные?

И маленький подвопрос: а как избежать конфликтов имен -- например вдруг в данных есть переменная
$row -- а вы ее в цикле используете? И как уберечь автора кода от конфликтов с автором шаблона?

Спасибо.
 
Фантазер

Сделать include в ф-ции. Данные передавать через параметр.

Что-то вроде:
Код:
function exec_template($template, $data) {
    extract($data);
    include($template);
}
 
Дмитрий Смирнов называет это "Шаблоны в PHP для чайников".
Я вполне согласен с его определением =)

Нет, никаких функций с евалами.
Шаблон инклюдится в скрипт.

Вопрос про конфликт не понял.
Скрипт готовит все переменныя для шаблона.
Точнотак же, как ЛЮБОЙ другой шаблонный движок.
и смарти точнотак же назначит для {$TITLE} "неправильное" значение переменной $TITLE, к примеру, если там произойдёт какоё-то конфликт.
И без шаблонов будет та же самая байда. Так что я не понял, какое это всё имеет отношение к шаблонам.
 
Автор оригинала: Фанат
Дмитрий Смирнов называет это "Шаблоны в PHP для чайников".
Забавно, что нас с ним зовут одинаково :)
Статью однако нашел и прочитал.

Автор оригинала: Фанат
Шаблон инклюдится в скрипт.
Угу -- причем если я хочу вывод получить в переменную, то надо

пользоваться функцией типа:
PHP:
function get_include_contents($filename,$vars) {
   if (is_file($filename)) {
       extract($vars);
       ob_start();
       include $filename;
       $contents = ob_get_contents();
       ob_end_clean();
       return $contents;
   }
   return false;
}


В принципе ничего не мешает в таком шаблоне обращаться и к функциям в классе (если мы делаем вывод шаблона внутри класса):

PHP:
...
<?php
echo $this->buildSelectDropDown('myselect',$myVal,'mySelectOptions');
?>
...

Ладно, спасибо за ответ.
 
Угу -- причем если я хочу вывод получить в переменную, то надо
пользоваться функцией типа:
в общем, да, но, к сожалению, 95% людей, использующих пхп, действуют по принципу "заставь дурака богу молиться".
Поэтому я столь свирепо отношусь к любым отступлениям от "правильного" кода на форуме.
Не потому, что я тупой педант, который сам никогда не применяет буфферинг.
А потому, что те самые 95% тут же хватаются за исклюение, как за правило.

-~{}~ 22.02.06 15:15:

$this->buildSelectDropDown
это не шаблон, а перемешка пхп с хтмл.
избавьте этот топик от таких кодов.
 
Автор оригинала: Фанат
это не шаблон, а перемешка пхп с хтмл.
избавьте этот топик от таких кодов.
Этта, уже и вопрос задать нельзя? Что значит избавьте?

Окей, то есть Вы считаете правильным заранее подготовить вывод селекта с опциями в переменную

mySelectWidget

или

tmplSelectWidgets['myFieldName']

и ее использовать в шаблоне?

Угу -- разумно в общем-то.

Про конфликты вопрос в общем-то второстепенный. Просто у Вас в примере цикл имеется, вроде этого:

foreach ($data as $row)

ну и конфликт может возникнуть, если в $row окажутся данные, передаваемые в шаблон. Но это конечно решается, когда Скрипт готовит все переменныя для шаблона и программист ничего не забыл. Плюс можно облегчить жизнь если служебные переменные в шаблоне обзывать как-нибудь с префиксом -- чтобы не ошибиться.
 
Я считаю, что в коде не должно быть ни одного тега html.
да, при этом больше логики вылазит в шаблон. но если этого не делать, тотогда вообще сама идея шаблонизации ТЕРЯЕТ СМЫСЛ

(по хорошему, в коде вообще не должно быть прописано даже plain text-а, но я пока не готов обсуждать эту тему. новопрос решаемый, вполне).

Но.
поскольку мы говорим о ШАБЛОНАХ, об изменении внешнего вида приложения (при том же наборе данных), БЕЗ залезания в код, то всякие формирования хтмл внутри скрипта - в переменную ли, в функции ли - предлагаю здесь считать оффтопиком.

в этом смысле, популярный HTMLquickform, как раз представляется мне пятой колонной в стане шаблонов.
как и любые другие скрипты, производящие готовый хтмл код
 
Фанат, хотелось бы заметить что

1. В данном топике я спрашиваю, а не советую, поэтому мой код иллюстрация того, как я понимаю Ваши слова.

2. Я хочу понять, как Вы рекомендуете делать шаблон. Мне это интересно и кажется полезным, поэтому я задаю вопросы.

Автор оригинала: Фанат
<?php echo $this->buildSelectDropDown(); ?>


это не шаблон, а перемешка пхп с хтмл.
избавьте этот топик от таких кодов.
и

Автор оригинала: Фанат
Окей, то есть Вы считаете правильным заранее подготовить вывод селекта с опциями в переменную

mySelectWidget
или
tmplSelectWidgets['myFieldName']


Я считаю, что в коде не должно быть ни одного тега html.
Мне кажется тут имеется противоречие. Как Вы предлагаете тогда выводить выпадающие списки в формах? Или формы под понятие шаблона не подпадают (извиняюсь, забыл сразу уточнить) и предлагается считать их офтопиком?
 
В данном топике я спрашиваю, а не советую
А я отвечаю, а не убиваю ;-)
Как Вы предлагаете тогда выводить выпадающие списки в формах?
в приведённом мной примере есть код постраничного вывода.
предлагаю его самостоятельно переписать под вывод селекта.
Или формы под понятие шаблона не подпадают
Из моих слов следует прямо пртивоположный вывод.
 
Автор оригинала: не Фанат
как насчет интерфейсов бэкофисов? когда надо отрисовывать кучу форм?
Не очень понял вопрос. Интерфейсы бэкофисов, в частности, я также имею в виду, задавая вопросы.
Извинияюсь, -- не заметил, что автор другой.

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

Теперь, Вы говорите, что вопрос вывода списка решается аналогично выводу постраничного вывода в Вашем примере. Это мне каждый селект так расписывать? Да во всех формах, что имеются? Ой-ой... это я скончаюсь в мучениях набирая такие шаблоны.

Это же касается и постраничного вывода -- эта задача, которую (мне по крайней мере) очень хочется вынести в функцию и не писать руками каждый раз.
 
Не очень понял вопрос.
Это был вопрос мне
Я также, как и Вы считаю html в коде недопустимым. Но Вы в добавок также считаете недопустимым вызов функции из шаблона
функция делает что? выводит html код?

-~{}~ 22.02.06 16:17:

Это мне каждый селект так расписывать? Да во всех формах, что имеются? Ой-ой...
это кажущаяся проблема.
копипаст ещё никто не отменял.

собственно, это одно из распространённейших заблуждений - ужас перед одинаковыми кусками кода и стремление к унификации.
при том, что унификация ВСЕГДА порождает ОГРАНИЧЕНИЕ функциональности.
В каких-то деталях разные формы всё равно различаются. И если ты написал функцию, то дальше тебе придётся снабжать еёбесчисленным множеством дополнительных параметров.
в результате ты получишь СТОЛЬКО ЖЕ КОДА, только не чистого хтмл, а заумного пхп.

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

-~{}~ 22.02.06 16:22:

в дополнение к предыдущему.
я до сих пор, за 6 лет работы с пхп,так и не написал функцию, которая выводит данные из таблицы SQL в таблицу HTML
хотя казалось бы?
а вот только копни - ...

-~{}~ 22.02.06 16:31:

master_x
сложный вопрос.
я частично на него ответил выше.
но только частично. Действительно, проблема есть.
Я, наверное, не готов на него ответить.
проблема в том, что алтернативные решения страдают недостатками, о которых я говорил.
Поэтому по возможности, можно либо унифицировать сами формы (ну сколько их РАЗНЫХ, а не единообразных нужно для бэкофиса?) ну если нужно много - то и рисовать много.
в принципе, разница невелика, что писать
$my_form_constructor->draw_textarea('param'-'param'-'pam'-'pam',)
что писать
<textarea rows cols><?=$var?></textarea>
 
Фанат
функция делает что? выводит html код?
Да. Именно так. Вы спросите, а на основании чего она выводит этот код, не наличествует ли этот хтмл внутри функции?

Отвечу -- нет, не наличествует. Однако добавляется еще одна сложность -- шаблон вывода элементов формы. Это может быть, как банальный массив со строками-шаблонами для элементов формы, которые прогоняются через eval(), так и класс, методы которого рисуют элементы формы (вы же любите, чтоб было все просто -- пускай этот хардкодед хтмл будет изолирован в этих функциях -- вариации оформления хтмл тегов select и option -- крайне незначительны -- их легко запрограммировать).

Фанат
это кажущаяся проблема.
копипаст ещё никто не отменял.
Хм. Ну я тут не буду настаивать в смысле спорить. Но для себя -- не соглашусь. За 6 лет, что я занимаюсь пхп :) я об эти селекты, программируемые копипастом обспотыкался будь здоров. И для меня эта проблема не кажущаяся... т.е. я ее почуствовал :) и в копипасте решения не увидел. Более того, введение функции было вполне себе чувствительным -- стало легче.

Фанат
я до сих пор, за 6 лет работы с пхп,так и не написал функцию, которая выводит данные из таблицы SQL в таблицу HTML
хотя казалось бы?
а вот только копни - ...
Я таки написал класс. Он конечно ужасен, но в простых случаях (а их довольно много -- берет и работает). Там кроме ужаса обычного еще и ужас xslt :) -- вот от этого хочу избавиться как раз.
 
пускай этот хардкодед хтмл будет изолирован в этих функциях
Я также, как и Вы считаю html в коде недопустимым
прости,я не могу продолжать беседу с человеком, который высказывает абсолютно противоположные утверждения.
выбери что-то одно - тогда продолжим.
и в копипасте решения не увидел.
99% проблем у людей, использующих пхп, происходят не от подхода, а от реализации.
Я таки написал класс. Он конечно ужасен, но в простых случаях
а я беру и копирую тот самый кусок, который есть поприведённой выше ссылке.
и когдас лучай перестаёт быть простым, это ЗДОРОВО экономит мне силы и время.
 
И еще немного про копипаст -- я наверное убогий программист -- я делаю ошибки, когда пишу код. Так вот -- копипаст добавляет вероятность ошибки -- скопировал соседний селект, а то место, где выбирается атрибут selected -- забыл, и там осталась переменная из соседнего списка. -- И пойди пойми потом -- где не работает и почему.
 
ну что за детский сад?
ну вот, блин, идеальная иллюстрация к тому, что я говорил:
99% проблем у людей, использующих пхп, происходят не от подхода, а от реализации.
проблема с копированием куска кода, рисующего ТОТ ЖЕ САМЫЙ селект, и принимающего в параметрах ТУ ЖЕ САМУЮ переменную, приведёт к ТЕМ ЖЕ САМЫМ проблемам.
НО, при этом сваливается на неправильный подход.

Ё! нукакая ж разница, что ты копипастишь - код конструктора, или хтмл?
 
пускай этот хардкодед хтмл будет изолирован в этих функциях

Я также, как и Вы считаю html в коде недопустимым

в одном из двух предложенных варинатов хтмл был упрятан в системный массив -- это для тех, кто догматик. Он безусловно лучше второго варианта, но малость сложнее. Я и так и так пробовал -- нормально работало :)

Ну не знаю, наверное ты (мы на ты перешли?) очень талантливый копипастер. У меня копипаст код рос, как снежный ком, до того момента, когда разобрать становилось не возможно что же он делает.

-~{}~ 22.02.06 16:54:

Ё! нукакая ж разница, что ты копипастишь - код конструктора, или хтмл?

Код конструктора?!!! Нет -- я-то пишу одну строчку -- вызов функции и два параметра -- имя переменной (оно же имя элемента формы), и название массива, который содержит элементы списка. Все :)
 
Фанат
собственно, это одно из распространённейших заблуждений - ужас перед одинаковыми кусками кода и стремление к унификации.
понимаешь ведь какая штука, унификация- это не плохо, а даже хорошо вкупе с предварительным проектированием. а вот этот сценарий:
при том, что унификация ВСЕГДА порождает ОГРАНИЧЕНИЕ функциональности.
В каких-то деталях разные формы всё равно различаются. И если ты написал функцию, то дальше тебе придётся снабжать еёбесчисленным множеством дополнительных параметров.
в результате ты получишь СТОЛЬКО ЖЕ КОДА, только не чистого хтмл, а заумного пхп.
это уже извини, головотяпство. это пример плохого проектирования.
Насчет бэкофиса:
реализация селекта сводится к простейшей функции select($name, $arr_items, $selected). Все. Никакого копипаста.
И так можно со всеми элементами.
 
Фанат Возможно мы опять малость сбились с дискуссии.

Мы обсуждаем шаблоны, реализуемые черех пхп, и вопрос в допустимости вызова функции, которая, ну и т.д.

Мы не обсуждаем смарти или еще что-то.
 
ну, естественно, копипастить нужно с чисткой.
но в этом-то и заключается смысл шаблона- ты МЕНЯЕШЬ старое оформление на новое. То есть, не столько чистишь, сколько просто заменяешь.

-~{}~ 22.02.06 17:01:

master_x
реализация селекта сводится к простейшей функции select($name, $arr_items, $selected).
а если надо какой-нибудь дхтмльный onclick всунуть?

-~{}~ 22.02.06 17:03:

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