Концепции шаблонов: 2 подхода

Crazy

Developer
Автор оригинала: [DAN]
Я не реализую MVC
Мой вопрос не имеет отношения к MVC.

Все запросы идут через "главный контроллер", который (в соответствии с конфигом) инициализирует требуемые классы "моделей" и собирает от них данные.
Т.е. если есть набор опционально добавляемых данных, то верстальщик должен предварительно каждый раз при их использовании уведомлять программиста?
 

Макс

Старожил PHPClub
упс, c именами блоков поспешил
шаблон будет выгялдеть примерно так:
Код:
<!-- BEGIN row_email --> 
          <td class="menu_a" nowrap> 
            <a href="mailto:{email}"> 
              <img src="/images/mail.gif" width="25" height="10" 
alt="написать письмо" border="0"> 
            </a> 
            <img src="/images/zero.gif" width="10" height="10" border="0"> 
          </td> 
  <!-- END row_email --> 
  <!-- BEGIN no_email -->
          <td><img src="/images/zero.gif" width="1" height="10" border="0"></td> 
  <!-- END no_email -->
 

Crazy

Developer
Доступны ли аналоги приведенной ниже конструкции и если да, то каков синтаксис?

Код:
 if ($row['firstName'] && ($row['email'] || $row['homepage])) {
  ....
}
 

Фанат

oncle terrible
Команда форума
Crazy, хотелось бы, все-таки, таких конструкций избежать...
Хотя, если встанет необходисость, вот об этом я и говорил.
 

Макс

Старожил PHPClub
Crazy
то что я привел - это шаблон. Управление им (какой блок показывать, какой - нет) делается ручками в скрипте.
Код:
<!-- BEGIN row -->
 <tr>
    <td> 
     ..... /// показываем данные
   </td>
 </tr>
<!-- END row -->
<!-- BEGIN no_row -->
<tr><td>No row </td></tr>
<!-- END no_row -->
А в скрипте
PHP:
if ($row['firstName'] && ($row['email'] || $row['homepage'])) {
   $tpl->touchBlock('row'); // показываем блок row
   ... // устанавливаем метки
} else {
   $tpl->touchBlock('no_row'); // показываем блок no_row
}
 

[DAN]

Старожил PHPClub
Автор оригинала: Crazy Т.е. если есть набор опционально добавляемых данных, то верстальщик должен предварительно каждый раз при их использовании уведомлять программиста?
Данных, добавляемых куда ?
Если в шаблон, то к программисту это имеет мало отношения. Верстальщик с помощью стандартных логических конструкций легко может сам добавить их в шаблон (a la Подход №2).
Еже ли данные добавляются в саму модель той или иной т.н. компоненты, то, естесственно, меняется как сама модель (XML), так и контроллер, и представление (XSLT). Второй вариант, имхо, очевиден.

Кстати, в этом случае как раз и проявляются плюсы технологии XML+XSLT.

Скажу более. Даже если необходимо существенно изменить логику отображения данных, это не составит труда, потому как при грамотном распределении ролей между php и xslt одна из технологий (обычно xslt) берет на себя максимальное число изменений, тогда как в php-коде нужно будет поменять, ну, скажем, два десятка строк кода.
 

[DAN]

Старожил PHPClub
Мне бы хотелось сместить наш диалог несколько в другую плоскость в рамках заданного вопроса.
Как в контексте Подходов 1 и 2, описаных тов. Yurik, удобнее реализовывать html-формы и их обработку ?
 

Макс

Старожил PHPClub
[DAN]
Как в контексте Подходов 1 и 2, описаных тов. Yurik, удобнее реализовывать html-формы и их обработку ?
а в чем ты видишь разницу в обработке форм для обоих подходов ?
 

[DAN]

Старожил PHPClub
Ок. Допустим, стоит задача разместить 7-10 форм на сайте, отличающихся друг от друга.
Используя 1-й подход, для каждой формы придется рисовать своё отображение и, очевидно, свой обработчик.

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

Crazy

Developer
Автор оригинала: [DAN]
Данных, добавляемых куда ?
Если в шаблон, то к программисту это имеет мало отношения. Верстальщик с помощью стандартных логических конструкций легко может сам добавить их в шаблон (a la Подход №2).
Показываю на примере. Есть надцать шаблонов различных страниц. Есть 100 плагинов, которые умеют извлекать информацию из разных источников, формируя список последних 10 сообщений гостевой книги, 10 самых скачиваемых файлов и т.п.

Верстальщие при создании шаблона может счесть уместным сопроводить основной информационный блок несколькими плагинами.

Какие действия он для этого доджен предпринять?

1. Вписать нечто в XSL. Что именно?
2. Придти к программисту и сказать: братушка, переиграй мне структуру документа на страницах X и Y, чтобы добавить туджа информацию из плагинов foo и bar!
3. Нечто иное. Что именно?
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: [DAN]
Ок. Допустим, стоит задача разместить 7-10 форм на сайте, отличающихся друг от друга.
Используя 1-й подход, для каждой формы придется рисовать своё отображение и, очевидно, свой обработчик.

Используя второй подход, интуитивно чувствую, можно весь процесс упростить. Но пока не знаю, как.
Про pear'овские классы знаю, поэтому заранее прошу на них не ссылаться. Там своя специфика.
Я не совсем понял вопрос: речь о том, чтобы описать поля формы, данные по умолчанию и все проверки введённых данных в самом шаблоне? Такие решения есть, одно из них называется, насколько мне известно, ASP.Net. :D

Но при этом даже в случае 'push'-движка рисовать шаблоны на каждую форму не обязательно.

Сошлюсь, естественно, на PEAR'овские классы. :D

Есть HTML_QuickForm, умеющий выводить формы в шаблоны, работающие по 'push'-модели. При этом у него по два способа вывода: Static и Dynamic, в первом случае на каждую форму --- свой шаблон, во втором случае --- один шаблон на сайт, в котором заданы блоки описывающие внешний вид полей, окончательно форма собирается из этих кусочков.

При этом структура формы определяется в скрипте, не в шаблоне.
 

Sad Spirit

мизантроп (Старожил PHPClub)
Команда форума
Автор оригинала: Crazy
Показываю на примере. Есть надцать шаблонов различных страниц. Есть 100 плагинов, которые умеют извлекать информацию из разных источников, формируя список последних 10 сообщений гостевой книги, 10 самых скачиваемых файлов и т.п.

Верстальщие при создании шаблона может счесть уместным сопроводить основной информационный блок несколькими плагинами.

Какие действия он для этого доджен предпринять?
Кстати в случае шаблонов, которые тут приводит в пример Maxim Matyukhin (я думаю речь о моём HTML_Template_Sigma или о HTML_Template_IT) задача более-менее решаема.

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

redbaron

Guest
Автор оригинала: [DAN]
Ок. Допустим, стоит задача разместить 7-10 форм на сайте, отличающихся друг от друга.
Используя 1-й подход, для каждой формы придется рисовать своё отображение и, очевидно, свой обработчик.

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

У меня, например, обработчик для формы стандартный либо create либо modify.

и именно в дизайне решаеться какое поле нужно вводить и как его проверять.

Вообщемто сейчас обработка форм сводится почти к одному дизайну форм.

PHP:
<rbns:form name='frm' method='post' submitname='sbmt' shownotsuccesonly='false' succesmethod='create' >

	<table width="90%" align="center" border="0" cellspacing="0" cellpadding="3" class="textgross">

	<tr>
		<td>Team login:</td>
		<td> <rbns:input type="text" name="login" maxlength="32" /><rbns:error name='login' check='isUnique' param="'registr','login'" ><br/><span class='err'>{?errorstream('loginMustBeUnique')?}</span></rbns:error>
             <rbns:error name='login' check='check_login' ><br/><span class='err'>{?errorstream('logininvalid')?}</span></rbns:error>
            </td>
		<td></td>
		<td></td>
		<td></td>
  	</tr>
	<tr>
		<td>Team password:</td>
		<td><rbns:input type="text" class="txtinput" name="password" maxlength="32"/>
             <rbns:error name='password' check='is_vs' ><br/><span class='err'>{?errorstream('textinvalid')?}</span></rbns:error>
             </td>
		<td></td>
		<td></td>
		<td></td>
  	</tr>
	<tr>
		<td>Repeat password:</td>
		<td><rbns:input type="text" class="txtinput" name="password2"   maxlength="32"/>
                                <rbns:error name='password' check='is_vs' ><br/><span class='err'>{?errorstream('textinvalid')?}</span></rbns:error>
                          		<rbns:error name='password2' check='is_equal' param='{?_REQUEST[password]?}' ><br/><span class='err'>{?errorstream('PasswordMustBeSame')?}</span></rbns:error>
            </td>
		<td></td>
		<td></td>
		<td></td>
  	</tr>

	<tr>
  		<td colspan="5"><b>Members:</b><br><br></td>
	</tr>

	<tr valign="top">
 		<td>Member 1 - </td> 
    	<td><rbns:input type="text" name="name1" size='70'  maxlength="255" />
            <rbns:error name='name1' check='check_alpha'><br/><span class='err'>{?errorstream('nameinvalid')?}</span></rbns:error>
            </td>
		<td></td>
		<td></td>
		<td></td>
	</tr>		
	<tr valign="top">
 		<td>Member 2 - </td> 
    	<td><rbns:input type="text" name="name2" size='70'  maxlength="255" />
    		<rbns:error name='name2' check='check_alpha'  ><br/><span class='err'>{?errorstream('nameinvalid')?}</span></rbns:error>
    		</td>
		<td></td>
		<td></td>
		<td></td>
	</tr>	

	<tr>
 		<td></td> 
    	<td></td>
		<td></td>
		<td></td>
		<td align="right"><input type="submit" name="sbmt" value="Save data" class="xpbutton_huge" ></td>
	</tr>		
	
	</table>
</rbns:form>
Прошу принять во внимание, что нам приходиться работать наоборот, т.е. по готовому HTML коду. Поэтому здесь присутсвует не дизайнер-frendly обработчик ошибок
PHP:
<rbns:error name='login' check='isUnique' param="'registr','login'" ><br/><span class='err'>{?this::errorstream('loginMustBeUnique')?}</span></rbns:error>
, но если бы работать нормально, то просто пишеться новый обработчик ошибки без параметров.

Да, и не стоит относиться к дизайнеру как к жвачному животному.
 

[DAN]

Старожил PHPClub
Автор оригинала: Crazy ...Верстальщие при создании шаблона может счесть уместным сопроводить основной информационный блок несколькими плагинами.

Какие действия он для этого доджен предпринять?
Если эти плюгины формируют и выдают данные контроллеру, тогда верстальщик в нужное место просто вставляет строку вида
PHP:
<xsl:apply-templates select="./last_news"/>
и "рисует" шаблон
PHP:
<xsl:template match="last_news">(тут идет html + некое представление данных)</xsl:template>
, либо юзает готовый.

Это всё, что нужно знать верстальщику.

Если на данной конкретной странице вызов плюгинов не предусмотрен, тогда надо сказать программеру, чтоб подключил их. Либо, если дизигнер продвинутый, поправить самому ручками конфиг. Вариаций на эту тему предостаточно. Допустим, можно юзать rss, который программер отдает по определенному запросу. Можно предоставить систему web-сервисов.
 

[DAN]

Старожил PHPClub
Про формы.
Опишу конкретную ситуацию. Опять же 7-10 форм.
В процессе написания и тестирования приложения заказчик изъявляет желание поменять число полей форм, их тип, расположение и т.д. Идет процесс утряски. Необходимо, чтобы заказчик всё видел "в действии".
Как в этом случае обойтись малой кровью ? Я опускаю вопросы хранения данных, но их обработка существенна.

Как я делаю на сегодняшний день. Юзается FastTemplate. Пишутся шаблоны форм, в них описываются переменные формы. Скрипт пробегает каждое (нужное) поле формы методами класса-валидатора и дальше что-то делает.
Вышеописанная ситуация вынуждает делать много ненужных действий, как то:
*) изменять шаблоны форм
*) изменять процесс валидации формы
*) менять бизнес-логику приложения

