За последние 24 часа нас посетили 17525 программистов и 1704 робота. Сейчас ищут 1649 программистов ...

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

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

  1. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в догонку. Есть что-то типа
    HTML:
    1. [:if a:]
    2.     [:load ab:]
    3. [:else:]
    4.     not load
    5. [:/if:]
    6.  
    7.  
    даже, если a=false, шаблонизатор пытается подключить ab. Он-то его не выведет на экран, но все равно пытается сделать file_get_contents. Зачем это нужно?

    черт, забыл, что шаблоны кешируются :/. А если кешируются, то без этого никак. Вопрос снят
     
  2. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Может тогда уже сделать коментарии, как в языках программирования?
    PHP:
    1. /*
    2. ...
    3. */
    4. # ...
    5. // ...
    6.  
    Хотя это повлечёт невозможность выводить куски кода. Хотя опять же, кто это будет делать в шаблоне, оно будет браться из переменных, а они уже не парсятся.
    Так как будет лучше?
    Опять же, удаление html коментариев в любом случае стоит реализовать, даже с точки зрения экономии пользовательского траффика. Я вот ещё думал реализовать "жим" выводимого контента, для ускорения загрузки страниц конечным пользователям, как вам идея?
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    не-не. Мы же пишем шаблон в редакторе с подсветкой синтаксиса html. /* // ... он не прохавает.

    HTML:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    4. <title>[:pageTitle:]</title>
    5. </head>
    6. <div>
    7. aaaaaa
    8. <!--//
    9. bbbbbb
    10. \\-->
    11. </div>
    12. </body>
    13. </html>
    14.  
    можно сделать вот такие комментарии, немного отличающиеся от стандартных. Таким образом стандартные будут сохраняться, а вся эта петрушка будет еще в самом начале вырезаться и не парситься. Даже переменные внутри нее не будут монтироваться.

    По поводу жима - х3. Возможно, конечно удалять из кода все гавно, лишние пробелы и тд. Но тогда нужно обязательно кешировать уже готовый html. Как будет кеш - то можно и это сделать. Заботиться об увеличении скорости загрузки у пользователя и вызывать бОльшую загрузку сервера - не вариант.
     
  4. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Короче каменты нужно вырезать между <!-- и --> и вся запарка. А зачем юзеру отправлять даже хтмльные каменты?
    А по поводу загрузки сервака - эт ты зря. Шаблон по сути всё-равно парсится всего один раз, так что в принципе можно и выкинуть пробелы.
     
  5. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    не, если удалять пробелы, так отовсюду. Так, как ты предлагаешь, мы только удалим пробелы в шаблоне, а в переменных они останутся (если, например у нас в базе таблица какая-нить)
     
  6. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Всё-равно из переменных выводится зачастую "красивая" информация. Просто текст или ещё что-нибудь. Ну, если не учитывать "волшебных" редакторов.
    Основные пробелы всё-равно в коде шаблона, так что думаю, что их удаление помогло бы.
     
  7. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    черт его знает. Сделай это опциональным, чтоб можно было в случае чего отключить. Хуже точно не будет.

    Как обычно, на последок: как там html-кеш поживает?
     
  8. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Хтмл кеша пока нема, но уже близко, самому скоро будет нужен.
    Пока предлогаю обсудить, как его реализовывать. В смысле, какой функционал необходим.
     
  9. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    чат сегодня здесь!!!11
    в скомпилированных шаблонах <?if($tpl_var['myVar'] ){?>
    есть лишний пробел перед скобкой)))

    по поводу кеша:
    необходимо кешировать некоторые страницы полностью, а другие блоками. Должен присутствовать тег nocache. То, что между ним - не кешировать.
    Нужно как-то засылать данные, на основании которых генерируется имя файла, напр. $tpl->cache($module, $id, $isUser);

    Вот, собственно что бы я хотел.
     
  10. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    :)))))
    Пробел, эт так получается проще при парсинге, всё-равно он никому не мешает.
    Предлогаю так:
    PHP:
    1. if( $tpl -> load( 'my_tpl_name' , array( $id1 , $id2 , $... ) ) )
    2. {
    3.       // тут генерация контента страницы
    4. }
    То есть, если шаблона нет, блок генерируется, если уже есть, то он просто берётся из кэша, а то, что под ифон не выполняется.
    Для очистки применяем:
    PHP:
    1. $tpl -> clear( 'my_tpl_name' , array( $id1 , $id2 , $... ) );
    Ещё тут в форуме была темя, про кеширование и там применялся принцып ключей. То есть, очистка всех шаблонов содержащих определённый ключь, $id1 например. Не знаю, стоит ли на это заморачиваться?
    Ну а кеширование страницы целиком наверное будет осуществляться при помощи загоня кода страницы в один иф.
    ну как?
     
  11. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Да, я поддерживаю!)

    у меня огромная проблема. Помоги пожалуйста

    PHP:
    1. <?
    2. include'phparser.php';
    3. $tpl = new phparser('tpl', 'cache');
    4. $tpl->load('test');
    5. $tpl->v('title', 'PHParser example');
    6. /*главные категории*/
    7. $a[0]['id'] = 1; $a[0]['title'] = 'aaaaaa';
    8. $a[1]['id'] = 2; $a[1]['title'] = 'bbbbbb';
    9. $a[2]['id'] = 3; $a[2]['title'] = 'cccccc';
    10. /*подкатегории*/
    11. $b[0]['id'] = 1; $b[0]['a_id'] = 1; $b[0]['title'] = 'aaaaaa_aa';
    12. $b[1]['id'] = 2; $b[1]['a_id'] = 1; $b[1]['title'] = 'aaaaaa_bb';
    13. $b[2]['id'] = 3; $b[2]['a_id'] = 2; $b[2]['title'] = 'bbbbbb_aa';
    14. $b[3]['id'] = 4; $b[3]['a_id'] = 2; $b[3]['title'] = 'bbbbbb_bb';
    15. $b[4]['id'] = 5; $b[4]['a_id'] = 0; $b[4]['title'] = 'zerrro!';
    16. $out[0] = array(
    17.                 'title'=>$a[0]['title'],
    18.                 'b'=>array($b[0]['title_cat'], $b[1]['title_cat'])
    19.                 );
    20. $out[1] = array(
    21.                 'title'=>$a[2]['title'],
    22.                 'b'=>array($b[2]['title_cat'], $b[3]['title_cat'])
    23.                 );
    24. $out[2] = array(
    25.                 'title'=>'без категроии',
    26.                 'b'=>array($b[4]['title_cat'])
    27.                 );
    28.  
    29. //print_r($out);
    30. $tpl->l('a', $out);
    31.  
    32. $tpl -> re_cache(); ### while developing
    33. $tpl -> parse();
    34. ?>
    HTML:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <title>noTitle</title>
    4. <style type="text/css">
    5. .a {
    6.     background-color: #fcf;
    7.     padding-bottom: 20px;
    8. }
    9. .a div{
    10.     background-color: #cfc;
    11.     margin-left: 30px;
    12. }
    13. </head>
    14.  
    15. [:loop a:]
    16.     <div class="a">
    17.         [:title:]
    18.         [:loop b:]
    19.             <div>[:title_cat:]</div>
    20.         [:/loop:]
    21.     </div>
    22. [:/loop:]
    23. </body>
    24.  
    25. </html>
    26.  
    как такого зверя осилить? Получается нужно в цикле сделать еще 1 цикл. Такое возможно?
     
  12. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Вот, если делать без шаблонизатора. Вообще вложенные циклы нужны.
    PHP:
    1. <?
    2. /*главные категории*/
    3. $a[0]['id'] = 1; $a[0]['title'] = 'aaaaaa';
    4. $a[1]['id'] = 2; $a[1]['title'] = 'bbbbbb';
    5. $a[2]['id'] = 3; $a[2]['title'] = 'cccccc';
    6. /*подкатегории*/
    7. $b[0]['id'] = 1; $b[0]['a_id'] = 1; $b[0]['title'] = 'aaaaaa_aa';
    8. $b[1]['id'] = 2; $b[1]['a_id'] = 1; $b[1]['title'] = 'aaaaaa_bb';
    9. $b[2]['id'] = 3; $b[2]['a_id'] = 2; $b[2]['title'] = 'bbbbbb_aa';
    10. $b[3]['id'] = 4; $b[3]['a_id'] = 2; $b[3]['title'] = 'bbbbbb_bb';
    11. $b[4]['id'] = 5; $b[4]['a_id'] = 0; $b[4]['title'] = 'zerrro!';
    12.  
    13. $out[0] = array(
    14.                 'title'=>$a[0]['title'],
    15.                 'b'=>array($b[0]['title'], $b[1]['title'])
    16.                 );
    17. $out[1] = array(
    18.                 'title'=>$a[2]['title'],
    19.                 'b'=>array($b[2]['title'], $b[3]['title'])
    20.                 );
    21. $out[2] = array(
    22.                 'title'=>'без категроии',
    23.                 'b'=>array($b[4]['title'])
    24.                 );
    25. ?>
    26. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    27. <html xmlns="http://www.w3.org/1999/xhtml">
    28. <head>
    29. <title>noTitle</title>
    30. <style type="text/css">
    31. .a {
    32.     background-color: #fcf;
    33.     padding-bottom: 20px;
    34. }
    35. .a div{
    36.     background-color: #cfc;
    37.     margin-left: 30px;
    38. }
    39. </style>
    40. </head>
    41. <body>
    42. <?
    43. $n = sizeof($out);
    44. for($i=0;$i<$n;$i++) {
    45.     echo '<div class="a">',$out[$i]['title'];
    46.     $nb = sizeof($out[$i]['b']);
    47.     for($j=0;$j<$nb;$j++) {
    48.         echo '<div>',$out[$i]['b'][$j],'</div>';
    49.     }
    50.     echo '</div>';
    51. }
    52. ?>
    53. </body>
    54. </html>
     
  13. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Вложенные циклы работают, только нужно чтобы имена переменных не пересикались и всё делов. Как в обычном пыхе.
     
  14. Koc

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

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

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    То есть нужно сделать что-то типа:
    HTML:
    1. [:loop a:]
    2.     <div class="a">
    3.     [:title_1:]
    4.     [:loop b:]
    5.         <div>[:title_2:]</div>
    6.     [:/loop:]
    7.     </div>
    8. [:/loop:]
    Нужно короче просто разные имена переменных сделать и всё. Внутри циклов переменные доступны просто по простым именам. ПРосто в начале каждого цикла они заменяются и всё.
     
  16. Koc

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

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

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Ты взорвал мой мозг :)
    PHP:
    1. <?
    2. include'phparser.php';
    3. $tpl = new phparser('tpl', 'cache');
    4. $tpl->load('test');
    5. $tpl->v('title', 'PHParser example');
    6. /*главные категории*/
    7. $a[0]['a_id'] = 1; $a[0]['a_title'] = 'aaaaaa';
    8. $a[1]['a_id'] = 2; $a[1]['a_title'] = 'bbbbbb';
    9. $a[2]['a_id'] = 3; $a[2]['a_title'] = 'cccccc';
    10. /*подкатегории*/
    11. $b[0]['id'] = 1; $b[0]['title'] = 'aaaaaa_aa';
    12. $b[1]['id'] = 2; $b[1]['title'] = 'aaaaaa_bb';
    13. $b[2]['id'] = 3; $b[2]['title'] = 'bbbbbb_aa';
    14. $b[3]['id'] = 4; $b[3]['title'] = 'bbbbbb_bb';
    15. $b[4]['id'] = 5; $b[4]['title'] = 'zerrro!';
    16.  
    17. $tpl->l('a', $a);
    18. $tpl->l('b', $b);
    19.  
    20. $tpl -> re_cache();### while developing
    21. $tpl -> parse();
    22. ?>
    HTML:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <title>noTitle</title>
    4. <style type="text/css">
    5. .a {
    6.     background-color: #fcf;
    7.     padding-bottom: 20px;
    8. }
    9. .a div{
    10.     background-color: #cfc;
    11.     margin-left: 30px;
    12. }
    13. </head>
    14.  
    15. [loop a]
    16.     <div class="a">
    17.         [a_title]
    18.         [loop b]
    19.             <div>[title]</div>
    20.         [/loop]
    21.     </div>
    22. [/loop]
    23. </body>
    24.  
    25. </html>
     
  18. Koc

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

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

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Danilka, куда ты пропал?
     
  20. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Привет всем. Извиняюсь, за тормоза. Просто я сейчас в отъезде. В связи с этим работать становится очень затруднительно.
    Выложил новую версию (0.7а). Качать на сайте.
    2 Koc: Я долго ковырял твой код и искренне не понял какой должен быть результат. Но я понял, что тебе нужно сделать количество итераций внутреннего цикла, зависимым от внешнего. Так что я сделал такую фишку:
    Теперь в цикле можно указывать, до какого значения он будет выполняться.
    PHP:
    1. $a[0]['all'] = 3;
    2. $a[1]['all'] = 2;
    3. $a[3]['all'] = 7;
    4.  
    5. $b[0] = ...
    6. ...
    7. $b[7] = ...
    8.  
    9. $tpl -> l( 'a' , $a );
    10. $tpl->l( 'b' , $b );
    HTML:
    1. [loop a]
    2.         [loop b to all]
    3.                 ...
    4.         [/loop]
    5. [/loop]
    То есть указывается значение переменной, до которой будет выполняться внутренний цикл.
    Пробуй и отписывай, как успехи.

    Так же сделал удаление хтмл каментов, как мы обсуждали ранее.
     
  21. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Да, кстати, подскажите про иерархический буфер, пожалуйста.
    То есть, как перехватить в переменную только часть вывода.
    А то собрался писать версию с хтмл кэшем, а без такой фишки не получается.
     
  22. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
  23. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Да, но его нельзя использовать дважды. То есть вложенность не прокатывает. А мне именно кусками нужно выдёргивать вывод.
     
  24. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    Danilka
    [:loop array to n:] - это немного не то.

    Попробую на реальном примере объяснить. Есть вуз. В нем: факультеты и кафедры. Некоторые кафедры "привязаны" к факультету. Вот делаем массив
    $факультет[#пп]['ИД']=
    $факультет[#пп]['Имя']=

    $факультет[#пп]['ИД_кафедр']=массив из ИД кафедр
    $факультет[#пп]['Имена_кафедр']=массив из имен кафедр

    Вот мне нужно все это вывести на экран. Факультеты выводятся без проблем. А как быть с кафедрами?

    Ниже кусок кода, попробуй сделать его работающим.
    PHP:
    1. <?
    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_id'] = array(1,3); $faculty[0]['chair_title'] = array('Геодезии','Инженерной графики');
    8.  
    9. $faculty[1]['id'] = 2; $faculty[1]['title'] = 'ТК';
    10. $faculty[1]['chair_id'] = array(2,4,5); $faculty[1]['chair_title'] = array('ПМ','ЭВМ','КИТ');
    11.  
    12. $faculty[2]['id'] = 0; $faculty[2]['title'] = 'Не относятся к факультетам';
    13. $faculty[2]['chair_id'] = array(6,7); $faculty[2]['chair_title'] = array('Философии и социологии','Физкультуры и спорта');
    14.  
    15. $tpl->l('faculty', $faculty);
    16.  
    17. $tpl->re_cache();
    18. $tpl->parse();
    19. ?>
    Нужно вывести:

    МТ
    |-Геодезии
    |-Инженерной графики

    ТК
    |-ПМ
    |-ЭВМ
    |-КИТ

    Не относятся к факультетам
    |-Философии и социологии
    |-Физкультуры и спорта
     
  25. dobs

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

    С нами с:
    23 дек 2006
    Сообщения:
    145
    Симпатии:
    0
    Что я сделал не так?

    Код (Text):
    1. <?
    2. include( './phparser.php' );
    3.  
    4. $dbhost = "localhost";
    5. $dblogin= "portal";
    6. $dbname = "portal";
    7. $dbpassword = "123456";
    8.  
    9. $dbconnect = mysql_connect("$dbhost", "$dblogin", "$dbpassword") or die("Не могу подключиться" );
    10. $use = mysql_select_db($dbname, $dbconnect);
    11. $getcat = mysql_query ("SELECT id,title FROM category",$dbconnect);
    12. $i=0;
    13.  
    14.  
    15. $tpl = new phparser( 'tpl' , 'cache' );
    16.  
    17. $tpl -> load( 'test' );
    18.  
    19. $tpl -> v( 'title' , 'PHParser example' );
    20.  
    21. $loop = NULL;
    22. $loop[1]['link']    = 'http://ya.ru';
    23. $loop[1]['title']   = 'Лучшая рашенская поисковая система';
    24. $loop[1]['text']    = 'Яndex';
    25. $loop[2]['link']    = 'http://google.com';
    26. $loop[2]['title']   = 'Лучшая не рашенская поисковая система';
    27. $loop[2]['text']    = 'Google';
    28. $loop[3]['link']    = 'http://r0.ru';
    29. $loop[3]['title']   = 'Советская поисковая система';
    30. $loop[3]['text']    = 'Rамблер';
    31. $tpl -> l( 'src' , $loop );
    32.  
    33. $loop2 = NULL;
    34. while ($myrow_get_cat = mysql_fetch_array($getcat))
    35.     {
    36.     $loop2[$i]['id'] = $myrow_get_cat["id"];
    37.     $loop2[$i]['title2'] = $myrow_get_cat["title"];
    38.     $i++;
    39.     }
    40. $tpl -> l( 'srce' , $loop2 );
    41.  
    42.  
    43.  
    44. $arr['rand']    = rand(1,2);
    45. $arr['year']    = date('Y');
    46. $tpl -> arr( $arr );
    47.  
    48. $tpl -> re_cache(); ### while developing
    49. $tpl -> parse();
    50. ?>

    Код (Text):
    1. [loop2 srce]
    2.     <li><span class="top"><a href="?do=cat&id=[id]">[title2]</a></span></li>
    3. [/loop2]