За последние 24 часа нас посетили 17547 программистов и 1712 роботов. Сейчас ищут 1883 программиста ...

Шаблонизатор

Тема в разделе "Решения, алгоритмы", создана пользователем Danilka, 30 апр 2008.

  1. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    [loop srce]
    <li><span class="top"><a href="?do=cat&id=[id]">[title2]</a></span></li>
    [/loop]
     
  2. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Danilka
    ну как? есть прогресс?
    я тут предлагаю:
    сделать по умолчанию открывающие/закрывающие теги вот такими - [:/:]
    обращаться в цикле не
    HTML:
    1. [loop array]
    2.     [var]
    3. [/loop]
    4.  
    HTML:
    1. [:loop array:]
    2.     [:array[var]:]
    3. [:/loop :]
    4.  
    Это избавило б от путаницы.

    по поводу моей проблемы. Другой вариант решения. Ввести метод subloop. Описывается только в шаблоне
    PHP:
    1. <?php
    2. include'phparser.php';
    3. $tpl = new phparser('tpl', 'cache');
    4. $tpl->load('test');
    5.  
    6. $faculty[0]['id'] = 1; $faculty[0]['title'] = 'МТ';
    7. $faculty[0]['chair'][0]['chair_id'] = 1; $faculty[0]['chair'][0]['chair_title'] = 'Геодезии';
    8. $faculty[0]['chair'][1]['chair_id'] = 3; $faculty[0]['chair'][1]['chair_title'] = 'Инженерной графики';
    9.  
    10. $faculty[1]['id'] = 2; $faculty[1]['title'] = 'ТК';
    11. $faculty[1]['chair'][0]['chair_id'] = 2; $faculty[1]['chair'][0]['chair_title'] = 'ПМ';
    12. $faculty[1]['chair'][1]['chair_id'] = 4; $faculty[1]['chair'][1]['chair_title'] = 'ЭВМ';
    13. $faculty[1]['chair'][2]['chair_id'] = 5; $faculty[1]['chair'][2]['chair_title'] = 'КИТ';
    14.  
    15. $faculty[2]['id'] = 2; $faculty[1]['title'] = 'ТК';
    16. $faculty[2]['chair'][0]['chair_id'] = 6; $faculty[2]['chair'][0]['chair_title'] = 'Философии и социологии';
    17. $faculty[3]['chair'][1]['chair_id'] = 7; $faculty[2]['chair'][1]['chair_title'] = 'Физкультуры и спорта';
    18.  
    19. $tpl->l('faculty', $faculty);
    20.  
    21. $tpl->re_cache();
    22. $tpl->parse();
    23. ?>
    24.  
    шаблон:
    HTML:
    1. [:loop faculty:]
    2.     [:faculty[id]:] - [:faculty[title]:]
    3.     [:subloop faculty[chair]:]
    4.         |-[:chair[id]:] - [:chair[title]:]
    5.     [:/subloop:]
    6. [:/loop:]
    Нужен обработчик этого subloop
     
  3. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Замутил такую штуку.
    Теперь можно переменные обозначать отдельным символом, как в пыхе. По умолчанию сделал #, чтобы с пыхом путаницы не ьыло. Но это, как всегда, не принципиально. Можно заменить тег на любой другой, любой длины. То есть можно [var], а можно [#var]. И, соответственно сделал в циклах возможность использовать переменные вместо имени.
    То есть твой пример теперь решаем так:
    PHP:
    1. include './phparser.php';
    2. $tpl = new phparser('tpl', 'cache');
    3.  
    4. $tpl->load('loopin');
    5.  
    6. $f = NULL;
    7. $f[0]['f_name'] = 'MT';
    8.     $k = NULL;
    9.     $k[0][k_name] = 'Geodezii';
    10.     $k[1][k_name] = 'Ingenernoy grafiki';
    11.     $tpl -> l( 'mt_kaf' , $k );
    12.     $f[0]['kaf'] = 'mt_kaf';
    13. $f[1]['f_name'] = 'TK';
    14.     $k = NULL;
    15.     $k[0][k_name] = 'PM';
    16.     $k[1][k_name] = 'EVM';
    17.     $k[2][k_name] = 'KIT';
    18.     $tpl -> l( 'tk_kaf' , $k );
    19.     $f[1]['kaf'] = 'tk_kaf';
    20. $f[2]['f_name'] = 'Other';
    21.     $k = NULL;
    22.     $k[0][k_name] = 'Filosofii & sociologii';
    23.     $k[1][k_name] = 'Fizkulturi & sporta';
    24.     $tpl -> l( 'other_kaf' , $k );
    25.     $f[2]['kaf'] = 'other_kaf';
    26.  
    27. $tpl->l( 'fak', $f );
    28.  
    29. $tpl -> re_cache();### while developing
    30. $tpl -> parse();
    HTML:
    1. [loop fak]
    2.     <b>[f_name]</b><br>
    3.     [loop #kaf]
    4.         - [k_name]<br>
    5.     [/loop]
    6.     <br>
    7. [/loop]
    Не сделал двойные скобки, как ты предлогал из-за того, что возникли бы проблемы с самовложенностью шаблонов.

    Про теги, простите уж меня, но пока менять не хочется. Всё-равно, когда-нибудь парсер станет более стабилен и функционально полон. Тогда не придётся так часто качать новую версию и менять теги.

    P.S. Версия (0.8a) , традиционно, на сайте.
     
  4. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Danilka, огромное спасибо, сейчас гляну

    да, это оно! Спасибо еще раз
     
  5. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Обсуждаем html версию http://php.ru/forum/viewtopic.php?t=13454
    В процессе - 0.9а
    Перенёс функцию отключения кэша в переменную конфига. Добавил парсинг с возвратом значения. То есть теперь парсером можно парсить письма, текст и пр.
    Выкладывать пока не буду. Скорее всего уже вместе с html версией, чтобы было хоть какое-то соответствие.
    Ман уже тоже отстаёт от версий. А писать не хочется. Как думаете, может на фрилансе можно заказать, чтобы кто-нибудь грамотный написал ман, по завершению альфы?
     
  6. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в новой версии вложеные условия не работают.

    HTML:
    1. [:load header:]
    2.  
    3. <div id="rCol">
    4.     [:load admin-menu:]
    5. </div>
    6.  
    7. <div id="lCol">
    8.     [:lCol:]
    9.     <h3><img src="images/32/text-file.png" alt="" /> Список городов</h3>
    10.     [:if showCity:]
    11.         [:load list-loop-city:]
    12.         <a href="?do=add&amp;add=city[:if province_id:]&amp;province_id=[:province_id:][:/if:]&amp;redirectFrom=[:redirectFrom:]"><img src="images/16/add.png" alt="" /> Добавить еще</a>
    13.     [:else:]
    14.         <!--<span class="error">Прежде необходимо <a href="?do=add&amp;add=city[:if province_id:]&amp;province_id=[:province_id:][:/if:]&amp;redirectFrom=[:redirectFrom:]"><img src="images/16/add.png" alt="" /> добавить</a> хотя бы 1 город</span>-->
    15.     [:/if:]
    16. </div>
    17.  
    18. [:load footer:]
    в кратце: на версии 0,7 конструкция
    [:if a:]
    [:if b:][:b:][:/if:]
    [:/if:]
    работала, на версии 0,8 не хочет. Тот, что выделен жирным не преобразовывается в }

    upd0: стоп, баг под вопросом

    upd1: баг есть, но какой-то не понятный.

    настройки:
    define( 'TPL_FILE_TYPE' , '.tpl' );
    define( 'TPL_CACHE_FILE_TYPE' , '.ch' );
    define( 'TPL_TAG_OPEN' , '[:' );
    define( 'TPL_TAG_CLOSE' , ':]' );
    define( 'TPL_TAG_VAR' , '#' );
    private $re_cache = true; //выведи это в константу, будет удобней

    шаблон:
    [:if a_a:]
    [:if b_b:][:b_b:][:/if:]
    [:/if:]

    код:
    <?
    include( './phparser.php' );
    $tpl = new phparser( 'tpl' , 'cache' );
    $tpl->load( 'test' );

    $tpl->v('a_a', 1);
    $tpl->v('b_b', 2);

    $tpl -> parse();
    ?>

    реальный вывод: [:b_b:] .
    ожидаемый вывод: 2

    кеш-файл:
    <?if($tpl_var['a_a'] ){?>
    <?if($tpl_var['b_b'] ){?>[:b_b:]<?}?>
    <?}?>
     
  7. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Ага, баг вижу. Что-то с длинной тэгов не то. С обычными работает. Сейчас буду исправлять.
    Поправил, вроде работает. Проверяйте.
    Так же выложил начало версии 0.9 но в мане ничего не описывал. Если кто хочет, можно качнуть на сайте.
     
  8. sword dancer

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

    С нами с:
    17 фев 2008
    Сообщения:
    295
    Симпатии:
    0
  9. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я вернулся из отпуска, хорошенько отдохнул.

    Danilka, что там с кешем?
    И все-таки думаю, что нужно как-то отделять переменные, например
    PHP:
    1. <?
    2. //...
    3. $myVar[0]['id'] = 3;
    4. $myVar[0]['title'] = 'title1';
    5. $myVar[1]['id'] = 5;
    6. $myVar[1]['title'] = 'title2';
    7. $myVar[2]['id'] = 6;
    8. $myVar[2]['title'] = 'title3';
    9. $tpl->l('myVar', $myVar);
    10.  
    [:loop myVar:]
    [:myVar[id]:] - [:myVar[title]:]
    [:/loop:]

    я очень путаюсь во всем этом
     
  10. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    мне нужна помощь:

    есть переменная, как множество
    $set = '3,5,9';

    есть шаблон
    ...
    <input type="checkbox" name="ftuct[0]" value="1" /><br />
    <input type="checkbox" name="ftuct[1]" value="2" /><br />
    <input type="checkbox" name="ftuct[2]" value="3" /><br />
    <input type="checkbox" name="ftuct[3]" value="4" /><br />
    <input type="checkbox" name="ftuct[4]" value="5" /><br />
    <input type="checkbox" name="ftuct[5]" value="6" /><br />
    <input type="checkbox" name="ftuct[6]" value="7" /><br />
    <input type="checkbox" name="ftuct[7]" value="8" /><br />
    <input type="checkbox" name="ftuct[8]" value="9" /><br />

    ...
    нужно чтоб ftuct[2], ftuct[4], ftuct[8] были отмечены
    <input type="checkbox" name="ftuct[8]" checked value="9" /><br />

    как сделать?
     
  11. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    Код (Text):
    1. for($i=0;$i<count();$i++){
    2.     $che="";
    3.     if (preg_match("(^".$i."\,|^".$i."$|\,".$i."\,|\,".$i."$)", $set)) {
    4.         $che="checked";            
    5.     }
    6.     echo "<input type=\"checkbox\" name=\"ftuct[".$i."]\" ".$che." value=\"".($i+1)."\">";
    7. }
     
  12. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    ой, ей, еще и регулярки. Я б через explode+in_array проверял. Решение не подходит, потому что нужно использовать ентот шаблонизатор, а не echo.

    в случае, если $set=3; - одно число, а не множество, я делал так:
    HTML:
    1.             Входит в город:<br />
    2.             <select name="city_id">
    3.                 [:loop city:]
    4.                     <option value="[:ID:]"[:if ID==city_id:] selected[:/if:]>[:city_title:]</option>
    5.                 [:/loop:]
    6.             </select><br /><br />
    7.  
    но тут множество... так и просится сделать что-то типа
    HTML:
    1.             Входит в город:<br />
    2.             <select name="city_id">
    3.                 [:loop city:]
    4.                     <option value="[:ID:]"[:if ID in city_id:] selected[:/if:]>[:city_title:]</option>
    5.                 [:/loop:]
    6.             </select><br /><br />
    7.  
    Danilka, может добавишь к условиям оператор in, проверяющий наличие чего-то во множестве?
     
  13. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    через массив удобно если есть увереность, что строка не вернет сотню значений, а заюзается только 8 :)
    это так, отступление
     
  14. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    эмм, то есть регулярка будет быстрее конверта в массив+поиск по нему?
     
  15. antonn

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

    С нами с:
    10 июн 2007
    Сообщения:
    2.996
    Симпатии:
    0
    честно - не знаю :)
    по любому еще один цикл есть и там и там...
     
  16. kostyl

    kostyl Guest

    Привет... Вот я и сюда залез со своими вопросами.
    Ребята скажи плиз какой смысл в кэшировании шаблонов динамически генерируемых страниц? Может я чето не понимаю, но если у каждого пользователя есть допустим свой профиль и он там чето меняет например свои файлы или еще че - то что тут кэшировать? Рамку таблицы? Не ну рамку таблицы это можно - но на диске появиться отдельный файл рамки таблицы с расширение .ch или как там ...(УЛАВЛИВАЕМ ИДЕЮ)
    Еще такой момент. Я как сторонник не пихать в шаблон логику циклы там и все такое говорю, что можно сделать так: если надо, например циклически вывести например список файлов пользователя, то можно этот список свормировать и в цикле пыхыпыха, а не в цикле шаблона. Просто берем и в основную часть шаблона страницы index.tpl.html вставляем переменную [user files], которая будет заменена на строку шаблонизатором. Эта строка суммируется по .= в цикле (который работает в пыхыпы (дизайн отдельно/логика отдельно)) из пустого значения. В этом цикле другой экземпляр парсера каждую итерацию создается, считывает шаблон userfile_row.tpl.html (ВОЗВРАЩАЯСЬ К СКОБКАМ "УЛАВЛИВАЕМ ИДЕЮ") заменяет в нем [filemname] и все остальное (ИЛИ РАБОТАЕТ С ЕГО КЭШЕМ), и выдает контент этого РЯДКА ТАБЛИЦЫ или ЦЕЛОЙ ТАБЛИЦЫ (это пожеланию) не методом display(), а методом prepare () в нашу строку,
    PS:
    PHP:
    1.  
    2. public function prepare()
    3. {
    4.   траляля;
    5.   return $content;
    6. }
    7. public function display()
    8. {
    9.   echo $this->prepare();
    10. }
    11.  
    и наконец самоуничтожается, чтобы вновь возрадиться в начале цикла если у юзера еще есть файлы...
    Вот такие блины с котятами у меня в голове...
     
  17. decoder

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

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    kostyl
    А какой смысл в логику приложения помещать логику вида?
     
  18. kostyl

    kostyl Guest

    Ну в принципе да какой? но тут это уже размытое понятие... зато нет логики приложения в шаблонах...
     
  19. decoder

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

    С нами с:
    11 фев 2006
    Сообщения:
    469
    Симпатии:
    0
    Ну я бы не сказал, что особо размытое.
    По-моему, цикл вывода какого-нибудь итератора лучше все же поместить в шаблон. Также как и условие его вывода (пустой итератор или нет).

    По крайней мере, логика приложения станет читаться намного легче, а подобные циклы и условия не будут отвлекать внимание...
     
  20. kostyl

    kostyl Guest

    В принципе да - но это уже вечный вопрос "Где какая логика" :) .... и кому как удобно. Я просто высказал свое мнение с кэширование кусков страниц... во...
     
  21. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Всё просто. Шаблон (пока) не кеширует страницу полностью, он оставляет переменные для подставления. Так что можете не беспокоиться о кеше, даже если на странице выводится время исполнения скрипта, она всё-равно будет закеширована и всегда будет отображать актуальное время.

    Что касается отсутствия логики в шаблоне, так это уже до паранои дошло. О чём вы говорите, какие циклы вывода в логике приложения? Зачем они там? А как же оформление во време цикла.

    Да и ещё о регулярка никогда не будет быстрее поиска по массиву. Любая регулярка - это гигантские тормоза.
     
  22. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    дык будет оператор IN ? Он катастрофически необходим.
     
  23. kostyl

    kostyl Guest

    Чё то не вкурил. Да я вообще ниче не пойму :lol: ... Как кэшируются какие страницы? Например с каждым кликом пользователя страница меняет контент и что тут кэшировать? Получается на эту страницу у кадждого пользователя будет столько страниц сколько путей работы скрипта... ничё не понимаю :twisted:
     
  24. kostyl

    kostyl Guest

    Danilka
    Ну что там кэш есть нет? Как вообще дела идут? Хотели кэшировать куски - ну сделали или идёт ?
     
  25. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    да нифига нового :evil:

    Danilka может сделаешь svn, чтоб народ мог сам вносить изменения? Заодно может и маны кто-нить написал бы