За последние 24 часа нас посетили 17432 программиста и 1716 роботов. Сейчас ищет 1601 программист ...

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

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

  1. Hight

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

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    примерно вот так (если я правильно понял вопрос):
    PHP:
    1.  
    2. <?php
    3. function parsetpl($file)
    4. {
    5.     $tpl = @file_get_contents($file);
    6.     $content = @preg_replace('/{([a-zA-Z_0-9]+)}/e', '$GLOBALS[${1}]', $tpl);
    7.     return $content;
    8. }
    9. ?>
    10.  
     
  2. Keo

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

    С нами с:
    20 сен 2006
    Сообщения:
    38
    Симпатии:
    0
    то есть набор символов начинающийся и заканчивающийся фигурными скобками заменяется на переменную $Globals?
     
  3. Hight

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

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Keo
    ну да... заменяется на глобальную переменную...
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Кстати, на счёт http://www.massassi.com/php/articles/template_engines/

    Кто что скажет ?

    Я вот считаю что код в статье мог бы быть более аккуратным, однако в целом ИМХО лучшая статья на эту тему.
     
  5. Anonymous

    Anonymous Guest

    Vladson, последняя фраза 100 баллов!
    «In short, the point of template engines should be to separate your business logic from your presentation logic, not separate your PHP code from your HTML code.»
    О чем всю жизнь твержу...
     
  6. 440Hz

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

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

    =)
     
  7. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Мне там больше всего нравится сам шаблонизатор (для себя правда я подправил его немного) все его плюсы очевидны:
    - Выполняет все свои функции
    - Настолько простой что запутаться в нём просто невозможно
    продолжать можно долго

    Но главное что шаблонизатор даже без самой статьи говорит всё сам за себя, до того как прочитал статью я сначала глянул на пример использования и на сам шаблонизатор, после чего статья читалась уже просто "для галочки"

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

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

    С нами с:
    26 сен 2006
    Сообщения:
    7
    Симпатии:
    0
    У меня появилась такая идея отделения кода от дизайна.
    Имеем, например документ template.html, выглядит так:
    Код (Text):
    1.  
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. <meta name=keywords content=Ключевые слова>
    6. </head>
    7. <body>
    8. <p>It's like comparing apples to oranges.
    9. </body>
    10. </html>
    Пишу такой примерно код:
    PHP:
    1.  
    2. <?
    3. $title = "New replaced title";    # Новый заголовок
    4. $keywords = "New keywords";       # Новые ключевые слова
    5. $pat = "/<html>(.*)<body>/iUs";   # Шаблон для поиска верхней части
    6. # Шаблон для поиска заголовка и ключевых слов
    7. $head_pat = "/(<title>)(.*)(<\/title>)(.*)(<meta name=keywords content=)(.*)(>)/iUs";
    8. # Ищем совпадения с шаблоном
    9. if(preg_match($head_pat, file_get_contents("template.html"), $matches)) {
    10.   # Заменяем, найденный по шаблону текст
    11.  $longstr = preg_replace($head_pat,
    12.               $matches[1].$title.$matches[3].$matches[5].$keywords.$matches[7],
    13.               file_get_contents("template.html"));
    14. } else {
    15.   print 'Промах';
    16. }
    17. # Отделяем верхнюю часть
    18. if(preg_match($pat, $longstr, $matches)) {
    19.   print $matches[0];
    20. } else {
    21.   print 'Промах';
    22. }
    23. ?>
    24. <div align=center>
    25. Здесь вставляем нужный контент
    26. </div>
    27. <?
    28. print stristr($longstr, "</body>"); # Выводим нижнюю часть
    29. ?>
    30.  
    Хочу узнать мнение профессионалов. Стоит, ли развивать дальше такую идею,
    или она в чём-то ущербна?
     
  9. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Коротко говоря "во всём" (такого типа шаблонизаторов полно, но их редко кто использует)
     
  10. Jahont

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

    С нами с:
    26 сен 2006
    Сообщения:
    7
    Симпатии:
    0
    Хотелось бы по-подробнее. В чём ущербность, в использовании регулярных выражений?
     
  11. Davil

    Davil Guest

    Jahont если тебе удобно использовать такую систему, используй ее. В чем проблема?
     
  12. Jahont

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

    С нами с:
    26 сен 2006
    Сообщения:
    7
    Симпатии:
    0
    Davil, проблемы нет. Просто я учусь и меня интересует критика опытных людей, исключительно в образовательных целях. :D
     
  13. Davil

    Davil Guest

    Jahont тогда посмотри исходники готовых шаблонизаторов и подумай что в них удобно, а что - нет. Когда уясняеш для себя сам - это лучше чем слушать непонятную критику других людей. Думай по своему. Не надо подстраиваться под мнение других.
     
  14. Pasha

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

    С нами с:
    8 мар 2006
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Зеленодольск
    Вот читаю и читаю но понять не могу то что кабы «элементарное»
    Например:
    Я храню интерфейс в каком-то файле типа interf.inc мне нужно подставить под {MENUPASS}…и т.д. нужные для этих участков данные, но не могу понять той логики которая выполняется в данной статье. По какому же этапу и вообще выполняются подобного рода действии, объясните для совершенно не въезжающего?
     
  15. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а приведи пример интерфейса?
     
  16. Pasha

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

    С нами с:
    8 мар 2006
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Зеленодольск
    Например:
    PHP:
    1. <?<html>
    2. <head>
    3. <title>{%TITLE%}</title>
    4. <link type="text/css" rel="StyleSheet" href="114.css">
    5. </head>
    6.  
    7. <body bgcolor="#FFFFFF" topmargin="0" leftmargin="0" rightmargin="0" bottommargin="15" marginwidth="0" marginheight="0" style="padding:10px;">
    8.  
    9. <!-- Header -->
    10. <table border="0" cellpadding="0" cellspacing="0" width="800" align="center" >
    11. <tr><td bgcolor="#EBEBEB" width="11"><img border="0" src="t1.gif" width="11" height="21"></td>
    12.     <td bgcolor="#EBEBEB" width="670" background="bg.gif" class="copy">&nbsp;</td>
    13. <td bgcolor="#EBEBEB" width="119"><img border="0" src="d2.gif" width="119" height="21"></td></tr>
    14. </table>
    15.  
    16. <table class="topBorder" border="0" cellpadding="0" cellspacing="0" width="800" height="60" align="center">
    17. <tr>
    18.     <td bgcolor="#383838" background="tbg.gif">&nbsp;
    19.     </td>
    20. </tr>
    21. </table>
    22. <table border="0" cellpadding="0" cellspacing="0" width="800" align="center">
    23. <tr>
    24. <td bgcolor="#EBEBEB" width="119"><img border="0" src="d3.gif" width="119" height="21"></td>
    25.     <td bgcolor="#EBEBEB" width="670" background="bg.gif" align="right" class="copy">&nbsp;</td>
    26. <td bgcolor="#EBEBEB" width="11"><img border="0" src="t2.gif" width="11" height="21"></td></tr>
    27. </table>
    28. <!-- /Header -->
    29. <br>
    30. <table border="0" cellpadding="0" cellspacing="0" width="800" align="center">
    31. <tr>
    32.     <td width="200" valign="top">
    33.       <table border="0" cellpadding="0" cellspacing="0" width="190">
    34. <tr><td>
    35. <table border="0" bgcolor="#E4E4E4" cellpadding="0" cellspacing="0" width="100%">
    36. <tr>
    37. <td width="2%"><img border="0" src="t1.gif" width="11" height="21"></td>
    38. <td width="70%" background="bg.gif">
    39.                   <div class="blockTitle"></div>
    40.                 </td>
    41. <td width="28%"><img border="0" src="b3.gif" width="54" height="21"></td>
    42. </tr>
    43. </table>
    44. </td>
    45. </tr>
    46. <tr>
    47.           <td class="topBorder" style="padding:3px;" bgcolor="#F4F4F4">
    48.             <div align="center">{%MENU%}</div>
    49.           </td>
    50.         </tr>
    51. <tr><td bgcolor="#E4E4E4"><img border="0" src="b2.gif"  width="190" height="21"></td></tr>
    52. </table>
    53. <div style="padding:3px"></div>
    54.       <!-- /Site Menu -->
    55.     </td>
    56. <td valign="top" height="100%">
    57.       <table border="0" cellpadding="0" cellspacing="0" width="600" height="100%">
    58.         <tr>
    59.           <td bgcolor="#E4E4E4" height="21"><img border="0" src="d1.gif" width="119" height="21"></td>
    60.           <td bgcolor="#E4E4E4" width="362" background="bg.gif" align="center" height="21">
    61.             <div class="blockTitle" align="center"></div>
    62.           </td>
    63.           <td bgcolor="#E4E4E4" height="21"><img border="0" src="d2.gif" width="119" height="21"></td>
    64.         </tr>
    65.         <tr>
    66.           <td colspan="3" class="topBorder" style="padding:3px;" width="600" valign="top" height="100%">{%TEXT%}</td>
    67.         </tr>
    68.         <tr>
    69.           <td bgcolor="#E4E4E4" height="21"><img border="0" src="d3.gif" width="119" height="21"></td>
    70.           <td bgcolor="#E4E4E4" width="362" background="bg.gif" align="center" class="copy" height="21">
    71.           </td>
    72.           <td bgcolor="#E4E4E4" height="21"><img border="0" src="d4.gif" width="119" height="21"></td>
    73.         </tr>
    74.       </table>
    75. </td>
    76. </tr>
    77. </table>
    78. </body>
    79. </html>?>
    Визуально вот
     
  17. 440Hz

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

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

    1. надо поменять {%TITLE%} на {TITLE}
    2. загрузить в буфер шаблон и распарсить его

    $TITLE = 'Заголовок';

    $BODY = new Buffer('template.inc');
    $BODY->parse();
    $BODY->Show();
     
  18. Hight

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

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    Pasha
    можешь посмотреть мою функцию-шаблонизатор:
    http://www.php.ru/forum/viewtopic.php?t=1629&start=30
    она проще чем у 440hz

    p.s. функция рабочая, но я не рекомендую её к использованию. скорее я написал её, чтобы показать идею.
     
  19. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    Как-то мне не очень нравится что класс создания шаблона работает с глобальными переменными неявно. На мой взгляд, это источник ошибок.
     
  20. Петр

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

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    virabhadra, если использовать $GLOBALS,
    то это не источник ошибок, это водопад.
     
  21. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    Почему отказывается выводить вот такую структуру:

    PHP:
    1. $microtime = explode(" ",microtime());
    2. $time = round($microtime[0], 4);
    в шаблоне стоит - {time}
    еще три десятка переменных отпарсены нормально.
    если убрать округление, то вывод нормальный.
    если вывести переменную с помощью echo и print_r, то выводится ожидаемое число.

    пробовал переприсваивать его значение еще одной переменной, эффект тот же..

    пробовал после этого значения (оно последнее) выводить другие - выводится нормально..
     
  22. virabhadra

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

    С нами с:
    11 дек 2006
    Сообщения:
    127
    Симпатии:
    0
    Адрес:
    Praha, Czech Republic
    DarkElf, не понятно в каком виде хочешь вывести число.
    Как целое или с плавающей точкой и нулями после точки?

    Функция round() выдает тип float, т.е. $time это float.
    Если хочешь целого, то нужно его intval()-ом, например.
     
  23. Xpert

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

    С нами с:
    15 дек 2006
    Сообщения:
    47
    Симпатии:
    0
    DarkElf
    Потому что в коде шаблонизатора стоит проверка - вывод только строк и целых чисел.

    440Hz
    Как и предрекали в первом посте темы, этот код будут использовать все кому не лень :)
     
  24. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    кому не лень, тот внимательно прочитает и будет понимать что к чему. кому действительно лень вникать и Copy+Paste любимые команды помочь ничем не могу. Это клиника.
     
  25. 440Hz

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

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    # выбираем только строки и числа
    if(is_string($val) OR is_int($val)) {

    прочти внимательно и осмысли почему?

    если не понятно

    $tmie = 'строка';
    вывод

    $time = 777;
    вывод

    $time = 0.0;
    фтопку ...