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

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

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

  1. Koc

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

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

    хорощо б добавить операторы elseif и else if
     
  2. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    А Smarty с версии 3.0 вводит поддержку шаблонов на чистом PHP.
     
  3. kostyl

    kostyl Guest

    PsihАга... Да и вообще смысл парсить два раза?
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    kostyl
    Я этого никогда не понимал, т.к. даже компилированных шаблонах необходимо проверять не изменился ли оригинал, что приводит к лишнему I/O, частенько народ даже не думает об этом и шаблоны проверяются каждый запрос - с десяток шаблонов приводит к 30 I/O операциям, современный SAS диск на 10к оборотов может выдержать порядка 200-250 I/O в секунду. Если на Linux это смягчается как кешем файловой системы, так и realpath кешем самого PHP, то на Windows это сразу убивает насмерть. И после этого народ удивляется, а почему тормозит (потому что гладиолус! © Уральские пельмени)? Но рано или поздно и кеши не выдерживают и всё начинает безбожно тормозить.
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    кешируют обычно данные или блоки html кода
     
  6. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Psih, на виндосе нет файлового кеша? ;) Сомневаюсь ;) И кеши для fstat-ов всегда выдержат - ибо это первое, что кеширует операционка. Т.е. если это вдруг вылетело из кеша - значит память напрочь кончилась и тут уже пофиг - все-равно все сдохнет ;)
    Кстати, и php фалйлы тоже stat-ятся ;) Ужас, не какого тебе раздолья в структурировании классов ;) Вообще, если уж такая беда с stat-ами, ставим на продакшене акселератор и отключаем проверку mtime. И проблема уходит... =)
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    MiksIr
    Не всё так гладко, как кажется :) Для того, что бы акселератор нормально работал нужно ещё правильно include path настроить и правильно инклюдить файлы. Проверял на собственном сервере, разница офигительная даже при том, что у меня XFS с её агресивной политикой кеширования. Это видно по strace. Писал об этом тут: http://php.ru/forum/viewtopic.php?t=12980
     
  8. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну ты же сам там говоришь, что это делается, если у акселератора stat включен =) а если его выключить?
    Конечно, статы по файловой системе неприятны... но это не то пугало, которое стоит боятся. В реальных системах не на этом будет время кушаться. Т.е. на hello world заметно будет... а на сложной логике - затеряется. Прохождение статами пути к файлу в общем довольно стандартная ситуация. Никто же не ругает за это апач, а он еще и .htaccess пытается искать.
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    MiksIr
    Вот как раз ошибаешься про Hello world. На нём разница фигня, потому что файл открыли и исполнили. А вот когда начинаются пляски с поиском по include path и относительным директориям - вот тут уже весело. Неправильно настроенный ZF в среднем тормозит на 30%. Мой сайт показал тот же результат, хотя там include всего 6 файлов делался. Попутно я убрал все _once, заменив на обычный require.
     
  10. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ну я про hello world с 20 инклудами ;)
     
  11. Nick0

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

    С нами с:
    26 июл 2008
    Сообщения:
    55
    Симпатии:
    0
    а как быть с картинками ? ?!.
    корень сайта\templates\season\spring\images
    вот там ресположены картинка
    корень сайта\templates\season\spring\
    тут сам стиль
    если записать images/1_b00000.gif то картинка не показывается .

    а полный путь прописывать тоже не вариант нет ли какой нить переменной для вставки путя до шаблона ?
     
  12. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Пути указываются относительно корня сайта, так что если сайт в

    /home/var/username

    а картинки в
    /home/var/username/images/xxx.jpg

    а темплейт тут:

    /home/var/username/templates/my_module/template.tpl

    То путь к картинке будет
    images/xxx.jpg в HTML
     
  13. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    как при помощи такого шаблонизатора вывести дерево?
    $tee = array(
    ....'a',
    ....'b'
    ....array(
    ........'ca',
    ........'cb',
    ........'cc',
    ........array(
    ............'ea',
    ............'eb',
    ............'ec'
    ........);
    ....),
    'd',
    'e'
    );
     
  14. kostyl

    kostyl Guest

    Koc
    Как и всё остальное - циклом
     
  15. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    я сейчас работаю в одной конторе, так там нет условий и циклов. Вернее есть, но они совмещены в блоки
    вместо
    Код (Text):
    1. [:loop a:]
    2.     [:id:]-[:title:]
    3. [:/loop:]
    4.  
    5. [:if a:]
    6.     [:b:]
    7. [:/if:]
    будет

    Код (Text):
    1. [:sub a:]
    2.     [:a.id:] - [:a.title:]
    3.     [:a.b:]
    4. [:/sub:]
    в то же время в 1 случае мы сначала формируем массив, потом вызываем $tpl->l('a', $array);
    во 2-м же случае мы никакой массив не создаем, а вызываем в цикле $tpl->v('a.id', 'значение ИД');
    если ни разу не укажем - блок не будет выведен, укажем 10 раз - блок будет 10 раз показан. Никаких массивов создавать не нужно. Переменные на лету подсоединяются.

    имхо 2 вариант тоже нужен. Пускай это будет немного другой метод, b к примеру.

    Так и в phpBB 2+ сделано
     
  16. Danilka

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

    С нами с:
    8 ноя 2007
    Сообщения:
    192
    Симпатии:
    0
    Я встречался с таким подходом в шаблонизаторе Blitz http://alexeyrybak.com/blitz/blitz_ru.html
    Имхо, подход совершенно иной и миксовать их не стоит. Не спорю, он чем-то лучше чем-то хуже, но это просто немного разные вещи.
     
  17. Gom3r

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

    С нами с:
    9 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Hi2all.
    Я тут первый раз и и это мой первый пост.
    Я на форуме долго искал конкретно, что мне нужно, но так и не нашел. Отдельную тему создавать нет смысла, она прямо или косо связана с текущей.
    имеется шаблон x.htm типа:
    HTML:
    1.  
    2. [1]Вася[/1]
    3. [0]Петя[/0]
    4.  
    Так вот мне надо чтоб в php скрипте функция
    PHP:
    1.  
    2. $str=file_get_contents('x.htm');
    3. $A=$function('[1]','[/1]',$str); // Чтоб $A равнялось 'Вася'
    4. $B=$function('[0]','[/0]',$str); // Чтоб $B равнялось 'Петя'
    5.  
    Итак, что мне надо: нужна эта "волшебная" функция
     
  18. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    PHP:
    1. <?php
    2.  
    3. $html = "
    4.     [1]PHP[/1]
    5.     [2]JAVA[/2]
    6.     [3]C++[/3]
    7.     [4]Brainfuck[/5]
    8.     [6]
    9.         Asm
    10.     [/6]
    11. ";
    12.  
    13. preg_match_all('/\[(\d+)\](.*?)\[\/\1\]/s', $html, $m);
    14. print_r($m);
    15.  
    16. ?>
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => [1]PHP[/1]
    6.             [1] => [2]JAVA[/2]
    7.             [2] => [3]C++[/3]
    8.             [3] => [6]
    9.                 Asm
    10.         [/6]
    11.         )
    12.  
    13.     [1] => Array
    14.         (
    15.             [0] => 1
    16.             [1] => 2
    17.             [2] => 3
    18.             [3] => 6
    19.         )
    20.  
    21.     [2] => Array
    22.         (
    23.             [0] => PHP
    24.             [1] => JAVA
    25.             [2] => C++
    26.             [3] =>
    27.                 Asm
    28.  
    29.         )
    30. )
     
  19. Gom3r

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

    С нами с:
    9 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    ок, спасибо, понял.
    меня интересовал больше такой вариант:
    PHP:
    1.  
    2.  <?php
    3.  
    4.  $html = "
    5.     [asd]
    6.  
    7.  
    8.     looool
    9.  
    10.     [/asd]
    11.  
    12. ";
    13.  
    14.  
    15.  
    16.  preg_match_all("'\\[asd\\](.*?)\\[/asd\\]'si", $html, $m);
    17.  print_r($m);
    18.  
    19.  ?>
    20.  
    Код (Text):
    1.  
    2.  Array
    3. (
    4.     [0] => Array
    5.         (
    6.             [0] => [asd]
    7.  
    8.  
    9.      looool
    10.  
    11.      [/asd]
    12.         )
    13.  
    14.     [1] => Array
    15.         (
    16.             [0] =>
    17.  
    18.  
    19.      looool
    20.  
    21.      
    22.         )
    23.  
    24. )
     
  20. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    "/\[(.*?)\](.*?)\[\/\1\]/si"
     
  21. Gom3r

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

    С нами с:
    9 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Если честно, для меня это - простой набор символов, просто вычитал и методом тыка сформулировал свой вариант. Главное-работает. Но любопытство берет верх: дайте плиз ссылку на статью, разъясняющую этот "набор символов".
     
  22. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    а хрен его знает - ищи в гугле. я с головы писал :)

    \[(.*?)\](.*?)\[\/\1\]

    \/, \[ и \] - это экранированные символы. тебе нужно [ и ], но так как они в regexp задействованы для интервалов и окончаний, приходится их экранировать . если убрать экранирование получится следующее:

    [1]2[/3]

    (.*?) - в данном случае это любая группа символов пока не встретится конец тега
    (.*?) - любая группа символов, пока не встретится закрывающий тег
    \1 - тот же текст, который был найден в первых круглых скобках, то есть в (.*?)
     
  23. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
  24. Gom3r

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

    С нами с:
    9 июл 2009
    Сообщения:
    7
    Симпатии:
    0
    Спасибо, теперь я понял, что такое Regexp
     
  25. yoyo-moyo

    yoyo-moyo Активный пользователь

    С нами с:
    11 ноя 2009
    Сообщения:
    57
    Симпатии:
    0
    Адрес:
    Latvija
    Доброго всем времени суток.

    Подскажите пожалуйста как в шаблон вставить Гуглокод банера на яваскрипте....
    Не исполняется, а я не очень программист... :cry:

    Заранее спасибо.