За последние 24 часа нас посетили 22739 программистов и 1273 робота. Сейчас ищут 786 программистов ...

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

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

  1. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Чего сразу потешаться? Ну пусть так, делу-то не мешает...
    По сабжу-то можно сделать? Или я чего-то не знаю и это уже 100 раз написано?
     
  2. Koc

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

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

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Тадааам, торжественные фанфары! Встречаем версию альфа 0.2 : ))))))
    Косяк с локальными переменными циклов пофиксен, теперь всё в порядке. В связи с этим же исправлением избавился от "тяжёлого" форича.
    Версия доступна на сайте для скачивания.
    Koc теперь можно пробовать :)
     
  4. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    PHP:
    1. <?
    2. $tpl = new phparser( 'templates' , 'cache' );
    3. echo 123;
    4. $tpl -> load( 'index' );
    5. // тут вывод куков
    6. setcookie("TestCookie", "something");
    7. $tpl -> parse();
    8. ?>
    Warning: Cannot modify header information - headers already sent by (output started at Z:\home\localhost\www\index.php:10) in Z:\home\localhost\www\index.php on line 13

    ошибка есть
     
  5. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    $tpl->v('db', $db); - не будет работать, если db - Object.
     
  6. Danilka

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

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

    А в $tpl->v('db', $db); какой смысл? Зачем объект базы в шаблоне? Или я чёт не совсем понял поставленной задачи...
    Можно контекст и код шаблона.
     
  7. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    print_r($db) выведет:
    db Object
    (
    [db_connect_id] => Resource id #4
    [query_result] =>
    [row] => Array
    (
    )

    [rowset] => Array
    (
    )

    [num_queries] => 0
    [total_time_db] => 0
    [time_query] =>
    )

    пробуем иначе:
    ...
    include'core/template.php';
    $tpl = new phparser( 'templates' , 'cache' );
    $tpl -> load( 'index' );
    $tpl->v('some', 'aa');

    $dbStats = NULL;
    $dbStats['db_connect_id'] = $db->db_connect_id;
    $dbStats['num_queries'] = $db->num_queries;
    $dbStats['total_time_db'] = $db->total_time_db;
    $tpl->arr($dbStats);

    $tpl->parse();
    ...

    <html>
    <head>
    <title>[title]</title>
    </head>
    <body>
    [some]
    <hr>
    базы данных:<br />
    connect_id - [db_connect_id]<br />
    num_queries - [num_queries]<br />
    total_time_db - [total_time_db]<br />
    </body>
    </html>

    выводит:
    <html>
    <head>
    <title></title>
    </head>
    <body>
    aa</body>
    </html>
     
  8. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    А кэш удаляешь?
    Может он просто сохранился с того раза, пока ты не дописал?
    Вставь в конец:
    $tpl -> re_cache(); ### while developing
    $tpl -> parse();
     
  9. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    У меня с такого кода:
    PHP:
    1. <?
    2. include( './phparser.php' );
    3.  
    4. $tpl = new phparser( 'tpl' , 'cache' );
    5.  
    6. $tpl -> load( 'test' );
    7.  
    8. $tpl->v('some', 'aa');
    9.  
    10. $dbStats = NULL;
    11. $dbStats['db_connect_id'] = 0;
    12. $dbStats['num_queries'] = 0;
    13. $dbStats['total_time_db'] = NULL;
    14. $tpl->arr($dbStats);
    15.  
    16. $tpl -> re_cache(); ### while developing
    17. $tpl -> parse();
    18. ?>
    HTML:
    1. <html>
    2. <head>
    3. <title>[title]</title>
    4. </head>
    5. <body>
    6. [some]
    7. <hr>
    8. базы данных:<br />
    9. connect_id - [db_connect_id]<br />
    10. num_queries - [num_queries]<br />
    11. total_time_db - [total_time_db]<br />
    12. </body>
    13. </html>
    Вывел:
    HTML:
    1. <html>
    2. <head>
    3. </head>
    4. <body>
    5. aa
    6. <hr>
    7. базы данных:<br />
    8. connect_id - 0<br />
    9. num_queries - 0<br />
    10. total_time_db - <br />
    11. </body>
    12. </html>
     
  10. Koc

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

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

    upd: то ли я туплю, то ли бок:
    Скачать needHelp.rar с WebFile.RU (2kb)
     
  11. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Эээм, это моя дурацкая замашка непризнания 0го значения массива...
    У меня подразумевается, что массивы с 1 начинаются.
    Тааак, чёж придумать-то. Все ж по разному пишут...
    По сабжу будет работать, если сделать так:
    $answers[$i+1]['answer'] = $vote['a'][$i];
    $answers[$i+1]['VoteID'] = $vote['aID'][$i];
     
  12. Anonymous

    Anonymous Guest

    Danilka, по сабжу надо сделать так, что бы у пользователя не было выбора сделать по другому )
     
  13. Koc

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

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

    еще на тему шаблонизаторов:
    http://jeurey.com/89.html
    http://jeurey.com/91.html
    как такая реализация?
     
  14. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Пофиксил, качаем v. 0.3a :)

    Нет, я не спорю, классика это хорошо. Но в этом случае, на мой взгляд это застоявшийся маразм, который теперь слишком поздно исправлять. Давайте не будем спорить на эту тему, бо все понимают, что спор пустой, тем более, что проблема исчерпана. Пишем шаблонку, она развивается и это не может не радовать.
     
  15. Anonymous

    Anonymous Guest

    Правильней в основном потому, что по-умолчанию в языке PHP нумерация массивов с нуля.
     
  16. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Я бы с удовольствием исправил и оставил только возможность начинать с 0, но тогда мня самого будет ломать пользоваться шаблокой, а писал я её изначально для себя, так что жить бдут оба варианта. Благо ресурсов они едят ровным счётом 2 ифа.
     
  17. Anonymous

    Anonymous Guest

    Danilka, и увидел Бог, что это хорошо ))
     
  18. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    интересный момент:
    [loop answers]
    <input type="checkbox" name="cVote" id="c[VoteID]VoteID" value="[VoteID]" /><label for="c[VoteID]VoteID">[answer]</label><br />
    [/loop]
    [VoteID] не обработается
    Даже .еслиб это было [VoteID2], все равно не обработалось бы.

    а если мы сделаем через [abc] - обработается. Почему?

    зызы: добавь в класс информацию о версии, мол
    //$rev 17.06.08


    отвечу сам: символы в верхнем регистре не парсятся. Это не есть гуд, имхо.
     
  19. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Готово, качаем :)
    В итоге избавились от пары не нужных действий.
     
  20. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    так-с, вот как сегодня потрудились исправили за раз несколько багов. В итоге получилось:
    index.php:
    PHP:
    1. <?php
    2. Error_Reporting(E_ALL & ~E_NOTICE);
    3. define("MAIN_FILE", true);
    4. include'core/template.php';
    5.  
    6. $vote['title'] = 'мой вопрос';
    7. $vote['a'] = array('вариант ответа 1', 'вариант ответа 2', 'вариант ответа 3', 'вариант ответа 4');
    8. $vote['aID'] = array(333, 334, 335, 336);
    9.  
    10. $tpl = new phparser('templates', 'cache');
    11. $tpl->load('index');
    12. $tpl->v('voteTitle', $vote['title']);
    13. $tpl->v('type', 'c'); //r - radio/c - checkbox.
    14.  
    15. $answers = NULL;
    16. $i=0;
    17. while($vote['a'][$i]){
    18.     $answers[$i]['answer'] = $vote['a'][$i];
    19.     $answers[$i]['VoteID'] = $vote['aID'][$i];
    20.     $i++;
    21. }
    22. //print_r($answers);
    23. $tpl->l('answers', $answers);
    24. $tpl->re_cache();
    25. $tpl->parse();
    26. ?>
    index.tpl:
    HTML:
    1.     <title>[title]</title>
    2. </head>
    3.  
    4. [voteTitle]
    5. <form name="fVote" id="fVoteID" action="?do=vote" method="post">
    6. [if type=='c']
    7.     [loop answers]
    8.         <input type="checkbox" name="cVote" id="c[VoteID]VoteID" value="[VoteID]" /><label for="c[VoteID]VoteID">[answer]</label><br />
    9.     [/loop]
    10. [else]
    11.     [loop answers]
    12.         <input type="radio" name="rVote" id="r[VoteID]VoteID" value="[VoteID]" /><label for="r[VoteID]VoteID">[answer]</label><br />
    13.     [/loop]
    14. [/if]
    15. <input type="submit" name="sVote" id="sVoteID"  value="Ответить"/>
    16. </form>
    17. </body>
    18. </html>
    в принципе лаконично и прикольно, правда логика опять вылезла за пределы кода. Завтра попробую сделать это же с другим классом шаблонизатора, для сравнения. О резкльтатах доложу.
     
  21. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Здорово! Респект за помощь!!
    Буду ждать резалтов.

    P.S. В смысле логика вылезла за пределы кода?
     
  22. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    то есть
    HTML:
    1. ...
    2. [if type=='c']
    3.      [loop answers]
    4. ...
    должно было находиться не в шаблоне, а в коде. Дизайнеру даем шаблон, сами работаем с кодом. В нашем же случае дизайнеру прходится объяснять, что такое loop-цикл и так далее.

    посмотрим. Не знаю что именно, но что-то на подсознательном уровне говорит мне остановиться на этом шаблонизаторе. Правда боюсь, что он будет много ресурсов потреблять. Есть на нем уже какой-нить работающий проект?
     
  23. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Чёт я не представляю если, честно, как обойтись без логики в шаблоне. Разве что использовать контекстный подход, как в блитце, но это совсем другой разговор. Было бы круто увидеть пример.

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

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

    Думаю, что в будущем можно развить параллельную версию, поддерживающую кеширование готовых страниц, как описывалось выше, но тут снова палка о двух концах. Тема -то хороша, но реализация на файлах, боюсь не принесёт должного результата (хотя может и ошибаюсь), а с БД заморачиваться не хочется, бо каждый с ней работает, как он привык и переучиваться ради шаблонки, вопрос спорный. А всем не угодить, это точно.
    Так что пока вопрос открыт.
     
  24. Anonymous

    Anonymous Guest

    тут многое еще будет зависить от схемы работы веб-сервера - кешировать готовые страницы, которые будет отдавать ngnix ДО апача - может быть очень эффективно
     
  25. Anonymous

    Anonymous Guest

    хех, сделай нормуль сайт своему парсеру ))) хотяб ) я на досуге попробую поглядеть, времени мало, к сожалению, мож тоже каких идей подкину.

    ЗЫ. А логика в шаблоне быть должна, имхо - но своя - логика отображения.