За последние 24 часа нас посетил 21931 программист и 1004 робота. Сейчас ищут 682 программиста ...

Буферизация вывода и быстрые шаблоны

Тема в разделе "PHP для новичков", создана пользователем 440Hz, 11 авг 2006.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    /me успешно перешёл на php натив, и теперь мне очень хорошо
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    obsrv
    Разобрался с примерами, которые были в скачанном пакете - в общем-то всё просто, мне пока нравится. А помимо того, что описано в тех 8-ми примерах, которые идут вместе с XTemplate, у него есть ещё какие-то функции/возможности, которые не рассмотрены в примерах?
     
  3. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    sobachnik
    я не помню, там в принципе в самом коде (не такой сложный) можно увидеть :).
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    У меня снова вопрос по этой теме...
    В общем допустим на сайте есть куски, которые одинаковы для каждой странички - это традиционно шапка (логотип, меню, какая-то информация о состоянии сайта (допустим, сколько всего фоток на сайте или что-то в этом роде) ну и т.д.), а также нижняя часть, в которой может быть продублирована навигация, ну и вообще что угодно, не в этом суть. Есть также, соответственно, основная часть, которая для каждой странички различная. Естественно, напрашивается такой вариант - создать шаблон типа header.tpl , footer.tpl и остальные, например body-main.tpl , body-register.tpl и т.д. И вот теперь вопрос: как лучше эти три части собрать (средствами XTemplate)? Я пока начал делать так: создаю три объекта типа xtpl:
    PHP:
    1. <?php
    2. $xtpl_header = new XTemplate("templates/header.tpl");
    3. $xtpl_body = new XTemplate("templates/body-main.tpl");
    4. $xtpl_footer = new XTemplate("templates/footer.tpl");
    5. ?>
    Дальше идёт сама программа, и в конце такой завершающий эпизод:
    PHP:
    1. <?php
    2. $xtpl_header->out("main");
    3. $xtpl_body->out("main");
    4. $xtpl_footer->out("main");
    5. ?>
    Но есть у меня предчувствие, что начал я делать не так... Ну вот, собственно, такой вопрос. Насколько это правильно/неправильно и как сделать лучше?
     
  5. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    В общем случае:
    Код (Text):
    1.  
    2. // page.xtpl
    3. <!-- BEGIN: page -->
    4. {FILE "header.xtpl"}
    5. {FILE "body-main.xtpl"}
    6. {FILE "footer.xtpl"}
    7. <!-- END: page -->
    PHP:
    1.  
    2. <?php
    3.  $xtpl->parse('page');
    4.  echo $xtpl->text('page');  
    5. ?>
    6.  
    У меня на самом деле немного по-другому. У меня нет body-main.xtpl. Есть класс (типа SitePage)в одном месте, от которого наследуются классы в разных разделах сайта (типа StaticPage). У себя в разделе они имеют свой page.xtpl - копия описанного выше, только там уже есть body.xtpl. Сам StaticPage парсит body.xtpl, а в SitePage парсятся header.xtpl и footer.xtpl. Объяснил как мог :)
     
  6. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    /me пытается сообразить зачем хранить body header и footer в разных файлах...
     
  7. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Mr.M.I.T.
    а чего сложного ? если сайт можно разрезать условно на три части, из которых активно меняется средняя, то наверное так стоит сделать, нет ? ;)

    в случае использование "шаблонизатора" это не несет никакой лишней нагрузки.
    К слову, header и footer тоже имеют подвижный контент.
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    что лучше 4 файла в кеше или один?
     
  9. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Mr.M.I.T.
    Зависит от ситуации. Иногда (и не редко) лучше 4 в кэше.Это если вообще.
    А если в частности (о примере выше), то какая разница, описать это в одном файле или УСЛОВНО разбить на 3 части тоже самое количество байт.?
     
  10. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    1. Это когда лучше 4 в кеше? 0о (я если что про кеширование откомпилированных шаблонов)
    2. Не совсем, ему придётся искать и грузить 4 файла а не один

    т.е. я о чём, если нет пользы, зачем это нужно?
     
  11. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    1. Если про компиляцию - то она на этапе ->parse. Если про хранение 4 в кэше, то без разницы - количество байт одинаково.
    2. Да, микросекунды роляют :). Если у меня будет задача написать под нагруженную систему с десятками тысяч запросов - я использую один файл. А может вообще без шаблонизатора.
    Предлагаю не спорить по этому вопросу, потому как неплодотворно, я понимаю вашу мысль, а учавствовать в разминке мышц не очень хотса, ибо все-таки флуд :).

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

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

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    Хмм.. А что лучше поменять 1 footer который подключается во все шаблоны или все шаблоны?
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    /me опять не доганяет как же мы тут в гибкости выигрываем

    нафига во всех шаблонах городить один и тот же футер? 0о
    шаблон это представление одной функциональной части

    вообще шаблоны нужно (думаю так многие считают) разделять по функциям в не по виду
    т.е. например, главный шаблон, шаблон для публикаций, шаблон для регистрации и тд
    для каждого нужно выделять по процессу

    а вот такая ситуация, допустим у нас в хидере и боди есть переменная title, но в боди это переменная должна содержать название публикации, в а хидере это титл страницы
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Спасибо! :) Вчера, после того, как задал тут свой вопрос - уехал на дачу. Погулял там с собакой, сидел вечером пил чай и мне в голову тоже пришла эта идея. :D

    Ну просто на сайте несколько страничек и на каждой страничке одинаковое начало и окончание. Причём оно хоть и одинаковое, но тоже не чистый html, а имеются всякие вставки типа всего в базе ххх записей, у нас ххх пользователей и т.д.
    Можно, конечно, это вставлять в шаблон каждой странички, но если вдруг захочется что-то поменять или доделать в этой "шапке" сайта - придётся вносить изменения в шаблон каждой странички, а так - только в один.
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    И ещё вопрос по XTemplate... В примерах, которые шли в архиве вместе с самим шаблонизатором встречаются строки наподобии этой:
    HTML:
    1. <!-- $HeadURL: [url=https://xtpl.svn.sourceforge.net/svnroot/xtpl/trunk/ex3.xtpl]https://xtpl.svn.sourceforge.net/svnroo ... k/ex3.xtpl[/url] $
    2. $Id: ex3.xtpl 16 2007-01-11 03:02:49Z cocomp $ -->
    Зачем это нужно и нужно ли вообще...?
     
  16. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Это для того, чтобы знать кто и когда менял данный файл в SVN.
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    блиин, нафига в каждый шаблон пихать футер и хидер?
    ладно, попробую объяснить кодом
    PHP:
    1. <?
    2. $tpl= new smarty(); // угу
    3. $result=array();
    4. // выводим контент
    5.  $tpl->assign("text","text text");
    6.  $tpl->assign("title","title content");
    7.  $result['content']=$tpl->fetch('content.tpl'); // теперь контент в одной переменной
    8. // вместо шаблона контента, можно подключать например шаблон регистрации и тд.
    9.  
    10. // выводим главный шаблон
    11. $tpl->assign("title","header title");
    12. $tpl->assign('footer',"footer g"); // лучше это делать через $result чтобы избежать повторений
    13. $tpl->assugn($result);    // теперь наш контент доступен в шаблоне ввиде переменной
    14. $tpl->display('main.tpl');
    15. /*
    16. т.е.
    17. листинг шаблона main.tpl будет примерно такой
    18.  
    19. <html>
    20. <head>{$title}</head>
    21. <body>
    22. {$content}
    23. </body>
    24. {$footer}
    25. </html>
    26.  
    27. а content.tpl
    28.  
    29. Контент<br>
    30. {$title}<br><br>
    31. {$text}<hr>
    32. */
    33. ?>
    короче я не знаю как ещё объяснить что я хочу сказать =)
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Mr.M.I.T., кажется я догнал, о чём ты...Типа вместо:
    делать:
    HTML:
    1. // page.xtpl
    2. <!-- BEGIN: page -->
    3. // шаблон "шапки"
    4. {FILE "body-main.xtpl"}
    5. // шаблон "футера"
    6. <!-- END: page -->
    И получится 2 файла с шаблнами вместо 4х или 3х... Так?
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    типа =)
    только body-main.xtpl не надо инклудить, иначе теряется смысл
    для body-main.xtpl лучше делать отдельный процесс обработки, результат в переменную, переменную в page.xtpl
     
  20. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Mr.M.I.T.
    1. Что-то не знаю даже, а в XTemplate есть ли функция
    ?
    Я так понимаю, что эта функция возвращает "пропарсеный" шаблон (и можно переменной присвоить это значение)? Т.е. она выдаст тоже самое, что и $xtpl->out(), только out() передаст результат браузеру клиента, а fetch() - вернёт результат и его можно присвоить переменной?
    2. А чем будет лучше то, что ты предлагаешь, чем вышеупомянутый вариант:
    HTML:
    1. <!-- BEGIN: page -->
    2. // шаблон "шапки"
    3. {FILE "body-main.xtpl"}
    4. // шаблон "футера"
    5. <!-- END: page -->
    ?
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    если нет, значит в жо*у такой шаблонизатор
    да
    переменные в body и page tpl могут иметь одинаковые имена, но разные значения...
    есть и другие приемущества, например тебе надо скопировать 10 шаблонов body в page tpl
    или надо скешировать шаблон body
    и тд.
     
  22. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну теперь жду obsrv - он мне порекомендовал XTemplate и, наверно, знает, есть ли в нём функция, аналогичная
    PHP:
    1. $tpl->fetch('content.tpl')
    ? :)
     
  23. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    sobachnik
    думаю тебе стоит просто гугльнуть ;)
     
  24. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    sobachnik
    Вот мой ответ (возьмем из примера ;) ):
    Код (Text):
    1.  
    2.   // page.xtpl
    3.   <!-- BEGIN: page -->
    4.    {FILE {LANGUAGE}}
    5.   <!-- END: page -->
    PHP:
    1.  
    2. <?php
    3.   // все как обычно
    4.   $xtpl->assign_file('LANGUAGE', 'body.xtpl');  // body_ru.xtpl, body_en.xtpl, whatever you want
    5.   // тыт parse разные
    6.   $xtpl->out('page');
    7. ?>
    8.  
    Можно посмотреть example 7.
    А вообще сурс смотреть полезная штука. Я там еще даже не все знаю :)
    Я "ответил" ? ;)
     
  25. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    obsrv, спасибо. То, что можно подключать файлы других шаблонов я уж понял. И то, что можно задавать их имена из основного скрипта - тоже. Там (выше) вопрос немного в другом был:
    PHP:
    1. $tpl->[b]fetch[/b]('content.tpl')