Хотелось бы свернуть эти действия в одно или хотя бы минимизировать их.
 

Crazy

Developer
Автор оригинала: [DAN]
Если эти плюгины формируют и выдают данные контроллеру
Как контроллер узнает, какие именно плагины активировать? Все 100 на каждый запрос?
 

[DAN]

Старожил PHPClub
Автор оригинала: Crazy
Как контроллер узнает, какие именно плагины активировать? Все 100 на каждый запрос?
Если у тебя архитектура "плагинная", можно придумать механизм функций обратного вызова (благо xslt позволяет внутри себя юзать php). Что-то похожее на JSP. В моем случае в конфиге определяется, по какому запросу загружается тот или иной модуль + грузятся несколько "дефолтных" модулей.

Я немного о другом аспекте архитектуры, именно об удобном использовании связки xml+xslt в web-приложениях, как о системе шаблонов. С использованием этих технологий простор для маневров получается более широким. Причем, комбинируя подходы 1, 2 можно добиться большой гибкости в настройке приложения.
Единственный момент, который я так и не прорюхал, это как к этому делу прикрутить формы.
 

redbaron

Guest
Автор оригинала: [DAN]
Про формы.

Вышеописанная ситуация вынуждает делать много ненужных действий, как то:
*) изменять шаблоны форм
*) изменять процесс валидации формы
*) менять бизнес-логику приложения

Хотелось бы свернуть эти действия в одно или хотя бы минимизировать их.
Автор оригинала: redbaron

и именно в дизайне решаеться какое поле нужно вводить и как его проверять.

Вообщемто сейчас обработка форм сводится почти к одному дизайну форм.
скажу еще: у значительно больше 7 форм и очень широкие таблицы данных.

если хочешь увидеть в действии пиши...(это вроде не в тему)
 

Crazy

Developer
Автор оригинала: [DAN]
благо xslt позволяет внутри себя юзать php
Какой именно механизм ты имеешь в виду?

Я немного о другом аспекте архитектуры, именно об удобном использовании связки xml+xslt в web-приложениях, как о системе шаблонов.
Я бы лучше отнес XSLT к системе визуализации. Чтобы получилась полноценная система шаблонов требуется еще наворачивать поверх свой код.
 
Сверху