За последние 24 часа нас посетили 53926 программистов и 1717 роботов. Сейчас ищут 934 программиста ...

Использовать PHP вместо Smarty

Тема в разделе "Прочие вопросы по PHP", создана пользователем Битник, 10 июн 2007.

  1. Битник

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

    С нами с:
    9 фев 2007
    Сообщения:
    103
    Симпатии:
    0
    Расскажите, как использовать PHP в качестве шаблонизатора. Инклюдами что ли? Как выводите шаблоны, как внутри шаблонов используете переменные, циклы, условия. Поподробнее расскажите.
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    кто-то и так делает.

    А разве смарти не на PHP написан?! Насколько я помню именно на нём. Если не хотим пользоваться смарти пишем свой шаблонизатор. Я именно так и сделал.

    например это функция замены псевдопеременных в шаблоне:
    PHP:
    1. <?
    2.     // parse
    3.     function parse($template = NULL, $replace_array = NULL)
    4.     {
    5.         if($template == NULL) $this->tpl_error("Error. Bad argument "\$template" in function "parse()".");
    6.         if($replace_array == NULL) $this->tpl_error("Error. Bad argument "\$replace_array" in function "parse()".");
    7.  
    8.         $i = 0;
    9.         foreach($replace_array as $index => $value)
    10.         {
    11.             $search_array[$i] = "".$this->open_tag."".$index."".$this->close_tag."";
    12.             $i++;
    13.         }
    14.  
    15.         if($this->parse_mode == (int)0):
    16.             $result = str_replace($search_array, $replace_array, $template);
    17.         elseif($this->parse_mode == (int)1):
    18.             $result = str_ireplace($search_array, $replace_array, $template);
    19.         elseif($this->parse_mode == (int)2):
    20.             $result = preg_replace("/".$this->open_tag."([a-z A-Z_0-9]+)".$this->close_tag."/e", '( array_key_exists("${1}", $replace_array) )? $replace_array["${1}"]: $this->open_tag."${1}".$this->close_tag', $template, -1);
    21.         endif;
    22.  
    23.         return($result);
    24.     }
    25.     // /parse
    26.  
    помимо этой функции есть функция выборки чистых шаблонов в буфер, парсинг статических шаблонов, инициализация шаблонизатора, логирование и вывод ошибок. кажется всё.

    Это мне даёт быстрый и удобный инструмент для полноценной работы с шаблонами. Главное с умом этим пользоваться. А смарти - это монстр.
     
  3. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Вот ещё пример:
    PHP:
    1. <?php
    2. // index.php
    3. function parse($fname, $vars = array()) {
    4.     foreach ($vars as $name => $value) {
    5.         $$name = $value;
    6.     }
    7.  
    8.     ob_start();
    9.     include $fname;
    10.     return ob_get_clean();
    11. }
    12.  
    13. $records = array('Один', 'Два', 'Три');
    14. $head =  array('title' => 'Заголовок страницы');
    15.  
    16. print parse('body.php', array('records' => $records, 'head' => $head));
    17. ?>
    18.  
    PHP:
    1.  
    2. <?=parse('head.php', $head)?>
    3. <!-- body.php -->
    4. <ul>
    5. <?foreach($records as $value) { ?>
    6.     <li><?=$value?></li>
    7. <?}?>
    8. <ul>
    9. <?=parse('foot.php')?>
    PHP:
    1. <!-- head.php -->
    2. <html>
    3. <head>
    4.     <title><?=$title?></title>
    5. </head>
    6. <body>
    PHP:
    1. <!-- foot.php -->
    2. </body>
    3. </html>
    На выходе:
    Код (Text):
    1. <!-- head.php -->
    2. <html>
    3. <head>
    4.     <title>Заголовок страницы</title>
    5. </head>
    6. <body>
    7. <!-- body.php -->
    8. <ul>
    9.     <li>Один</li>
    10.     <li>Два</li>
    11.     <li>Три</li>
    12. <ul>
    13. <!-- foot.php -->
    14. </body>
    15. </html>
    Сам что-то похожее использую, только вот все короткие теги перевожу к XML виду
    Код (Text):
    1. array('<?' => '<?php', '<?=' => '<?php print')
    и сохраняю шаблон в файле.
     
  4. iamFake

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

    С нами с:
    14 июн 2007
    Сообщения:
    1
    Симпатии:
    0
    у меня на eval основано, шаблони компилируемые, с применением конструкций типа <if cond="$var">bla<else />blo</if>

    HTML:
    1.  
    2. <title>{$DocTitle}</title>
    3. </head>
    4. <if cond="$SomethingHere">
    5. <a href="asd">12412</a>
    6. <else />
    7. <a href="vvv">6666</a>
    8. </if>
    9. </body>
    10. </html>
    11.  
    вызовы простые

    PHP:
    1.  
    2. $TPL->LoadTemplate('_index.tpl', 'MainPage');
    3. // тут код какойнить
    4. eval(Template::Parse('MainPage'));
    5. // можно ченить поделать с $TPL_TMP - там результат обработки шаблона
    6. return $TPL_TMP;
    7.  
     
  5. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    я использую технологию, при которой шаблоны рендерятся в html и применяются к страницам сайта до его опубликования, а в процессе вызова скрипта работает только бизнес-логика страницы, а не генерится шаблон, а потом уже запускается бизнес-логика. таким образом требуется дополнительная компиляция перед опубликованием, но зато экономится уйма рабочего времени и ресурсов на сервере.
     
  6. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    stas_t
    Не совсем понял тебя... ты говоришь про предварительную генерацию всех страниц сайта?
    А если хоть на одной странице сайта есть динамика, например, список последних тем форума? Неужели фрейм?
     
  7. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Dagdamor
    шутите? если на странице есть динамические элементы -- используйте php. это и есть бизнес-логика (не важно, генерятся при этом реальные бабки, или просто таблица с результатами поиска). просто общие визуальные элементы, остающиеся одинаковыми на всех страницах сайта (page layout, если хотите), я не вижу смысла регенерировать при каждом запросе если их можно вставить в страницы заранее.

    вот смотрите, пример этого форума: здесь есть всего несколько страниц (index.php, viewforum.php, viewtopic.php, profile.php так навскидочку), у которых заголовок (до рекламы) и окончание страницы (Powered by...) абсолютно одинаковые и не требуют вообще никакой динамики. их спокойно можно было сгенерить до выкладывания на сервер. настоящая динамика начинается с меню. но даже меню я бы вставил в шаблон (так как оно появляется на всех страницах), просто две последние позиции отрисовывал бы не прямым html, а вызовом пхп-функций.

    да, кстати, я говорю не только о генерации статического сайта, но и пхп-страниц тоже. под бизнес-логикой я понимаю именно скрипты, которые на разных страницах выполняют разные действия. скрипты, которые для разных страниц генерируют одинаковый html, я предпочитаю переводить в чистый html и вставлять в страницу при помощи шаблонов до выкладывания на сервер.
     
  8. Anonymous

    Anonymous Guest

    stas_t, респект опять. =)
     
  9. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    stas_t
    Вот этого я не понимаю. Что значит, сгенерировать до выкладывания? Вы думаете, эти части дизайна в phpBB не в виде обычного HTML хранятся?
    Все шаблонизаторы работают одинаково - статические блоки в них хранятся как статические блоки, и отдаются при сборке страницы как статические блоки. Я по-прежнему не вижу отличий вашего подхода от общепринятого.
     
  10. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    кстати, это самое правильное решение :)
     
  11. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    спасибо за сомнительный комплимент, но мне не кажется возможным, чтобы лебедев со своими артистами чесали рунет без подобного инструментария. а чёс начался задолго до выкладывания osb на sourceforge.

    dark-demon
    фреймы, действительно, очень удобная вещь. я, правда, использую не классические фреймсеты, а iframe-вариант. очень хорошо смотрится для размещения длинных списков в окошке с прокруткой и позволяет быстро открыть основную страницу пока подгружается весь список в окно.

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

    поэтому насчёт "самого правильного решения" я бы не торопился. я бы сказал, что это решение подходящее для определённых ситуаций
     
  12. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    зато каждую такую страницу ты можешь полноценно закешировать => нагрузка очень сильно падает.

    http://dark-demon.nm.ru/web/samples/xhtml/rightside.xml :)
     
  13. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    спорно. не каждую страницу можно закешировать.
     
  14. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    stas_t
    Я уже удалил свою мессагу. Не хочу начинать новый флеймвар. Система мне не понравилась, звиняйте уж.
    Фреймы... о боги :) я про них упомянул совершенно не всерьез. Мне почему-то казалось, что использовать frame/iframe при генерации контента считается у разработчиков дурным тоном.
     
  15. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    использование их (да и не только их) дурными разработчиками - является дурным тоном ;-)
    а так, фреймы не просто так придуманы были...

    пример?
     
  16. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    у вас страница, на которой выдаётся список ваших... э-э... дел на сегодня. страница называется my_tasks.php и доступна для каждого пользователя в организации. пользователей... э-э... ну... Х человек. список должен быть сгенерён для вас и включать по выбору либо все ваши дела, либо все открытые дела на сегодня, либо открытые дела на текущую неделю. что будем кешировать?
     
  17. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    dark-demon
    Насколько я знаю, фреймы были введены до появления полноценных серверных технологий, возможно даже до появления SSI. В то время это был единственный способ сборки сайта из шаблонов. Сейчас iframe'ы больше ассоциируются с баннерами, рекламой и генераторами траффика :) хотя конечно и метлу в квартире можно использовать по назначению...
     
  18. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    stas_t, а что ты тут собираешься пихать во фрейм? впрочем, да, эту единственную страницу можно закэшировать допустим на 5 минут.

    Dagdamor, не думаю, что фреймы появились раньше ssi...
     
  19. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    dark-demon
    в iframe я бы вынес собственно таблицу с заголовками и списком. вне фрейма останутся элементы управления (выбор фильтра, кнопка для подтверждения отмеченных дел как выполненых и пр.). если потребуется отсортировать список по полю, то делается это внутри фрейма без перезагрузки основной таблицы.
    хотелось бы уточнить, какую версию страницы будем кешировать? вариант "все"? или "сегодня"? или "недельку"? или сразу три? только для меня или для всех пользователей? напоминаю, страница во фрейме отображает список в зависимости от сессии текущего пользователя и параметров фильтра, который он выбрал.

    Dagdamor
    у меня фреймы вообще ни с чем не ассоциируются. кем и для чего они создавались -- меня абсолютно не волнует. когда понадобятся, они будут использованы. то же самое могу сказать и про другие тэги.
     
  20. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    stas_t, вот поэтому использование фреймов и является дурным тоном :) посмотри как сделано это у меня на http://dark-demon.nm.ru/ (только не надо обсуждать кривость вёрстки, дизайна и тп ^_^) - вся навигация находится во фреймах. на самой же странице находится исключительно контент и ссылки на файлы с навигацией. параметры фильтра определяются буковками после знака вопроса - это основа REST-а. с учётом сессии есть смысл делать только конфиденциальные страницы - тут не только кэширование есть смысл отключить, но и шифрование применить.
     
  21. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    только актуальную.
     
  22. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    dark-demon
    а по-моему, если страница не может быть кеширована, это ещё не значит, что "использование фреймов и является дурным тоном". у фреймов есть и плюсы, и минусы. даже не используя фреймов вы не сможете реализовать данную страницу без обращения к серверу. это совсем не значит, что написание серверных приложений является дурным тоном ;-)

    p.s. для каждого пользователя актуальна своя версия страницы. будем кешировать актуальные версии для всех пользователей?
     
  23. dark-demon

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

    С нами с:
    16 фев 2007
    Сообщения:
    1.920
    Симпатии:
    1
    Адрес:
    леноград
    не поэтому, а потому, что во фрейм выносят контент. а надо наоборот - всё не относящееся к контенту.

    да. каждый пользователь закеширует у себя свою страницу. впрочем, не помешает их и на серваке закешировать, чтобы при каждом обращении не генерировать её снова...
     
  24. G_Rom_S

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

    С нами с:
    23 авг 2007
    Сообщения:
    6
    Симпатии:
    0
    Столкнулся с такой проблемой:
    Интернет-магазин (Shop Script) использует Smarty, в котором я к сожалению не разбираюсь вообще. Нужно было изменить главную страницу - полез в шаблоны, попытался заменить теги Smarty на пхп - не сработало, попробовал закоментировать пхп чтоб он шел без обработки Smarty - тоже не сработало - подскажите, пожалуйста, можно ли использовать PHP в шаблонах для Smarty, если можно, то как?
     
  25. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    шаблоны смарти "компилируются" в php код и потом исполняется именно этот код. по умолчанию он должен перед исполнением проверять, что оригинальная версия шаблона не изменилась, но иногда для увеличения быстродействия эту фичу отключают.

    поищите в руководстве смарти (у них есть и русский перевод мануала в очень читаемом варианте)