За последние 24 часа нас посетили 18439 программистов и 1686 роботов. Сейчас ищут 945 программистов ...

Помогите разобраться в работе шаблонизатора

Тема в разделе "PHP для новичков", создана пользователем Spirtt0, 19 окт 2010.

  1. Spirtt0

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

    С нами с:
    29 ноя 2009
    Сообщения:
    15
    Симпатии:
    0
    Доброго дня !

    Есть простенький парсер шаблонов (отсюда http://www.codenet.ru/webmast/php/Templates-About.php)
    Вывожу с его помощью в цикле анонс:

    PHP:
    1.  
    2.        $parse->get_tpl('templates/anonsmedia.tpl');
    3.  
    4.        while($media = mysql_fetch_array($mediaget))
    5.             {
    6.                 $parse->set_tpl('{TITLE}',$media['title']);
    7.                 $parse->set_tpl('{ID}',$media['id']);
    8.                 $parse->set_tpl('{DATE}',$media['date']);
    9.                 $parse->set_tpl('{PROPS}',$media['props']);
    10.  
    11.                 $parse->tpl_display();
    12.             }
    13.  
    Шаблон:

    Код (Text):
    1. <table class="shortanons">
    2.     <tr><td  style='width:88px;height:88px;' align='center' rowspan='2'>{MEDIAIMG}<br /></td>
    3.     <td  style='width:2px;' rowspan='2'>&nbsp;</td>
    4.  
    5.     <td height="52" align="left" valign="middle">
    6.          {TITLE}...&nbsp;<a href='media&read&id={ID}'></a>
    7.     </td></tr>
    8. </table>
    Все работает за исключением одного момента, каждый проход цикла выводит одни и те же данные на экран, хотя если сделать вывод переменной в этом же цикле ($media['title'] к примеру), то видно что ее значение меняется, а после парсинга шаблона почему то {TITLE} всегда заменяется на $media['title'], которая была при первом проходе цикла.

    Почему такое может происходить ? :?:
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Spirtt0
    Ошибка реализации шаблонизатора, видимо. Вместо того, чтобы работать динамично, каждый раз с новыми данными, он генерирует статику и потом тупо отдает один и тот же HTML фрагмент.
    Выходов два - либо самому починять этот шаблонизатор, либо использовать другой.
    Попробуйте $parse->get_tpl(...) перенести внутрь цикла.
     
  3. Spirtt0

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

    С нами с:
    29 ноя 2009
    Сообщения:
    15
    Симпатии:
    0
    Очень похоже на это.

    Спасибо ! это помогло, но получается что каждый проход парсер будет загружать шаблон с диска ? Или в таких случаях он кешируется сервером и это не сильно влияет на скорость работы скрипта ?
     
  4. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Spirtt0
    Да, видимо, файл будет читаться снова и снова.
    Кешируется-то он кешируется, но все равно такой вариант выглядит несколько неразумно.
    Напишите аффтору этого "шаблонизатора" разгромный отзыв :) заодно скажите ему, что заменять переменные значениями в цикле, используя str_replace - порочный алгоритм... если уж делать это "на лету", то через strtr().
     
  5. Spirtt0

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

    С нами с:
    29 ноя 2009
    Сообщения:
    15
    Симпатии:
    0
    Чтож будем разбираться :)

    Там и без меня уже высказались :) А чем плох str_replace , большая часть шаблонизаторов его использует ?
     
  6. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Spirtt0
    Он алгоритмически неверен. Замена идентификаторов на значения происходят не одновременно, а по очереди, сначала первый идентификатор, потом второй и т. д. Теперь представьте, что внутри значения одного идентификатора оказалось название другого идентификатора:

    {PROPS} => 'Новая игра от {ID} Software.'
    {ID} => 12345

    Если в шаблоне встречается 'Новинка! {PROPS}', то в результате получится не 'Новинка! Новая игра от {ID} Software.', а 'Новинка! Новая игра от 12345 Software.', потому что при втором проходе шаблонизатор зацепит не только исходный шаблон, но и уже подставленные значения. А это чревато багами, уязвимостями и т. п.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    радуют меня такие "шаблонизаторы"...