За последние 24 часа нас посетили 17466 программистов и 1719 роботов. Сейчас ищут 1523 программиста ...

Шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Danilka, 30 апр 2008.

  1. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    По поводу схемы работы сервера всё просто. Проект ориентируется на стандартное большинство и дефолтные настройки.
    А сайт парсеру писать в лом. Подвернётся необходимость наваять подобное и за одно этот запщу. Главное, что ман присутствует. Я прямо вырвал на него времени и это радует.
    А за проглядывание будем очень признательны, собственно для этого мы здесь все сегодня собрались : )))))
     
  2. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    PHP:
    1. <?php
    2.  
    3. $title= 'мой вопрос';
    4. $options = array( 'вариант ответа 1', 'вариант ответа 2', 'вариант ответа 3', 'вариант ответа 4');
    5. $ids = array(333, 334, 335, 336);
    6.  
    7.  
    8. $answers= array();
    9. foreach( $ids as $numb => $id )
    10.     $answers[]= array( 'option' => array( 'id' => $id, 'title' => $options[ $numb ] ) );
    11.  
    12. $model= array(
    13.     'vote' => array(
    14.         'title' => $title,
    15.         'answers' => array( 'radio' => $answers ), //checkbox
    16.     )
    17. )
    18.  
    19. echo XSLTprocess( buildDOM( $model ), 'index.xsl' );
    20.  
    21. ?>
    +
    HTML:
    1. <t:template match='/vote'>
    2.     <html>
    3.         <head>
    4.             <title><t:value-of select="title" /></title>
    5.         </head>
    6.         <body>
    7.             <t:value-of select="title" />
    8.             <form name="fVote" id="fVoteID" action="?do=vote" method="post">
    9.                 <t:apply-templates select="answers" />
    10.                 <input type="submit" name="sVote" id="sVoteID"  value="Ответить"/>
    11.             </form>
    12.         </body>
    13.     </html>
    14. </t:template>
    15.  
    16.  
    17. <t:template match='answers/checkbox/option'>
    18.     <input type="checkbox" name="cVote" id="c{id}VoteID" value="{id}" />
    19.     <label for="c{id}VoteID"><t:vale-of select="title" /></label>
    20.     <br />
    21. </t:template>
    22.  
    23. <t:template match='answers/radio/option'>
    24.     <input type="radio" name="cVote" id="c{id}VoteID" value="{id}" />
    25.     <label for="c{id}VoteID"><t:vale-of select="title" /></label>
    26.     <br />
    27. </t:template>
    в шаблоне ни грамма логики.
     
  3. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    dark-demon интересно. Но это ж нужно дополнительную либу ставить? И синтаксис учить ...
    /me задумался о том, стоит ли изобретать лисапед.
     
  4. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    не нужно ничего ставить. в пхп5 есть всё необходимое.
    а синтаксис - да, изобретать куда интереснее, чем учить ;-)
    впрочем, xpath - самый приятный синтаксис из тех, что я когда-либо учил...
     
  5. Anonymous

    Anonymous Guest

    value-of
     
  6. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Может это и не объективная точка зрения, но у меня в шаблонах как-то проще кажется.
    Вопрос прост: Стоит ли избегать логики в шаблоне, ради избегания логики в шаблоне?
     
  7. Anonymous

    Anonymous Guest

    а это, не форма логики?
     
  8. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    нет, это форма определения.

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

    мяч - это сферический резиновый объект
    колесо - это резиновый тор, надетый на металлический диск
     
  9. Anonymous

    Anonymous Guest

    угу. Логика? ) слово match - предполагает логику - сравнение, на соответствие указанному условию. Это логика отображения, да.
     
  10. dark-demon

    dark-demon Активный пользователь

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    это логика шаблонизатора. верстальщика она не должна волновать - он просто говорит, что "мяч - это резиновая сфера". а шаблонизатор уже у себя в нутрях итерирует: "для всех объектов: если объект есть мяч, то нарисовать резиновую сферу"
     
  11. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Я вот что подумал. Мжет стоить сделать автоматическую перекомпиляцию шаблона при обновлении исходного файла шаблона?
    Это упростит жизнь программистам, но создаст лишнее обращение к файлу шаблона с целью узнать его дату создания.
     
  12. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    или md5(crc)
     
  13. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    ? не понял...
    По размеру? Так за ним тоже придётся обращаться. Или я всё-таки не понял.
     
  14. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я просто предлагаю сравнивать не время изменения файла, а его kонтрольную сумму - md5.
     
  15. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
    мнэ... ты думаешь вычислить хеш-сумму файла быстрее, чем узнать его дату модификации? лол!
     
  16. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Вообще тут сам факт обращения к диску самый весомый. Так и у кого какие соображения, нужно ли это вообще?
     
  17. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
  18. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Ну это уже дополнительная фича, не везде она установлена, а мы тут вроде как на тему простоты и дефолтности говорим :)
     
  19. sword dancer

    sword dancer Активный пользователь

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
  20. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Как я понял это ты к тому, что можно то же самое реализовать и на стандартных либах?
    А shmop это выделение той же оперативки?
     
  21. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Создай доп. интерфейс для кэширования. В объект шаблонизатора передавай объект кэшера. И сделай классы для кэширования на диске, в оперативке и т.д.
     
  22. mclaud

    mclaud Активный пользователь

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    О разделении логики
    Отсутствие логики в шаблоне, не означает полное её отсутствие, иначе это будет статическая страница, а разделение бизнес, управляющей и логики представление.
    Т.е. можно привести пару примеров, плохого программирования:
    В данном случае при полном отсутствии логических выражений, перенесена бизнес логика, на представительский уровень:
    Код (Text):
    1. ...
    2. <select name="good_id">
    3.     <option value="1">Утюг</option>
    4.     <option value="2">Холодильник</option>
    5. </select>
    6. ...
    Теперь же наоборот, шаблон получается перегружен логикой. И если кодер 5-ть раз на день будет присылать новые варианты верстки, в которые каждый раз будет необходимо перенести логику, то вероятность допустить ошибку вырастает в разы.
    PHP:
    1. ...
    2. <?php
    3.     $count = 0;
    4.     $sum = 0;
    5.     $result = mysql_query('SELECT `id`, `name`, `price` FROM `goods`');
    6.     while ($rec = $mysql_fetch_row($result)) {
    7. ?>
    8.     <tr>
    9.         <td><?php echo $rec['id']; ?></td>
    10.         <td><?php echo $rec['name']; ?></td>
    11.         <td><?php echo $rec['price']; ?></td>
    12.     </tr>
    13. <?php $count++; $sum += $rec['price']; } ?>
    14. ...
    15. <?php echo $sum/$count; ?>
    16. ...
    К тому же не следует забывать, что кодер не обязательно должен не уметь программировать вовсе, означает, что он просто не обязан знать PHP.
    Поэтому циклы, условия и прочие конструкции необходимы и достаточны.

    Правда стоит ли кодера заставлять учить новый синтаксис, если уже есть синтаксис Smarty который ему наверняка знаком?
    Использование которого кстати облегчит перенос сайта на PHParser со Smarty в случае необходимости?

    О текущем синтаксисе парсера
    Первое, что мне бросилось в глаза, это конструкция load.
    В ней указывается жестко имя подключаемого шаблона:
    Код (Text):
    1. [load template_name]
    К примеру есть необходимость, подключать соответствующий шаблон в зависимости от страницы:
    Код (Text):
    1. [load header]
    2. [load <шаблон текущей страницы>]
    3. [load footer]
    Конечно, можно это решить другим путем, но если кол-во страниц варьируется в приделах 10-ти, иначе использование шаблонизатора становится утомительным:
    Код (Text):
    1. [load  header]
    2. [if page='default']
    3.     [load default]
    4. [else]
    5.     [if page='first']
    6.         [load first]
    7.     [else]
    8.         ...
    9.     [/if]
    10. [/if]
    11. [load  footer]
    Кстати я просто не увидел elseif или его действительно нет?
    И форматы вывода, тоже не вижу... очень удобно взять дату и время и применить к ней формат вывода, а не выбирать отдельно число, номер месяца, год, минуты, секунды, часы отдельно!
    Относительно сбросы шаблонов, думаю эту функцию лучше упразднить и заменить на параметр в конфиг. файле.
    Сделать к примеру development и work версии класса. К примеру вовсе не критична скорость работы скрипта на локальной машине во время процесса разработки. И не кто не обязывает выкладывать на сервер исходные шаблоны, думаю вполне достаточно выкладывать готовые файлы кеша и Lite версию класса для их подключения.
    Также вовсе не помешает что-то в духе switch/case/default и чтобы в case можно было указать параметры через запятую и/или тире (для букв и цифр к примеру).
     
  23. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Danilka, камрад mclaud дело говорит.

    Вот такое на входе <input type="text" name="answer[0]" size="50" />
    делает вот такое на выходе <input type="text" name="answer0" size="50" />.
    Я конечно все понимаю, дескать нужно экранировать [] или менять на {} или че-то в этом роде ... Может по умолчанию сделать {} ? Или как-то по другому решить проблему.
     
  24. Danilka

    Danilka Активный пользователь

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Привет всем, не было возможности отвечать, уезжал.
    По-поводу доп интерфейса с кешем. Думаю, что есть смысл создать и вправду несколько версий. Dev, Memcache, Filecache, Light... Это всё верное, думаю мы и пойдём в этом направлении.
    По-поводу логики в шаблоне, думаю заморачиваться не стоит. и так всё хорошо.
    Спасибо mclaud'у за описание.
    Не совсем понял вопрос про elseif, что имелось ввиду? Пример в сутдию, как говориться :)
    Про форматы вывода времени подумаю, отпишусь. По сбросу шаблонов предложение дельное, но видимо уже будем разделять версии. А про не выкладывание на сервер исходиков шаблонов, хорошо подмечено. И вправду, зачем они там. Хотя некоторым будет удобно присутствие полной версии сайта в нете, так что думаю это тоже нужно решать на уровне версий класса.
    Про свитч я уже тоже думал, видимо надо реализовать. Нужно ещё над синтаксисом подумать, может есть какие предложения?
    Что касается квадратных скобок, то всё просто. Я же в мануале описал. Меняем в исходнике парсера константу и всё будет, как в сказке по взмаху волшебной палочки, парситься через другие скобки.
     
  25. MaXyC_Web_Studio

    MaXyC_Web_Studio Активный пользователь

    С нами с:
    31 дек 2006
    Сообщения:
    678
    Симпатии:
    3
    Адрес:
    Новоуральск
    а что если в шаблоне нет совершенно никакой логики кроме как переменных? например вывод новости:

    HTML:
    1. <div class="item">
    2.     <div class="header">$title</div>
    3.    <div class="content">$content</div>
    4. </div>
    PHP:
    1.  
    2. foreach($news as $k=>$v)
    3.     $news.=apply("templatename", array("title"=>$v['title'], "content"=>$v['content']));
    4. return $news;
    это просто. теперь допустим нам надо select сделать....
    1 шаблон

    HTML:
    1. <select name="">
    2. $select_data
    2 шаблон
    HTML:
    1. <option value="$value">$title</option>
    PHP:
    1.  
    2. foreach($array as $k=>$v)
    3.      $select_data.=apply("tpl_SelectData", array("title"=>$v['title'], "value"=>$v['value']));
    4.  
    5. return apply("tpl_SelectMain", array("select_data"=>$select_data));
    проавда немного программеру попотеть придется с кучей шаблонов/ зато верстальщик будет в шоколаде