По поводу схемы работы сервера всё просто. Проект ориентируется на стандартное большинство и дефолтные настройки. А сайт парсеру писать в лом. Подвернётся необходимость наваять подобное и за одно этот запщу. Главное, что ман присутствует. Я прямо вырвал на него времени и это радует. А за проглядывание будем очень признательны, собственно для этого мы здесь все сегодня собрались : )))))
PHP: <?php $title= 'мой вопрос'; $options = array( 'вариант ответа 1', 'вариант ответа 2', 'вариант ответа 3', 'вариант ответа 4'); $ids = array(333, 334, 335, 336); $answers= array(); foreach( $ids as $numb => $id ) $answers[]= array( 'option' => array( 'id' => $id, 'title' => $options[ $numb ] ) ); $model= array( 'vote' => array( 'title' => $title, 'answers' => array( 'radio' => $answers ), //checkbox ) ) echo XSLTprocess( buildDOM( $model ), 'index.xsl' ); ?> + HTML: <t:template match='/vote'> <html> <head> <title><t:value-of select="title" /></title> </head> <body> <t:value-of select="title" /> <form name="fVote" id="fVoteID" action="?do=vote" method="post"> <t:apply-templates select="answers" /> <input type="submit" name="sVote" id="sVoteID" value="Ответить"/> </form> </body> </html> </t:template> <t:template match='answers/checkbox/option'> <input type="checkbox" name="cVote" id="c{id}VoteID" value="{id}" /> <label for="c{id}VoteID"><t:vale-of select="title" /></label> <br /> </t:template> <t:template match='answers/radio/option'> <input type="radio" name="cVote" id="c{id}VoteID" value="{id}" /> <label for="c{id}VoteID"><t:vale-of select="title" /></label> <br /> </t:template> в шаблоне ни грамма логики.
dark-demon интересно. Но это ж нужно дополнительную либу ставить? И синтаксис учить ... /me задумался о том, стоит ли изобретать лисапед.
не нужно ничего ставить. в пхп5 есть всё необходимое. а синтаксис - да, изобретать куда интереснее, чем учить ;-) впрочем, xpath - самый приятный синтаксис из тех, что я когда-либо учил...
Может это и не объективная точка зрения, но у меня в шаблонах как-то проще кажется. Вопрос прост: Стоит ли избегать логики в шаблоне, ради избегания логики в шаблоне?
нет, это форма определения. коробка - это картонный куб без верхней крышки, в котором могут находиться предметы... мяч - это сферический резиновый объект колесо - это резиновый тор, надетый на металлический диск
угу. Логика? ) слово match - предполагает логику - сравнение, на соответствие указанному условию. Это логика отображения, да.
это логика шаблонизатора. верстальщика она не должна волновать - он просто говорит, что "мяч - это резиновая сфера". а шаблонизатор уже у себя в нутрях итерирует: "для всех объектов: если объект есть мяч, то нарисовать резиновую сферу"
Я вот что подумал. Мжет стоить сделать автоматическую перекомпиляцию шаблона при обновлении исходного файла шаблона? Это упростит жизнь программистам, но создаст лишнее обращение к файлу шаблона с целью узнать его дату создания.
Вообще тут сам факт обращения к диску самый весомый. Так и у кого какие соображения, нужно ли это вообще?
Ну это уже дополнительная фича, не везде она установлена, а мы тут вроде как на тему простоты и дефолтности говорим
Как я понял это ты к тому, что можно то же самое реализовать и на стандартных либах? А shmop это выделение той же оперативки?
Создай доп. интерфейс для кэширования. В объект шаблонизатора передавай объект кэшера. И сделай классы для кэширования на диске, в оперативке и т.д.
О разделении логики Отсутствие логики в шаблоне, не означает полное её отсутствие, иначе это будет статическая страница, а разделение бизнес, управляющей и логики представление. Т.е. можно привести пару примеров, плохого программирования: В данном случае при полном отсутствии логических выражений, перенесена бизнес логика, на представительский уровень: Код (Text): ... <select name="good_id"> <option value="1">Утюг</option> <option value="2">Холодильник</option> </select> ... Теперь же наоборот, шаблон получается перегружен логикой. И если кодер 5-ть раз на день будет присылать новые варианты верстки, в которые каждый раз будет необходимо перенести логику, то вероятность допустить ошибку вырастает в разы. PHP: ... <?php $count = 0; $sum = 0; $result = mysql_query('SELECT `id`, `name`, `price` FROM `goods`'); while ($rec = $mysql_fetch_row($result)) { ?> <tr> <td><?php echo $rec['id']; ?></td> <td><?php echo $rec['name']; ?></td> <td><?php echo $rec['price']; ?></td> </tr> <?php $count++; $sum += $rec['price']; } ?> ... <?php echo $sum/$count; ?> ... К тому же не следует забывать, что кодер не обязательно должен не уметь программировать вовсе, означает, что он просто не обязан знать PHP. Поэтому циклы, условия и прочие конструкции необходимы и достаточны. Правда стоит ли кодера заставлять учить новый синтаксис, если уже есть синтаксис Smarty который ему наверняка знаком? Использование которого кстати облегчит перенос сайта на PHParser со Smarty в случае необходимости? О текущем синтаксисе парсера Первое, что мне бросилось в глаза, это конструкция load. В ней указывается жестко имя подключаемого шаблона: Код (Text): [load template_name] К примеру есть необходимость, подключать соответствующий шаблон в зависимости от страницы: Код (Text): [load header] [load <шаблон текущей страницы>] [load footer] Конечно, можно это решить другим путем, но если кол-во страниц варьируется в приделах 10-ти, иначе использование шаблонизатора становится утомительным: Код (Text): [load header] [if page='default'] [load default] [else] [if page='first'] [load first] [else] ... [/if] [/if] [load footer] Кстати я просто не увидел elseif или его действительно нет? И форматы вывода, тоже не вижу... очень удобно взять дату и время и применить к ней формат вывода, а не выбирать отдельно число, номер месяца, год, минуты, секунды, часы отдельно! Относительно сбросы шаблонов, думаю эту функцию лучше упразднить и заменить на параметр в конфиг. файле. Сделать к примеру development и work версии класса. К примеру вовсе не критична скорость работы скрипта на локальной машине во время процесса разработки. И не кто не обязывает выкладывать на сервер исходные шаблоны, думаю вполне достаточно выкладывать готовые файлы кеша и Lite версию класса для их подключения. Также вовсе не помешает что-то в духе switch/case/default и чтобы в case можно было указать параметры через запятую и/или тире (для букв и цифр к примеру).
Danilka, камрад mclaud дело говорит. Вот такое на входе <input type="text" name="answer[0]" size="50" /> делает вот такое на выходе <input type="text" name="answer0" size="50" />. Я конечно все понимаю, дескать нужно экранировать [] или менять на {} или че-то в этом роде ... Может по умолчанию сделать {} ? Или как-то по другому решить проблему.
Привет всем, не было возможности отвечать, уезжал. По-поводу доп интерфейса с кешем. Думаю, что есть смысл создать и вправду несколько версий. Dev, Memcache, Filecache, Light... Это всё верное, думаю мы и пойдём в этом направлении. По-поводу логики в шаблоне, думаю заморачиваться не стоит. и так всё хорошо. Спасибо mclaud'у за описание. Не совсем понял вопрос про elseif, что имелось ввиду? Пример в сутдию, как говориться Про форматы вывода времени подумаю, отпишусь. По сбросу шаблонов предложение дельное, но видимо уже будем разделять версии. А про не выкладывание на сервер исходиков шаблонов, хорошо подмечено. И вправду, зачем они там. Хотя некоторым будет удобно присутствие полной версии сайта в нете, так что думаю это тоже нужно решать на уровне версий класса. Про свитч я уже тоже думал, видимо надо реализовать. Нужно ещё над синтаксисом подумать, может есть какие предложения? Что касается квадратных скобок, то всё просто. Я же в мануале описал. Меняем в исходнике парсера константу и всё будет, как в сказке по взмаху волшебной палочки, парситься через другие скобки.
а что если в шаблоне нет совершенно никакой логики кроме как переменных? например вывод новости: HTML: <div class="item"> <div class="header">$title</div> <div class="content">$content</div> </div> PHP: foreach($news as $k=>$v) $news.=apply("templatename", array("title"=>$v['title'], "content"=>$v['content'])); return $news; это просто. теперь допустим нам надо select сделать.... 1 шаблон HTML: <select name=""> $select_data </select> 2 шаблон HTML: <option value="$value">$title</option> PHP: foreach($array as $k=>$v) $select_data.=apply("tpl_SelectData", array("title"=>$v['title'], "value"=>$v['value'])); return apply("tpl_SelectMain", array("select_data"=>$select_data)); проавда немного программеру попотеть придется с кучей шаблонов/ зато верстальщик будет в шоколаде