ФорумПрограммированиеПыхнуть хотите?F.A.Q. → XTemplate - читаем конфигурацию из шаблона

XTemplate - читаем конфигурацию из шаблона

  • Sinkler

    Сообщения: 8083 Репутация: N Группа: в ухо

    Spritz 20 сентября 2010 г. 13:29, спустя 67 дней 10 часов 25 минут

    Представим себе ситуацию: имеем блок, который выводит новости.
    <!– BEGIN:news –>
     <td class="div_1">
       <table>
         <tr>
           <td valign="top" class="image"><a href="{news.link}"><img src="{news.image}" alt="" /></a></td>
           <td valign="top">
             <span>{news.date}</span>
             <p>{news.title}</p>
             <img src="{config.path.img}icon_str.gif" alt="" /><a href="{news.link}">Подробнее</a>
           </td>
         </tr>
       </table>
     </td>
    <!– END:news –>

    Блок используется на всех страницах сайта. Естественно, логично будет вынести парсинг этого блока куда-нибудь в бифор-каллбек контроллера, чтобы каждый раз не определять его вручную. А теперь представим, что злыдни-дизайнеры решили выводить на разных страницах разное количество новостей и при этом не говорят нам какое, а сами хотят определять это число.

    К нашему великому счастью, класс XTemplate обладает волшебным методом reset:
    	
         /**
        * resets the parsed text
        *
        * @access public
        * @param string $bname Block to reset
        */
    public function reset ($bname) {

    $this->parsed_blocks[$bname] = '';
    }

    Как его можно применить в нашей ситуации? Всё очень даже примитивно: создадим специальный конфигурационный блок, в котором версталы будут писать число - количество новостей, которое нужно выводить.
    <!– BEGIN:count –>3<!– END:count –>

    Ну а дальше в контроллере считываем это количество и сбрасываем этот блок:
    $xtpl->parse('count');
    $count = $xtpl->text('count');
    $xtpl->reset('count');

    Для удобства можем создать метод с произвольным названием, чтобы каждый раз не писать эти три строчки:
    class SinklerXTemlate extends XTemplate {
       public function __construct($file, $tpldir = '', $files = null, $mainblock = 'main', $autosetup = true) {
           parent::__construct($file, $tpldir, $files, $mainblock, $autosetup);
       }
       public function read_cfg($bname) {
           $this->parse($bname);
           $cfg = $this->text($bname);
           $this->reset($bname);
           return $cfg;
       }
    }

    $count = $xtpl->read_cfg('count');


    http://sinkler.ru/posts/read_configuration_from_xtemplate
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 14 июля 2010 г. 17:27, спустя 3 часа 58 минут 37 секунд

    а в чем вопрос собственно говоря?
    Спустя 47 сек.
    и да, xtemplate отстой по сравнению с Twig'ом ^^
  • Sinkler

    Сообщения: 8083 Репутация: N Группа: в ухо

    Spritz 14 июля 2010 г. 17:28, спустя 58 секунд

    а в чем вопрос собственно говоря?


    А теперь представим, что злыдни-дизайнеры решили выводить на разных страницах разное количество новостей и при этом не говорят нам какое, а сами хотят определять это число.

  • Sinkler

    Сообщения: 8083 Репутация: N Группа: в ухо

    Spritz 14 июля 2010 г. 18:15, спустя 46 минут 18 секунд

    и да, xtemplate отстой по сравнению с Twig'ом ^^

    мы стараемся как можно больше ущемить верстальщиков в их возможностях)))
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 15 июля 2010 г. 3:03, спустя 8 часов 48 минут 31 секунду

    для этого в Twig'е "искаропки" есть расширение Sandbox. + ессно можно настроить какие теги/фильтры разрешены

Пожалуйста, авторизуйтесь, чтобы написать комментарий!