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

Фантазер

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

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

Спасибо.
 

alexhemp

Новичок
Фантазер

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

Что-то вроде:
Код:
function exec_template($template, $data) {
    extract($data);
    include($template);
}
 

Фанат

oncle terrible
Команда форума
Дмитрий Смирнов называет это "Шаблоны в 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');
?>
...
Ладно, спасибо за ответ.
 

Фанат

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

-~{}~ 22.02.06 15:15:

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

Фантазер

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

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

mySelectWidget

или

tmplSelectWidgets['myFieldName']

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

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

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

foreach ($data as $row)

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

Фанат

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

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

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

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

Фантазер

Новичок
Фанат, хотелось бы заметить что

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

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

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


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

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

mySelectWidget
или
tmplSelectWidgets['myFieldName']


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

Фанат

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

Фантазер

Новичок
Автор оригинала: не Фанат
как насчет интерфейсов бэкофисов? когда надо отрисовывать кучу форм?
Не очень понял вопрос. Интерфейсы бэкофисов, в частности, я также имею в виду, задавая вопросы.
Извинияюсь, -- не заметил, что автор другой.

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

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

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

Фанат

oncle terrible
Команда форума
Не очень понял вопрос.
Это был вопрос мне
Я также, как и Вы считаю 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 :) -- вот от этого хочу избавиться как раз.
 

Фанат

oncle terrible
Команда форума
пускай этот хардкодед хтмл будет изолирован в этих функциях
Я также, как и Вы считаю html в коде недопустимым
прости,я не могу продолжать беседу с человеком, который высказывает абсолютно противоположные утверждения.
выбери что-то одно - тогда продолжим.
и в копипасте решения не увидел.
99% проблем у людей, использующих пхп, происходят не от подхода, а от реализации.
Я таки написал класс. Он конечно ужасен, но в простых случаях
а я беру и копирую тот самый кусок, который есть поприведённой выше ссылке.
и когдас лучай перестаёт быть простым, это ЗДОРОВО экономит мне силы и время.
 

Фантазер

Новичок
И еще немного про копипаст -- я наверное убогий программист -- я делаю ошибки, когда пишу код. Так вот -- копипаст добавляет вероятность ошибки -- скопировал соседний селект, а то место, где выбирается атрибут selected -- забыл, и там осталась переменная из соседнего списка. -- И пойди пойми потом -- где не работает и почему.
 

Фанат

oncle terrible
Команда форума
ну что за детский сад?
ну вот, блин, идеальная иллюстрация к тому, что я говорил:
99% проблем у людей, использующих пхп, происходят не от подхода, а от реализации.
проблема с копированием куска кода, рисующего ТОТ ЖЕ САМЫЙ селект, и принимающего в параметрах ТУ ЖЕ САМУЮ переменную, приведёт к ТЕМ ЖЕ САМЫМ проблемам.
НО, при этом сваливается на неправильный подход.

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

Фантазер

Новичок
пускай этот хардкодед хтмл будет изолирован в этих функциях

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

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

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

-~{}~ 22.02.06 16:54:

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

Код конструктора?!!! Нет -- я-то пишу одну строчку -- вызов функции и два параметра -- имя переменной (оно же имя элемента формы), и название массива, который содержит элементы списка. Все :)
 

master_x

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

Фантазер

Новичок
Фанат Возможно мы опять малость сбились с дискуссии.

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

Мы не обсуждаем смарти или еще что-то.
 

Фанат

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

-~{}~ 22.02.06 17:01:

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

-~{}~ 22.02.06 17:03:

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