Pull to refresh

Comments 32

Хм… Мне вообще нравится синтаксис шаблонов такой:

Welcome!

{block: content}

В общем, сама идея — заключать логику в HTML комментарии (для указания начала/конца каких-то блоков, etc) и переменные в {}. Имхо это самый удобный вариант для верстальщика, который о PHP знает только по наслышке, зато профессионал в своем деле (HTML).
Всё это очень уныло по сравнению с Wicket'ом.
=)) Хабрапарсер укротил мой пример, обрезав комментарии HTML :) Ну, в общем, можете посмотреть HTML-сорцы хабра. Идея — та же. Только имхо эти самые HTML комментарии шаблонизатором должны обрезаться.
UFO landed and left these words here
UFO landed and left these words here
нельзя ли кинуть ссылку на альтернативную семантику, не совсем понял, о чем речь:

Примечание: автор знаком с альтернативной семантикой HTML тега, избавляющего от атрибутов “for” и “id”. Но это здесь не важно. Когда мы избавились от них вместе со множеством других, в таком виде смотрится более компактно.
Скушало теги. Еще раз:

<label>Label: <input type=text ...></label>
QuickForm — пройденный этап. Это как раз чистой воды хелпер с шаблоном в кавычках, о котором мы предостерегали. Чисто шовинистический программисткий подход без мысли о дизайнере и дизайне, как полноценной части разработки.

phpsavant это хорошо. Больше плюрализма, хорошего и разного!
о чем именно предостерегали?
ну если для вас css пустой звук, а про чтение документации вы забыли,
то рассказываю:
$form->addElement('text', 'name', 'Enter your name:', array('style' => '', 'class' => '', 'id'=> ''));
Да, да! Именно про это я и говорил, от чего надо отказываться.
Ваш вариант это почти хелперы из Symfony, только хуже.
Вы не поверите, если узнаете, что в back-end'е данной системы лежат хелперы Symfony (или почти они). То есть эти хелперы обернуты совершенно иным интерфейсом. Вы просто похоже пока не поняли сути этого интерфейса.
может проще будет описывать нужную форму через xml?

а за style — нужно руки отрывать. только class!

да и как( и кто) в вашем варианте будет описывать maxlength у текст-инпутов?
О боже! Ну пишите class, maxlength, onclick, все что душе угодно. Никаких ограничений в атрибутах нет. Вам же только пример показали.
UFO landed and left these words here
кстати о xml, как вы собираетесь написать <?xml version="1.0" encoding="UTF-8"?>? php это <?php, а не <? к которому вы привыкли со времен первого денвера!

и еще
<? form:: element('name', $name) ?> <label>Name:</label> <input type=«text» style=«width:100px»>
я правильно понимаю, что вы хотите воздействовать на следующую строку php кодом?
Забавно, что только после третьего своего комментария вы наконец стали догадываться, о чем речь в статье. Да, именно так. Но строчек там может быть не одна.
не переживайте, с пониманием у меня все хорошо.
зачем вы тогда мешаете код и верстку?
<? php form:: element('name', $name) ?>
<label>Name:</label> <input type=«text» style=«width:100px»>
<? php form:: element('test', $name) ?> <label>Test:</label>
<input type=«text» style=«width:100px»>

если уж хочется реализовать блочную модель обработки, то стоит обрабатывать формы так
<? php $form = new form();
$form->name = $name;
$form->test = $test;
$form->start(); //form:: start(array('name'=>$name))?>
<label>Name:</label> <input name=«name» type=«text» style=«width:100px»>
<label>Test:</label> <input name=«text» type=«text» style=«width:40px»>
<? php $form->stop();?>
В статье как раз рассказывается, как я попытался убрать из шаблона код и оставить только метки. Метки — неотъемлемая часть шаблона, даже если они сделаны в native PHP синтаксисе. Посмотрите, где вы видите код у меня? Только не формально, а содержательно. Как {var}, так и <?=$var?> это семантически не код, а метки. Так же как {block ...} и <? form:: element(...)?> не код, а метки блоков в разных синтаксисах. Вы же опять тяните одеяло назад именно к самому настоящему коду, на несколько строк, с присвоениями и т. д.

