За последние 24 часа нас посетили 18927 программистов и 1605 роботов. Сейчас ищут 1147 программистов ...

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

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

  1. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    нее, ему надр результат парсинга одного из шаблонов вернуть
     
  2. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    В догонку (слепил за 2 минуты - чесслово, так что думаю можно оптимизировать):
    Код (Text):
    1.  
    2. // page.xtpl
    3. <!-- BEGIN: page -->
    4. <html>
    5. <head><title>{title}</title></head>
    6. <body>
    7. {FILE {BODYRU}}
    8. <hr/>
    9. {footer}
    10. </body>
    11. </html>
    12. <!-- END: page -->
    13.  
    14. // body.xtpl
    15. <!-- BEGIN: main -->
    16. <p style="background-color: #f0f1f0;">Контент:<br/>
    17. {title} and {footer}
    18. </p>
    19. <!-- END: main -->
    PHP:
    1.  
    2. <?php
    3. include_once('./XTemplate.class.php');
    4. $xtpl = new XTemplate('page.xtpl');
    5. $xtpl->assign('footer', 'footer');
    6. $xtpl->assign('title', 'title');
    7. $xtpl->assign_file('BODYRU', 'body.xtpl');
    8. $xtpl->parse('page.main');
    9. $xtpl->assign('footer', 'footer1');
    10. $xtpl->assign('title', 'title1');
    11. $xtpl->parse('page');
    12. $xtpl->out('page');
    13. ?>
    14.  
    надо будет посмотреть доки и сам код, думаю все-таки там можно еще проще и красивше.
     
  3. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Mr.M.I.T.sobachnik
    Результат парсинга дает $xtpl->text( имя блока );

    Я надеюсь мы не придем к спору что круче smarty или xtemplate ?! Я уже выше все писал по этому поводу.
    А то у меня, чуть-чуть, уже подозрение появилось ;).

    Повторюсь: все задачи, которые передо мной стояли, решались xtemplate. (а далее: парой страниц назад).
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    obsrv, спасибо! Вот про
    $xtpl->text("main");
    я и спрашивал! :) И (вроде) эта функция в примерах не рассматривалась, поэтому и не знал, собственно. Полностью код всего XTemplate я себе распечатал, всё хочу его перечитать внимательно и разобраться, но пока ещё этого не сделал.
    Спорить о том, что лучше (лично я) ни сколько не хочу - во-первых знания не те, чтобы спорить на эту тему, во-вторых, я в принцыпе не конфликтный чел и спорить не люблю. Собственно после того, как сейчас узнал про $xtpl->text("main"); мне пока Xtemplate тоже хватает! :)

    Ещё раз спасибо.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    P.S. Ну и кроме того даже если бы функции text() не было, всё равно врядли стал бы использовать другой шаблонизатор, т.к. к этому уже начал понемногу привыкать. Просто воспользовался бы тем способом, который obsrv описал в предпоследнем своём посте. А потом, возможно (посовещавшись с вами), дописал бы эту функцию в XTemplate.
     
  6. obsrv

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

    С нами с:
    2 окт 2008
    Сообщения:
    238
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    всем :beer: :)
     
  7. benifactor

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

    С нами с:
    25 дек 2008
    Сообщения:
    1
    Симпатии:
    0
    Не мог ли кто-нибудь пояснить назначение следующей конструкции:

    Код (Text):
    1.  
    2. # reset($GLOBALS);
    3. #  
    4. #          while(list($name,$val) = each($GLOBALS)) {
    5. #  
    6. #              # выбираем только строки и числа
    7. #              if(is_string($val) OR is_int($val)) {
    8. #                  $this->buffer = str_replace('{'.$name.'}',$val,$this->buffer);
    9. #                   }
    10. #              }
     
  8. в шаблонизаторе подставляются в шаблон существующие переменные из скрипта.
     
  9. Buzz

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

    С нами с:
    4 окт 2009
    Сообщения:
    1
    Симпатии:
    0
    Гуру, приветствую. Подскажите, при использовании этой замечательной конструкции требуется вместо значения переменной подставить скрипт. По порядку:

    1. Обработчик результатов формы содержится в parser.php. Однако, нужно обработчик "упаковать" в готовый темплейт.
    2. Для этого натравляем форму вместо parser.php на info.php
    3. info.php должен содержать не только скрипт обработки данных формы (parser.php), но и темплейт (index.html).
    4. Темплейт index.html содержит указатель {content}, куда вставляется содержимое страницы (куда и требуется воткнуть parser.php).

    Нижеприведённый код не работает, естественно (содержание info.php):
    Код (Text):
    1. include_once("buffer.inc");
    2.  
    3. $content = new Buffer("parse.php");
    4. $content->SendFile("parse.php");
    5.  
    6. $HTML = new Buffer("index.html");
    7. $HTML->Parse();
    8. $HTML->Show();
    index.html выводится, а вместо кода parse.php выводится "{content}"

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

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

    С нами с:
    2 ноя 2007
    Сообщения:
    7
    Симпатии:
    0
    попробовал разобраться с этим кодом. насколько я понял, основную задачу парсинга шаблона выполняет функция extract().
    читаю про эту функцию в книге:

    Подскажите, гуру ПХП, почему "для небольших массивов" и "признаком дурного тона"?
     
  11. thunderpick

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

    С нами с:
    10 апр 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Москва
    Всем привет!
    Подскажите вот с чем...
    Это говнокод?
    PHP:
    1.    
    2. <?
    3. ...
    4. while(list($name,$val) = each($GLOBALS)) {
    5.             if(is_string($val) OR is_int($val)) {
    6.                 while (list($name_POST, $val_POST) = each($_POST)) {
    7.                     if ($val != $val_POST){
    8.                 $this->buffer = str_replace('$'.$name,$val,$this->buffer);
    9.                     }
    10.                 }
    11.             }
    12.         }
    13. ...
    14. ?>
    15.  
    Я просто для себя ещё не решил... :D
     
  12. Дааа... это однозначно говонокод!!))))
     
  13. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    Ты сам видел, какой массив перебираешь? =)
    PHP:
    1. <?php
    2. print_r($GLOBALS);
    while-list-each в 8 раз медленнее, чем foreach.
    Да-да, эта проверка для того, чтобы, в случае, если включены register_globals, переменнеы из POST не попали в шаблон. А как же переменные из GET, COOKIE и SESSION?
    А сам шаблон - объект!
    Epic bingo!!! ))
     
  14. Не, на самом деле, мышление интересное. Когда оно подкрепится опытом - из него выйдет толк.
    По коду видно, что соображалка работает, просто знаний и опыта не хватает.
     
  15. thunderpick

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

    С нами с:
    10 апр 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Москва
    А если допустить, что массив большой...
     
  16. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    На самом деле плохо использовать extract в глобальной области видимости. Дело в том, что при модифицировании скрипта тебе придется помнить, какие перменные извлекаются с помощью extract.
     
  17. thunderpick

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

    С нами с:
    10 апр 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Москва
    а если var_dump ?
     
  18. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.557
    Симпатии:
    631
    А что var_dump?
     
  19. thunderpick

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

    С нами с:
    10 апр 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Москва
    ну типа извлечь значения...или тоже плохой тон?
     
  20. igortik

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

    С нами с:
    29 июн 2009
    Сообщения:
    41
    Симпатии:
    0
    ну, это в случае, если нет никакого вывода.. а вот с выводом поинтереснее..

    ob_start(), ob_get_contents(), ob_end_clean() ит.д.

    Вот только лично я столкнулся с проблемой вложенного буфера в буфер, т.е. некой конструкцией:

    PHP:
    1.  
    2.  
    3. $mod = ob_get_contents();
    4.  
    5. $content = ob_get_contents();
    Полагаю,что она не верна, т.к. буферизацию если инициировать то и нужно также закрыть перед открытием следующей.
    А у меня первая ob_start() юзает gz_handler ...

    p.s. Напоминает мне это все XHTML 1.0 Strict и незакрытые теги :)
     
  21. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  22. vench

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

    С нами с:
    3 май 2010
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    Россия
    По моему неплохо добавить в класс метод добавление массивов типа ключ значение и создать внутренний член массив где они будут хранится. Соответственно при прсере шаблона они будут заменять тэги шаблона.

    В итоге на выходе получается один массив где все итоговые данные. И это действительно очень удобно, т.к. мы можем сделать выгрузку данных например в XML или загрузить в FLASH ролик. Получается дизайн независим от конечной информации.
     
  23. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
  24. vench

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

    С нами с:
    3 май 2010
    Сообщения:
    12
    Симпатии:
    0
    Адрес:
    Россия
    Извиняюсь, не заметил.
     
  25. kadet

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

    С нами с:
    2 авг 2010
    Сообщения:
    79
    Симпатии:
    0
    Есть возможность обойти
    PHP:
    1. reset($GLOBALS);
    Если в функцию Parse($txt) передать переменную, которую нужно заменить.
    В шаблоне можно сделать несколько функций
    ParseText($txt);
    ParseMenu($menu);
    и т.д.