За последние 24 часа нас посетили 17494 программиста и 1712 роботов. Сейчас ищут 1542 программиста ...

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

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

  1. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    нашел интересный баг.
    Запускать 10 раз. Раза 3 как минимум должна выскочить ошибка.
    PHP:
    1. <?
    2. include( './phparser.php' );
    3.  
    4. $tpl = new phparser( 'tpl' , 'cache' );
    5.  
    6. $tpl -> load( 'test' );
    7.  
    8. $tpl -> v( 'title' , 'PHParser example' );
    9. if (rand(1,2) == 1) {
    10.     $a = 0;
    11. } else {
    12.     $a = 1;
    13.     $loop = NULL;
    14.     $loop[1]['link']    = 'http://ya.ru';
    15.     $loop[1]['title']   = 'Лучшая рашенская поисковая система';
    16.     $loop[1]['text']    = 'Яndex';
    17.     $loop[2]['link']    = 'http://google.com';
    18.     $loop[2]['title']   = 'Лучшая не рашенская поисковая система';
    19.     $loop[2]['text']    = 'Google';
    20.     $loop[3]['link']    = 'http://r0.ru';
    21.     $loop[3]['title']   = 'Советская поисковая система';
    22.     $loop[3]['text']    = 'Rамблер';
    23.     $tpl -> l( 'src' , $loop );
    24. }
    25.  
    26. $arr['rand']    = rand(1,2);
    27. $arr['year']    = date('Y');
    28. $tpl -> arr( $arr );
    29.  
    30. $tpl -> re_cache(); ### while developing
    31. $tpl -> parse();
    32. ?>
    HTML:
    1.  
    2. [load header]
    3.  
    4. Поисковые системы:<br>
    5. [if a]
    6.     [loop src]
    7.         <a href="[link]" title="[title]">[text]</a><br>
    8.     [/loop]
    9. [/if]
    10. <br>
    11.  
    12. Сейчас <font color="[if rand == 1]blue[else]red[/if]">[year]</font> год.
    13.  
    14. [load footer]
    15. <br>
    оператор switch поддерживается? если нет, то хотелось бы.

    и еще:
    ' - апостроф а не слеш) + грамматические ошибки :wink:
     
  2. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Циклы подправил. Ночером попробую сделать свитч и выложу.
    Думаю что Экранирование тэгов теперь не актуально и я его попросту выкину.

    P.S. Спасибо за ошибки.
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    наткнулся в классе на метод __construct . Получается php5-only? Может лучше переименовать этот метод на phparser?
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Koc
    Забей на PHP4, это уже не серьёзно. С августа поддержка PHP4 прекращается полностью, даже критические уязвимости чинить не будут. Так что хватит жить прошлым блин.
     
  5. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Psih
    я работаю под 5 версией. Просто если 1 строчка кода делает доступным и работу под 4 версией, то почему бы и нет?
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Koc
    А потом начинается что не работает file_put_contents (кстати она у него используется), потому что его нету в PHP4, потом какая-нить array_* функция, а там нам нужно было private, а тут у нас объект передаётся по ссылке обязательно (а в PHP4 он копируется) и.т.д. Различия слишком велики, что бы думать о backward compability.
    Да, и тогда ему надо убрать все public, private (ибо Syntax Error в PHP4)
    Даже у нас в компании, у которой сотни проектов реализованы и часть их них долгосрочные (5+ лет), с прекращением поддержки PHP4 мы больше не соблюдаем совместимость (по сути уже не соблюдаем) - хотите что бы работало - обновляйте сервер или не обновляйте ядро системы. Хотите что-то добавить - не проблема, но поставьте PHP5. И это не смотря на то, что мы живём только на разработках на PHP как на местный рынок так и на американский (список проектов, и то не весь, здесь).
    Именно из-за таких совмещенцев как ты и тормозилось внедрение PHP5 целых 5 лет.
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Danilka
    PHP:
    1. <?php
    2. $data = str_replace( '||' , ' || ' , $data );
    3. $data = str_replace( '&&' , ' && ' , $data );
    4. $data = str_replace( '"' , '' , $data );
    5. $data = str_replace( '{' , '' , $data );
    6. $data = str_replace( '}' , '' , $data );
    7. $data = str_replace( ';' , '' , $data );
    8. $data = str_replace( '$' , '' , $data );
    9.  
    10. $data = str_replace( '(' , ' ( ' , $data );
    11. $data = str_replace( ')' , ' ) ' , $data );
    12. $data = str_replace( '!' , ' ! ' , $data );
    13. $data = str_replace( '=' , ' = ' , $data );
    14. $data = str_replace( '>' , ' > ' , $data );
    15. $data = str_replace( '<' , ' < ' , $data );
    16.  
    17. // лучше так
    18.  
    19. $search = Array('||', '&&', '"', '{', '}', ';', '$', '(', ')', '!', '=', '>', '<');
    20. $replace = Array(' || ', ' && ', '', '', '', '', '', ' ( ', ' ) ', ' ! ', ' = ', ' > ', ' < ');
    21. $data = str_replace($search, $replace, $data);
    22.  
    А ещё я не понял смысла таких замен вообще, и зачем заменять два пробела на один и.т.д.? Смысл?
     
  8. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Запостил новую версию! Как всегда, качаем на сайте.
    Появился долгожданный свитч! Исправил теги. Спасибо Psihу, исправил замену. Не знал, что так можно делать.
    Кстати, смысл замены простой. Поддержка тегов вида [if my_var!='my_val'] или [if my_var ! = 'my_val']
    Я конечно заявлял, что никакие глюки кода не исправляются, но это уж так, совсем не существенные различия, так что, решил, что лишним не будет.
    Про php4/5 Psih всё сказал, смыла дальше развивать тему нет смысла.
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Danilka
    Эм, смысла поддерживать ! = нету, потомучто это просто ошибка писавшего тег, тоесть syntax error. Так что ты это очень и очень зря. Да и пробелы с двойных заменять на одинарный тоже ИМХО глупо, проще просто написать парсер так, что бы ему было всёравно на количество пробелов и табов.
     
  10. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Psih, про пофегизм на пробелы - резонно, подумаю в эту сторону.
    При написании я ориентировался на то, что шаблон будет парситься придельно редко и затраты ресурсов при этом практически не учитывал. Но в то же время не парился по поводу обработки ошибок, бо подразумевается, что девелоперу нужно доверять.
    Сейчас думаю написать две версии при работе с файлами. Одну для дева + дописать обработку ошибок в шаблонах. А другую для работы. Вообще без парсера шаблонов.
     
  11. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Подумал тут выкинуть прямой вывод шаблона и отдать результат в виде ретёна, чтобы программист уже сам дальше решал, что с ним делать.
    Возник вопрос, а как это реализовать? Бо Сам вывод осуществляется при помощи подключения php файла.
    Единственное, что пришло в голову, сделать так:
    PHP:
    1. include( 'my_template.ch' );
    2. return( ob_get_contents() );
    Но! Это перекрывает некоторые возможности пользования буфером вывода в теле основного скрипта. Нет какого-нибудь иерархичного буфера или ещё чего?
     
  12. Anonymous

    Anonymous Guest

    Буферы вывода в ПХП и так "иерархичны", нет, ты не перекроешь основной буфер. Так что делай на здоровье.
     
  13. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
  14. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    PHP:
    1. <?
    2. function get_out($data){
    3.     ob_start();
    4.  
    5.     echo $data;
    6.     // include( 'my_template.ch' );
    7.     // ну илb любой другой вывод
    8.  
    9.     $out=ob_get_contents();
    10.     ob_end_clean();
    11.     return $out;
    12. }
    13.  
     
  15. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Ну ладно-ладно, поймали :)
    А за буфер спасибо.
     
  16. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а конструкция типа [:load [:add:]:] не поддерживается чтоли? То есть мы в шаблоне указываем загружать шаблон, имя которого находится в переменной add. Простите за тавтологию
     
  17. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Нет, не поддерживается, если сделать, то будут траблы с отличением переменной от не переменной.
    А так как мы всё-таки пришли к модели, что не все переменные могут быть быть определены, то это нарушит такое представление.

    P.S. Как вообще использование? Написал что-то?

    Да, кста, я что-то не могу буфер вывода сделать. Если делать его вложенным, то он получается до первого оутбуфера работает, где обещанная иерархичность?
     
  18. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ну я человеку одному написал что он просил. Себе же сейчас пишу одну штуку.

    Пользоваться удобно. Хочу кеширование html)
     
  19. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Сейчас дописываю один проект, потом займусь шаблонкой и будет хтмл кэш ;)
     
  20. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    хорошо бы. Будем ждать
     
  21. neyr00n

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

    С нами с:
    29 ноя 2007
    Сообщения:
    106
    Симпатии:
    0
    Код (Text):
    1. Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 471
    2. Поисковые системы:
    3.  
    4. Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 234
    5. Яndex
    6.  
    7. Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 234
    8. Google
    9.  
    10. Notice: Undefined offset: 0 in E:\!sites\odow\phparser\phparser.php on line 234
    11. Rамблер
    версия 0.6 альфа. ничего не сделал, только запустил :)
     
  22. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Странно, у меня таких ошибок не выдаёт... Может у тея какой экстра эррор :)
    Подправил чуток, попробуй сейчас. Версия та же, лежит там же, просто перезалил и дату исправил.
     
  23. neyr00n

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

    С нами с:
    29 ноя 2007
    Сообщения:
    106
    Симпатии:
    0
    вооот. сейчас все нормуль :)
     
  24. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Есть такой шаблон:
    HTML:
    1. <div id="lCol">
    2.     [:lCol:]
    3.     <h3><img src="images/32/delete.png" alt="" /> Удалить кафедру</h3>
    4.     [:if allowDelete:]
    5.         <div class="message">
    6.             <form name="province" method="post" action="adminRecive.php?do=deleteSave&amp;delete=chair&amp;id=[:deleteID:]">
    7.                 Вы действительно хотите удалить кафедру: [:title:]?<br /><br />
    8.        
    9.                 [:if redirectTo:]<input type="hidden" name="redirectTo" value="[:redirectTo:]" />[:/if:]
    10.                 <input type="submit" name="allowDelete" value="да" /> <input type="submit" name="denyDelete" value="нет" />
    11.             </form>
    12.         </div>
    13.    <!--
    14.     [:else:]
    15.         [:if showUniversity:]
    16.             Есть вузы, входящие в состав этого города:<br />
    17.             [ load list-loop-univercity ]
    18.         [:/if:]
    19.         [:if error:]<span class="error">[:error:]</span>[:/if:]
    20.     -->
    21.     [:/if:]
    22. </div>
    23.  
    хочется, чтобы поддерживались комментарии в стиле html. То, что закомментировано - не парсить (а может даже и не выводить. Тупо вырезать). Оно тут очень наглядно показано - серым выделено.