Даже если код вынесен в один блок, это делает шаблон еще менее удобным в работе. Теперь придется приводить в соответствие имя поля и переменной, которые отделены возможно десятками или сотнями строк друг от друга. Тот идентификатор, который можно было написать один раз, у вас надо повторить дважды. В таком случае лучше уж QuickForm.
Давайте проследим за ходом мыслей:
>В статье как раз рассказывается, как я попытался убрать из шаблона код и оставить только метки.
те разделить логику и представление, замечательно
>Метки — неотъемлемая часть шаблона, даже если они сделаны в native PHP синтаксисе.
хорошо, вводим еще одно понятие (так ли оно нужно)
>Посмотрите, где вы видите код у меня?
>Только не формально, а содержательно.
между <??>, также как и интерпретатор
>Как {var}, так и <?=$var?> это семантически не код, а метки.
хорошо, значит метки
>Так же как {block ...} и <? form:: element(...)?> не код, а метки блоков в разных синтаксисах.
да понял уже, что это называется метка (хотя как не назови)
>Вы же опять тяните одеяло назад именно к самому настоящему коду, на несколько строк, с присвоениями и т. д.
php native предполагает настроящий код в шалонах. вы перешли от
код -> представление к метка(код) -> представление
код вынеситься в контроллер, блок остается в представлении

>Даже если код вынесен в один блок, это делает шаблон еще менее удобным в работе.
очень спорное заявление, особенно когда вы строите модульную маштабируемую систему
>Теперь придется приводить в соответствие имя поля и переменной, которые отделены возможно десятками или сотнями строк друг от друга.
не забывайте что придется приводить код который отвечает за получение данных из этой формы, в тех же сотнях строк от вас, хотя чаше просто в отдельном файле
>Тот идентификатор, который можно было написать один раз, у вас надо повторить дважды.
дернормализация, что поделать
>В таком случае лучше уж QuickForm.
)
Вы ошиблись в самом первом посыле:

> те разделить логику и представление, замечательно

Логика и представление уже давно отделены. Мы здесь работаем исключительно с представлением и его (представления) логикой. Логику представления никуда отделить нельзя и не надо. Ее можно лишь замаскировать. Как такое делается в «кучерявых» шаблонах ясно, а как сделать это наиболее элегантно в native PHP — тема данной статьи.

Возможно у вас другое понятие об элегантности, но в моем мире кусок HTML кода, заключенный в кавычки и передаваемый параметром куда-то — это не корректно. Я нашел достаточно дешевый способ как этого избегать и с вами им поделился. А теперь вы поясните вашу позицию, почему данный метод не имеет права на существование. Я не спрашиваю, что вы предлагаете взамен, поскольку вас «шаблон в кавычках», как я понимаю нисколько не смущает.
>Логика и представление уже давно отделены.
хорошо, хорошо, не буду спорить.

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

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

остальное skiped

поясняю:
в контролере имеем привычное для любого программиста представление
<? php $form = new form();
$form->name = $name;
$form->test = $test;
$template->set('form', $form);
?>

в представлении имеем
<? php $form->start();?>
Name: Test: <? php $form->stop();?>
переведем в вид блоков для простоты {form}… {/form}, те для верстальшика вводиться только одна новая сущьность — блок form, в вашем случае вводиться куча сущьностей element, причем не стандартных, а в моем случае код стандартен.

про ошбики и возможность запутаться… тут есть 2 варианта:
— дебаг панель для верстальшика
— ошибки ловит программист, например с помошью автоматических тестов
Автора сделал свой выбор
Насяльника, опшипка однако ;)
Совсем затюкали несчастного автора.

Ну идея-то интересная.

Спасибо таки за статью ))
К Хабракодерам: а в чём смысл тега code? (пояснение: он код всё равно каверкается)

К автору статьи: стало таки интересно разобраться в том, как вызов form:: element('name', $name) изменяет/использует последующий тег input. Попробовал скачать Phella CMF и разобраться, но сходу в исходники не врубился. Там используется буфферизация вывода и регекспы или как? Статья сильно бы выиграла, если бы вы ясно и понятно раскрыли тайну форменной магии.

Успехов.
У вас совершенно правильная догадка. Буферизируется блок текста, обрамленный двумя вызовами:

form:: element('name', $name)
и
form:: element()

Закрывающий тег блока может быть опущен, если за ним следует другой открывающий тег:

form:: element('name', $name)
и
form:: element('country', $country, $countries)
и
form:: element()
Содержимое буфера анализируется на предмет того, что нас интересует. В данном случае теги элементов формы. Но применять данную методу можно и не только для форм, а везде в «трудных» местах, чтобы сохранить чистый и опрятный HTML в шаблоне.
Спасибо за пояснение.

Может стоит попытаться сократить статью, но поместить туда эту инфу, увеличив информационную плотность текста? Ну да это ИМХО ))

Идея очень интересная, видимо напишу свою реализацию (код Phella CMF мне показался неудобоваримым).

Успехов.
Дело в том, что та реализация завязана на используемую в фреймворке надстройку над HTTP. (Надстройка эта тоже очень нестандартная и вызвала бы бурю негодования, попади сюда.) Так например, там отсутствует второй параметр для form:: element, добавленый здесь, чтобы не смущать умы. Если требуется реализация, втыкаемая в любое «стандартное» место, то да, надо писать заново.
Sign up to leave a comment.

Articles