в догонку. Есть что-то типа HTML: [:if a:] [:load ab:] [:else:] not load [:/if:] даже, если a=false, шаблонизатор пытается подключить ab. Он-то его не выведет на экран, но все равно пытается сделать file_get_contents. Зачем это нужно? черт, забыл, что шаблоны кешируются :/. А если кешируются, то без этого никак. Вопрос снят
Может тогда уже сделать коментарии, как в языках программирования? PHP: /* ... */ # ... // ... Хотя это повлечёт невозможность выводить куски кода. Хотя опять же, кто это будет делать в шаблоне, оно будет браться из переменных, а они уже не парсятся. Так как будет лучше? Опять же, удаление html коментариев в любом случае стоит реализовать, даже с точки зрения экономии пользовательского траффика. Я вот ещё думал реализовать "жим" выводимого контента, для ускорения загрузки страниц конечным пользователям, как вам идея?
не-не. Мы же пишем шаблон в редакторе с подсветкой синтаксиса html. /* // ... он не прохавает. HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>[:pageTitle:]</title> </head> <body> <div> aaaaaa <!--// bbbbbb \\--> </div> </body> </html> можно сделать вот такие комментарии, немного отличающиеся от стандартных. Таким образом стандартные будут сохраняться, а вся эта петрушка будет еще в самом начале вырезаться и не парситься. Даже переменные внутри нее не будут монтироваться. По поводу жима - х3. Возможно, конечно удалять из кода все гавно, лишние пробелы и тд. Но тогда нужно обязательно кешировать уже готовый html. Как будет кеш - то можно и это сделать. Заботиться об увеличении скорости загрузки у пользователя и вызывать бОльшую загрузку сервера - не вариант.
Короче каменты нужно вырезать между <!-- и --> и вся запарка. А зачем юзеру отправлять даже хтмльные каменты? А по поводу загрузки сервака - эт ты зря. Шаблон по сути всё-равно парсится всего один раз, так что в принципе можно и выкинуть пробелы.
не, если удалять пробелы, так отовсюду. Так, как ты предлагаешь, мы только удалим пробелы в шаблоне, а в переменных они останутся (если, например у нас в базе таблица какая-нить)
Всё-равно из переменных выводится зачастую "красивая" информация. Просто текст или ещё что-нибудь. Ну, если не учитывать "волшебных" редакторов. Основные пробелы всё-равно в коде шаблона, так что думаю, что их удаление помогло бы.
черт его знает. Сделай это опциональным, чтоб можно было в случае чего отключить. Хуже точно не будет. Как обычно, на последок: как там html-кеш поживает?
Хтмл кеша пока нема, но уже близко, самому скоро будет нужен. Пока предлогаю обсудить, как его реализовывать. В смысле, какой функционал необходим.
чат сегодня здесь!!!11 в скомпилированных шаблонах <?if($tpl_var['myVar'] ){?> есть лишний пробел перед скобкой))) по поводу кеша: необходимо кешировать некоторые страницы полностью, а другие блоками. Должен присутствовать тег nocache. То, что между ним - не кешировать. Нужно как-то засылать данные, на основании которых генерируется имя файла, напр. $tpl->cache($module, $id, $isUser); Вот, собственно что бы я хотел.
)))) Пробел, эт так получается проще при парсинге, всё-равно он никому не мешает. Предлогаю так: PHP: if( $tpl -> load( 'my_tpl_name' , array( $id1 , $id2 , $... ) ) ) { // тут генерация контента страницы } То есть, если шаблона нет, блок генерируется, если уже есть, то он просто берётся из кэша, а то, что под ифон не выполняется. Для очистки применяем: PHP: $tpl -> clear( 'my_tpl_name' , array( $id1 , $id2 , $... ) ); Ещё тут в форуме была темя, про кеширование и там применялся принцып ключей. То есть, очистка всех шаблонов содержащих определённый ключь, $id1 например. Не знаю, стоит ли на это заморачиваться? Ну а кеширование страницы целиком наверное будет осуществляться при помощи загоня кода страницы в один иф. ну как?
Да, я поддерживаю!) у меня огромная проблема. Помоги пожалуйста PHP: <? include'phparser.php'; $tpl = new phparser('tpl', 'cache'); $tpl->load('test'); $tpl->v('title', 'PHParser example'); /*главные категории*/ $a[0]['id'] = 1; $a[0]['title'] = 'aaaaaa'; $a[1]['id'] = 2; $a[1]['title'] = 'bbbbbb'; $a[2]['id'] = 3; $a[2]['title'] = 'cccccc'; /*подкатегории*/ $b[0]['id'] = 1; $b[0]['a_id'] = 1; $b[0]['title'] = 'aaaaaa_aa'; $b[1]['id'] = 2; $b[1]['a_id'] = 1; $b[1]['title'] = 'aaaaaa_bb'; $b[2]['id'] = 3; $b[2]['a_id'] = 2; $b[2]['title'] = 'bbbbbb_aa'; $b[3]['id'] = 4; $b[3]['a_id'] = 2; $b[3]['title'] = 'bbbbbb_bb'; $b[4]['id'] = 5; $b[4]['a_id'] = 0; $b[4]['title'] = 'zerrro!'; $out[0] = array( 'title'=>$a[0]['title'], 'b'=>array($b[0]['title_cat'], $b[1]['title_cat']) ); $out[1] = array( 'title'=>$a[2]['title'], 'b'=>array($b[2]['title_cat'], $b[3]['title_cat']) ); $out[2] = array( 'title'=>'без категроии', 'b'=>array($b[4]['title_cat']) ); //print_r($out); $tpl->l('a', $out); $tpl -> re_cache(); ### while developing $tpl -> parse(); ?> HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>noTitle</title> <style type="text/css"> .a { background-color: #fcf; padding-bottom: 20px; } .a div{ background-color: #cfc; margin-left: 30px; } </style> </head> <body> [:loop a:] <div class="a"> [:title:] [:loop b:] <div>[:title_cat:]</div> [:/loop:] </div> [:/loop:] </body> </html> как такого зверя осилить? Получается нужно в цикле сделать еще 1 цикл. Такое возможно?
Вот, если делать без шаблонизатора. Вообще вложенные циклы нужны. PHP: <? /*главные категории*/ $a[0]['id'] = 1; $a[0]['title'] = 'aaaaaa'; $a[1]['id'] = 2; $a[1]['title'] = 'bbbbbb'; $a[2]['id'] = 3; $a[2]['title'] = 'cccccc'; /*подкатегории*/ $b[0]['id'] = 1; $b[0]['a_id'] = 1; $b[0]['title'] = 'aaaaaa_aa'; $b[1]['id'] = 2; $b[1]['a_id'] = 1; $b[1]['title'] = 'aaaaaa_bb'; $b[2]['id'] = 3; $b[2]['a_id'] = 2; $b[2]['title'] = 'bbbbbb_aa'; $b[3]['id'] = 4; $b[3]['a_id'] = 2; $b[3]['title'] = 'bbbbbb_bb'; $b[4]['id'] = 5; $b[4]['a_id'] = 0; $b[4]['title'] = 'zerrro!'; $out[0] = array( 'title'=>$a[0]['title'], 'b'=>array($b[0]['title'], $b[1]['title']) ); $out[1] = array( 'title'=>$a[2]['title'], 'b'=>array($b[2]['title'], $b[3]['title']) ); $out[2] = array( 'title'=>'без категроии', 'b'=>array($b[4]['title']) ); ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>noTitle</title> <style type="text/css"> .a { background-color: #fcf; padding-bottom: 20px; } .a div{ background-color: #cfc; margin-left: 30px; } </style> </head> <body> <? $n = sizeof($out); for($i=0;$i<$n;$i++) { echo '<div class="a">',$out[$i]['title']; $nb = sizeof($out[$i]['b']); for($j=0;$j<$nb;$j++) { echo '<div>',$out[$i]['b'][$j],'</div>'; } echo '</div>'; } ?> </body> </html>
Вложенные циклы работают, только нужно чтобы имена переменных не пересикались и всё делов. Как в обычном пыхе.
То есть нужно сделать что-то типа: HTML: [:loop a:] <div class="a"> [:title_1:] [:loop b:] <div>[:title_2:]</div> [:/loop:] </div> [:/loop:] Нужно короче просто разные имена переменных сделать и всё. Внутри циклов переменные доступны просто по простым именам. ПРосто в начале каждого цикла они заменяются и всё.
b - это a['b'], а не какой-то отдельный массив ну попробуй сделать работоспособным http://php.ru/forum/posting.php?mode=quote&p=108636 , я че-то не рублю
Ты взорвал мой мозг PHP: <? include'phparser.php'; $tpl = new phparser('tpl', 'cache'); $tpl->load('test'); $tpl->v('title', 'PHParser example'); /*главные категории*/ $a[0]['a_id'] = 1; $a[0]['a_title'] = 'aaaaaa'; $a[1]['a_id'] = 2; $a[1]['a_title'] = 'bbbbbb'; $a[2]['a_id'] = 3; $a[2]['a_title'] = 'cccccc'; /*подкатегории*/ $b[0]['id'] = 1; $b[0]['title'] = 'aaaaaa_aa'; $b[1]['id'] = 2; $b[1]['title'] = 'aaaaaa_bb'; $b[2]['id'] = 3; $b[2]['title'] = 'bbbbbb_aa'; $b[3]['id'] = 4; $b[3]['title'] = 'bbbbbb_bb'; $b[4]['id'] = 5; $b[4]['title'] = 'zerrro!'; $tpl->l('a', $a); $tpl->l('b', $b); $tpl -> re_cache();### while developing $tpl -> parse(); ?> HTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>noTitle</title> <style type="text/css"> .a { background-color: #fcf; padding-bottom: 20px; } .a div{ background-color: #cfc; margin-left: 30px; } </style> </head> <body> [loop a] <div class="a"> [a_title] [loop b] <div>[title]</div> [/loop] </div> [/loop] </body> </html>
не. Это не то. Сравни с результатом http://php.ru/forum/posting.php?mode=quote&p=108638 . Мне вот так нужно.
Привет всем. Извиняюсь, за тормоза. Просто я сейчас в отъезде. В связи с этим работать становится очень затруднительно. Выложил новую версию (0.7а). Качать на сайте. 2 Koc: Я долго ковырял твой код и искренне не понял какой должен быть результат. Но я понял, что тебе нужно сделать количество итераций внутреннего цикла, зависимым от внешнего. Так что я сделал такую фишку: Теперь в цикле можно указывать, до какого значения он будет выполняться. PHP: $a[0]['all'] = 3; $a[1]['all'] = 2; $a[3]['all'] = 7; $b[0] = ... ... $b[7] = ... $tpl -> l( 'a' , $a ); $tpl->l( 'b' , $b ); HTML: [loop a] [loop b to all] ... [/loop] [/loop] То есть указывается значение переменной, до которой будет выполняться внутренний цикл. Пробуй и отписывай, как успехи. Так же сделал удаление хтмл каментов, как мы обсуждали ранее.
Да, кстати, подскажите про иерархический буфер, пожалуйста. То есть, как перехватить в переменную только часть вывода. А то собрался писать версию с хтмл кэшем, а без такой фишки не получается.
Да, но его нельзя использовать дважды. То есть вложенность не прокатывает. А мне именно кусками нужно выдёргивать вывод.
Danilka [:loop array to n:] - это немного не то. Попробую на реальном примере объяснить. Есть вуз. В нем: факультеты и кафедры. Некоторые кафедры "привязаны" к факультету. Вот делаем массив $факультет[#пп]['ИД']= $факультет[#пп]['Имя']= $факультет[#пп]['ИД_кафедр']=массив из ИД кафедр $факультет[#пп]['Имена_кафедр']=массив из имен кафедр Вот мне нужно все это вывести на экран. Факультеты выводятся без проблем. А как быть с кафедрами? Ниже кусок кода, попробуй сделать его работающим. PHP: <? include'phparser.php'; $tpl = new phparser('tpl', 'cache'); $tpl->load('test'); $faculty[0]['id'] = 1; $faculty[0]['title'] = 'МТ'; $faculty[0]['chair_id'] = array(1,3); $faculty[0]['chair_title'] = array('Геодезии','Инженерной графики'); $faculty[1]['id'] = 2; $faculty[1]['title'] = 'ТК'; $faculty[1]['chair_id'] = array(2,4,5); $faculty[1]['chair_title'] = array('ПМ','ЭВМ','КИТ'); $faculty[2]['id'] = 0; $faculty[2]['title'] = 'Не относятся к факультетам'; $faculty[2]['chair_id'] = array(6,7); $faculty[2]['chair_title'] = array('Философии и социологии','Физкультуры и спорта'); $tpl->l('faculty', $faculty); $tpl->re_cache(); $tpl->parse(); ?> Нужно вывести: МТ |-Геодезии |-Инженерной графики ТК |-ПМ |-ЭВМ |-КИТ Не относятся к факультетам |-Философии и социологии |-Физкультуры и спорта
Что я сделал не так? Код (Text): <? include( './phparser.php' ); $dbhost = "localhost"; $dblogin= "portal"; $dbname = "portal"; $dbpassword = "123456"; $dbconnect = mysql_connect("$dbhost", "$dblogin", "$dbpassword") or die("Не могу подключиться" ); $use = mysql_select_db($dbname, $dbconnect); $getcat = mysql_query ("SELECT id,title FROM category",$dbconnect); $i=0; $tpl = new phparser( 'tpl' , 'cache' ); $tpl -> load( 'test' ); $tpl -> v( 'title' , 'PHParser example' ); $loop = NULL; $loop[1]['link'] = 'http://ya.ru'; $loop[1]['title'] = 'Лучшая рашенская поисковая система'; $loop[1]['text'] = 'Яndex'; $loop[2]['link'] = 'http://google.com'; $loop[2]['title'] = 'Лучшая не рашенская поисковая система'; $loop[2]['text'] = 'Google'; $loop[3]['link'] = 'http://r0.ru'; $loop[3]['title'] = 'Советская поисковая система'; $loop[3]['text'] = 'Rамблер'; $tpl -> l( 'src' , $loop ); $loop2 = NULL; while ($myrow_get_cat = mysql_fetch_array($getcat)) { $loop2[$i]['id'] = $myrow_get_cat["id"]; $loop2[$i]['title2'] = $myrow_get_cat["title"]; $i++; } $tpl -> l( 'srce' , $loop2 ); $arr['rand'] = rand(1,2); $arr['year'] = date('Y'); $tpl -> arr( $arr ); $tpl -> re_cache(); ### while developing $tpl -> parse(); ?> Код (Text): [loop2 srce] <li><span class="top"><a href="?do=cat&id=[id]">[title2]</a></span></li> [/loop2]