За последние 24 часа нас посетили 17436 программистов и 1709 роботов. Сейчас ищут 1798 программистов ...

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

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

  1. nimistar

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

    С нами с:
    30 май 2007
    Сообщения:
    919
    Симпатии:
    0
    Smarty ? :-D
    сори пока не вижу разницы ... я про смарти говорил просто из-за того что видел что идея идет как раз в сторону реализации смарти ... :)
     
  2. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
  3. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Наваял манула, лежит на сайте, прошу заценять :)
    nimistar, если честно, то не знал, что смарти так работает. Наверное бы и не писал свой, но уже поздно, да и получился он лёгкий и простой, так что думаю кому-нибудь пригодится.
     
  4. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    Danilka

    правильно писать parse в имени метода?
     
  5. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Затупил.
    Ща поправим, благо домен правильно зарегил :)
     
  6. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    В цикле локальные переменные? И можно ли получить доступ к глобальным?
     
  7. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    В цикле - локальные.
    Глобальные в цикле есть.
    Единственное но, имена не должны попадать друг на друга, иначе глобальные переменные не будут работать. Причем и вне цикла тоже.
     
  8. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    это минус
     
  9. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Придумал решение, на досуге попробую реализовать.
    Сам сегодня сталкнулся: У страницы есть title и в цикле присутствует. В текущем проекте уже некогда заморачиваться, но исправить надо, верно указали, спасибо.
     
  10. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    а может ну его, велосипедное производство? :^)
     
  11. topas

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

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    не... это полезней чем покупать дорогие спортивные велосипеды... а иногда они даже нравятся хозяинам :)
     
  12. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    просто так можно проект на всю жизнь калекой оставить...
     
  13. Koc

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

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

    Вопрос1: насколько быстро он работает? А если отключено кеширование?

    Вопрос2: у меня отдельно кешируются блоки. Скажем отдельно боковые блоки, основное тело документа и комментарии ,находящиеся под основным телом. Можно ли это реализовать здесь? Если да, то прошу пример.

    Вопрос3: слышал, что js нужно в конце подключать, css в начале (а может наоборот). И, предположим, в зависимости от некоторых параметров, я вызываю что-то типа jQueryConnect("nyroModal"); . А вышеупомянутая ф-ция проверяет, не подключали ли мы его и в противном случае делает тупой echo "скрипт путь до него и пр.". И вот, получается, что где-то в середине страницы подключается js-файл, а строк через 15 еще один. А хочется, чтоб они все вместе были в head'е. И как это реализовать?

    Вопрос4: как продолжение предидущего: а еще хорошо, если б можно было css-файлы, которые подключаем объединять. Возможно?

    Вопрос5: а еще хочется, чтоб никогда не было ошибок, дескать header уже отправлен. Поэтому сначала генерируем страницу, отправляем куки, и только потом ее выводим пользователю. Возможно?
     
  14. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Кому не интересно, идут качать смарти или блитз.

    О, пока писал пост, куму-то проект понадобился.

    2Koc

    1. Кэш не отключается. Можно только принудительно его переписывать каждый раз (метод re_cache()).
    Вообще тестов ещё не проводил. Но при разборе каждый раз - тормоз будет точно. При рабочем кеше, думаю, что быстрее всех, разбирающих каждый раз. На счёт смарти и блитза не уверен. Но достаточно быстр, чтобы юзать в местах с большой посещаемостью.

    2. Ту так нельзя. Он сначала собирает один большой шаблон, а потом его весь кеширует. Какой смысл в кешировании разных кусков?
    Если только сделать так:
    PHP:
    1. $tpl = new phparser( 'tpl' , 'cache' );
    2. $tpl -> load( 'template_1' );
    3. $tpl -> parse();
    4.  
    5. $tpl = new phparser( 'tpl' , 'cache' );
    6. $tpl -> load( 'template_2' );
    7. $tpl -> parse();
    8.  
    9. $tpl = new phparser( 'tpl' , 'cache' );
    10. $tpl -> load( 'template_3' );
    11. $tpl -> parse();
    В принципе будет желаемый результат.

    3. Чёт не совсем понял вопроса. Просто с этой либой не работаю, а юзаю только явоскриптовую часть jquery

    4. Если их подключать как список стилей в страничке, то так и будет, а иначе их же браузер грузит.

    5. Собственно так и происходит.
    PHP:
    1. $tpl = new phparser( 'tpl' , 'cache' );
    2. echo 123;
    3. $tpl -> load( 'template' );
    4. // тут вывод куков
    5. $tpl -> parse();
    Ошибки не будет
     
  15. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Да, если надумаешь писать и дойдёшь до использование циклов, подожди до завтра. Я вышеупомянутый недочёт исправлю и будет ок.
    Версию сразу кину на сайт, тут отпишусь.
     
  16. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    мой случай: если не кешировать страницу совсем - будет около 42 запросов. Кешируются: боковые блоки, тело, комменты. Человек написал комментарий. Что делаем? верно, очищаем кеш коммента, при следущей загрузке комменты еще разок сгенерируются и запишутся в кеш, пока кто-то не напишет новый коммент. "Накладные расходы" - 3-5 запросов. Именно столько нужно для вывода комментов. А ежели полностью страницу кешируем? Это будет опять 42 запроса?


    пока только присматриваюсь
     
  17. sword dancer

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

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

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

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

    Koc, ну тебе уже тут ответили. А откудова так много запросов?
     
  19. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    достаточно просто реализовать виртуальные инклуды с полностраничным кэшированием и будет нам счастье!
    ssi! ssi! - кричит толпа.
     
  20. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    А если учитывать "шматковость" кеширования.
    Может сделать что-нибудь типа этого. Рассмотрим на примере вышеуказанных каментов:
    PHP:
    1. ...
    2. if( $tpl -> load( 'comments' ) )
    3. {
    4.      ... // тут вывод коментов из базы
    5. }
    6. ...
    А когда добавляем новый камент, то делаем такой вызов:
    PHP:
    1. $tpl -> del( 'comments' );
    Тогда выходит, если кэш присутствует, то метод возвращает true и тогда коменты из базы не дёркаются. А если добавили новые, то удаляем этот кэш и при ближайшем вызове load( 'comments' ) он подгрузит шаблон, а вернёт false. И уж тогда будем выполнять запросы.
    Конечно это не выдача апатчем, без помощи php, но тоже не плохо будет экономить ресурсы.
     
  21. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    и будут у тебя на всех страницах одни и те же комменты =)
     
  22. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    :)))) точно!
    Тогда так:
    PHP:
    1.  ...
    2.  if( $tpl -> load( 'comments' , $comment_id ) )
    3.  {
    4.      ... // тут вывод коментов из базы
    5.  }
    6.  ...
    Где $comment_id идентифицирует кометы с точностью до страницы, а шаблонизатор будет его хешировать и учитывать в названии кэша.
     
  23. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    PHP:
    1. load( 'products' , $costGreaterThen, $costLowerThen, $vendor, $supportSD, ... )
     
  24. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Если уж так будет это нужно, хотя я в этом сомневаюсь, думаю, что всегда можно закеширловать кусками и отделаться просто idшкой этого куска, то можно сделать и так:
    PHP:
    1. load( 'products' , $costGreaterThen.$costLowerThen.$vendor.$supportSD.$... )
     
  25. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    поздравляю, ты изобрёл uri =)