За последние 24 часа нас посетили 20905 программистов и 1133 робота. Сейчас ищут 390 программистов ...

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

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

  1. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Это уже на блитз смахивает. Я кстати где-то видел решения на php.
    Пока и тк слишком много работы с парсером, чтобы ещё и версию блочной структуры девелопить.
     
  2. mclaud

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

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    MaXyC_Web_Studio
    А может просто функции printf и sprintf использовать?
    Или 2-е кавычки и в них вставлять переменные?
     
  3. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    В этом и есть вся проблема когда начинаешь делать более-менее умный парсер. Это превращается в высокоуровневый язык программирования написанный на PHP. По мне так проще написать зачастую меньше кода на самом PHP в шаблоне. А всё форматирование данных провести в логику приложения, а оно как правило не очень уж и большое если думать заранее - к примеру я никогда не форматирую даты, т.к. вывожу их из SQL уже в нужном формате, а форматированием сообщений занимается специальный класс (т.к. данные в основном либо c PHPBB либо вообще HTML). Вызываешь один метод для каждой записи и всё.

    К тому же многие тут спорят по поводу того, что в шаблоне не должно быть вообще логики. А если шаблон сложный и в нём нужно выводить ьлоки в зависимости от 4-х уровней доступа? Т.е. чем больше уровень, тем больше блоков видит пользователь. Выносить на уровень приложения? ИМХО, мне проще в шаблоне вставить
    PHP:
    1.  
    2. <? if (is_set('items')) {?>
    3. <table>
    4.   <? if (get('access') >= MODERATOR) {?>
    5.   <tr>
    6.     <td><a href="delete.php?id=<?get('item_id')?>">Delete</a></td>
    7.   </tr>
    8.    <?}?>
    9.   <? foreach (get('items') as $row) {?>
    10.   <tr>
    11.     <td><span class="heading"><?=$value['name']?></span><p class="text"><?=$value['msg']?></p></td>
    12.    </tr>
    13.   <?}?>
    14. </table>
    15. <?} else {?>
    16. <div class="no-data">No data avaliable</div>
    17. <?}?>
    18.  
    Имхо, ничуть не хуже чем любой шаблонизатор. Те же теги, только PHP'ные, та же логика, только не компилируется перед исполнением и есть свобода выбора между конструкциями. А вдруг где-то нужен будет switch (ну мало ли какие задачи попадаются - бывает и такое) или while вместе for или foreach. Да и логика самой программы сильно упрощается и куда понятнее чем если бы все эти условия были бы в программном коде.
    Так что всё это фигня. Я вот щас работаю с системой, где в шаблонах для подстановки используются XML style теги. И отнюдь не потому что круто или быстро или так захотелось, а потому что там нужен такой функционал и он там к месту - из XML выжимается всё что тока можно, потому что программируются системы автоматизированного управления целыми далеко не маленькими предприятиями, где контракты на разработку заключаются на годы. Шаблон по сути управляет выводом данных. Там event-based система и обработка чем-то похода на MVC подход, однако там только два управляющих компонента: Event handler и Tag processor. Если честно, помоему даже куда удобнее чем MVC :)

    Я считаю что делать мощьный парсер есть смысл тогда, когда шаблон задаёт поведение системы, когда он указывает что нужно вывести данные вот для этого модуля, а потом для этого. И есть ещё обработчики событий. А если идёт логика приложения и оно уже указывает какие шаблоны выводить - парсер не нужен, хватает небольшого класса-прослойки для сбора данных в одном месте и лёгкой абстракции от самого приложения - главное что бы всё запихнули в класс а каким образом - шаблону плевать. Остальное на мой взгляд извращение в контексте PHP, т.к. от этого драматически страдает производительность.
    ИМХО.
    Я сказал.
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Psih
    В PHP6 не будет коротких тегов... придется писать аж <?php echo $value['name']; ?> например...
     
  5. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    2 Psih: А этот парсер собственно то и делает, что ты сказал. И делает единажды. О чём и разговор, что стоит ли париться писать пыхные теги руками, или же их разок обработать парсером. Конечно с функционалом не поспоришь, да и отсутствием шаблонки как вида, но ведь и обращение к значениям массива быстрее по цифрам идёт, однако же все юзают буквы. Точно так же и на асме никто не пишет. С, для вёба тоже отпирает по тихой. Удобство побеждает.

    2 vs:
    А куда денутся короткие теги? А как же поддержка снизу вверх?
    Если так и будет, то будут конфигурить так, чтобы так не было.
    :) Начнут парсеры писать, заменяющие короткие на длинные :)))))
    Но имхо это гон.
     
  6. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    [vs], ты путаешь. У PHP6 отвалятся ASP теги (<%%>).
     
  7. Psih

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

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Danilka
    А разница между написать тег шаблонизатора или написать тег PHP?
    Т.е для меня разницы между ниже описанным нету.
    PHP:
    1.  
    2. <?=get('items')?>
    3. <!-- vs //-->
    4. {MODULENAME_ITEMS}
    5.  
    Почему здесь ещё есть module name - что-бы в большой системе не случилось конфликта имён (уж поверь, когда проект вырастает за 1.5-2 MB тока PHP кода это уже становится проблемой).
     
  8. Anonymous

    Anonymous Guest

    ты не поверишь, но короткие - тоже deprecated
     
  9. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Горбунов Олег, э... Дать бы тому кто это придумал по п*зде сапогом.
     
  10. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    насколько я понимаю, нельзя использовать теги {: и :} ? можно только однобуквенные? Просто с []возникают большие проблемы с js массивами в теле шаблона. В тоже время с {} иногда вообще отказывается работать.

    + ко всему я-то думал, что из кеша отдаются готовые html, заглянул сегодня туда, а там пруд-пруди <?php echo ?>. Не самое радостное открытие.
     
  11. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    продолжаем наш концерт. Я очень прошу ввести поддержку тегов в стиле {: :}. И чтоб они не вызывали ошибок. Так же хотелось бы чтоб в кеше был чистый html. Или тогда объясните мне какой вообще смысл такого кеширования.

    В заключение: доделал тут скрипт голосования:
    http://www.koc-tmp.tu2.ru/
    регистрацию не писал. Просто идем на login.php и вводим придуманый cookie(int).
    через admin.php добавляются опросы (не запаролено. Добавляйте че хотите)

    Итого: этот шаблонизатор+jQuery+amCharts+swfObject+часть CSS с Хабра ;).

    огромная просьба к Danilka: раз уж ты автор шаблонизатора, то глянь
    Код (Text):
    1. http://www.koc-tmp.tu2.ru/vote.zip
    - исходники и поправь их так, как делал бы ты.

    + Ко всем остальным: тоже помогите советом по оптимизации/улучшению кода и шаблонов.

    Зы: [offtop]дайте мне какую-нить идею для сайта/стартапа. Хочется немного попрактиковаться.[/offtop]


    upd: баг1 - нужно проверять, отвечал ли кто-нить на этот вопрос. Если нет, то не стоит пытаться выводить результаты.
    баг2 - проблемы с кодировками и ajax. Нужно отправлять header.
    недоделка1 - $anonym=0 предполагает не выводить uid пользователей в результатах. Еще не сделано.
    недоделка2 - $showNoVoted=1 предполагает не показывать результаты не проголосовавшим. Еще не сделано.
    идея1 - отказаться от swfObject и делать все силами jQuery
     
  12. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    lexa
    )))) это сделано, чтобы не конфликтовать с XML заголовками, вообще-то :)
     
  13. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    2 Koc: Ща буду посмотреть на голосовалку.
    А что за проблема была с тегами { } ? Одинарные должны были работать без проблем. Двойные посмотрю и сделаю поддержку, но хотелось бы как можно скорее знать, что не так с одинарными, чтобы сразу подправить.
    Не совсем понял что не так с кешем? По-моему я изначально описал что так и будет. Это не тот кеш о котором ты говоришь. "Тот" появится после создания нескольких версий. Как уже обсуждали ранее.
    Сейчас немного загружен, так что разделение версий будет не сию секунду, а чуть погодя.

    Про стартапы, могу подкинуть такое дело.
    У меня есть домен timemail.ru уже очень давно. Было решение, но потом загнулось что-то. Всё мечтаю написать, но руки чувствую никогда не дойдут. Могу предложить создать проект. Суть идеи можно посмотреть на http://futureme.org То, что проект не коммерческий, исключает драку за права, обладание и т. п.
    P.S. С меня домен и хостинг.
     
  14. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Не совсем понял, что я должен был увидеть в коде... Тем более его там такая куча. Но так при создании голосования вылезла целая куча варнингов.
    А почену не ользуешься буфером?
    В начале скрипта пишешь
    PHP:
    В конце
    PHP:
    И все проблемы с выводом хэадеров решаются.
     
  15. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    возможно с loop'ами можно было б как-то по другому сделать.
    вспомнил, какие проблемы были с {} - они в js используются.
     
  16. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Dagdamor, заголовок всегда один, а php тегов может быть много. :(
     
  17. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    2 Koc:
    В смысле? Что не так с циклами?
     
  18. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Danilka
    все нормально с циклами :wink:
     
  19. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Koc, Danilka, можно сделать так: если после { сразу идет идентификатор, то это спецтег шаблонизатора, иначе - обычная скобка. Тогда проблем с JS/CSS не возникнет.
     
  20. mclaud

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

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Если JS и CSS выносить в соответствующие файлы, то проблем тем более не возникнет!
     
  21. Koc

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

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

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Вообще я что-то такое делал, но точно не помню. Постораюсь посмотреть сегодня.
    А так, я делаю, как mclaud.
     
  23. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Разобрался с тегами.
    Теперь поддерживается любая длинна. Так же не обрабатываются теги [' [" [пробел.
    Прошу всех к тестированию. Я не нашёл ошибок, связанных с тегами. Последняя версия на сайте 0.5а
     
  24. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    2 момента, из-за которых я так хотел эти теги:

    если нам нужно сгенерировать конструкцию типа:
    ...
    <input type="text" name="answer[0]" size="50" />
    <input type="text" name="answer[1]" size="50" />
    ...
    Как это делать?
    <input type="text" name="answer[[id]]" size="50" /> - не даст ничего толкового.
    <input type="text" name="answer\[[id]\]" size="50" /> - тем более.

    Выносить js тоже не всегда получается:
    var myVar = [tVar];
    .

    в общем сейчас потестирую новую версию, попробую исправить свои недочеты.

    Зы: интересен так же шаблонизатор из CacePHP. Не ставил этот фреймфорк и не знаю, как он там кеширует: html или нет, но есть очень прикольный тег <nocache></nocache>. Что между ним - не кешируется.

    зызы:
    PHP:
    1. <?php
    2. private function write_cache( $data )
    3. {
    4.     $all        = $this -> load_all;
    5.     $load       = $this -> load;
    6.     $cache_dir  = $this -> cache_dir;
    7.     $cache_name = $this -> cache_name;
    8.     $data = str_replace( '\[' , '[' , $data );
    9.     $data = str_replace( '\]' , ']' , $data );
    10.  
    11.     if( file_put_contents( $cache_dir.$cache_name.TPL_CACHE_FILE_TYPE , $data ) )   return( true );
    12.     else                                        return( false );
    13. }
    14. ?>
    строки 8 и 9 мне определенно не нравятся.
     
  25. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    С кэшем хтмла будем разбираться в "версиях". Просто перед разделением хотелось по лучше отдебажить то, что есть.

    Про зызы: :) Да уж, я и забыл, что такое есть, а вчера не заметил. Сегодня подвыкину и выложу. Версиюя обновлять не буду, просто тут отпишу, когда сделаю.