Тюнниг php как шаблонизатора.

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Тюнниг php как шаблонизатора.

Собственно почему возникла тема, не ради холивара, а ради оценки моего подхода к использованию пхп в качестве шаблонизатора.
Базируется шаблонизатор на технологии описанной еще отцами :) , а именно

PHP:
class TemplatePhp
{
public function __get(...){...}
public function __set(...){...}

public function fetch(...)
{
...
        if($this->__compileTemplate($templateFileName))
        {
            if(is_array($this->__template_vars))
                extract($this->__template_vars,EXTR_REFS|EXTR_OVERWRITE);

            ob_start();
            include($templateFileName);       
            $_sub_template_contents = ob_get_contents();
            ob_end_clean();
            return $_sub_template_contents;
        }
...
}

}
Чем была вызвана необходимость делать предобработку шаблона?
- замена коротких тегов <? ?> -> <?php ?>
- применение автоматически эскейпинг
PHP:
<?=$var?>
, после компиляции раскрывается в код
PHP:
<?php echo htmlspecialchars($vars)?>
- модификаторы
PHP:
<?=$var|!escape?>
, соответствует синтаксису пхп, что удобно в редакторах с подсветкой синтаксиса
- внутренние функции шаблонизатора можно использовать без $this (
PHP:
<?=_t('stringID')?>
), раскроется <?php echo $this->_t($vars)?>[/PHP]

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

Все это вылилось вот в такую красивость (с моей точки зрения)

PHP:
<widget:table>
    <table:column title="URL" align="left" width="240px"/>
    <table:group title="Group1" />
    <table:column title="Column1"/>
    <table:column title="Column2"/>
    ...
    <table:rows rows=$Top10 />
</widget:table>
соответственно после компиляции мы получаем чистый пхп шаблон но уже с созданием видджета и его отрисовкой. создавая виджеты можно писать более чистый шаблон. Вот собственно такова идея и реализация.

Почему не smarty, twig etc
Нет простоты и понятности, смарти3, это танцы с бубном, к примеру для для создания аналога <widget:table> <table:column title="URL" align="left" width="240px"/>...
надо очень постараться. Решения с экстеншеном оправданы если есть хотя бы vps и в состоянии скопилировать и прикрутить его к php . Про синтаксис я уж промолчу, кто как хочет таки и .... делает.
 

HraKK

Мудак
Команда форума
Ай, люди изобретают велосипеды. Я уже к этому приходил и от этого уже отошел )
 

Фанат

oncle terrible
Команда форума
Не вижу в коде предобработки.
вижу только инклюд и возвращение
 

HraKK

Мудак
Команда форума
*****
Это он привел простой PHP Native и сказал что он _его_ переделал, но код не выкладывает потому что считает что важна идея, которая стара как мир)
 

AmdY

Пью пиво
Команда форума
HraKK
а какие проблемы и подводные камни?
по сути это предкомпилятор, принцип такой же как у того же смарти, только генерация не smarty -> php, а php -> php.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Мне интересно, нафига? Кто будет с верстальщиков эти виджеты разбирать?
 

Фанат

oncle terrible
Команда форума
Это не пример PHP Native.
Это пример гибрида смарти+native
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: *****
Не вижу в коде предобработки.
вижу только инклюд и возвращение
все делает магическая функция __compileTemplate :)

-~{}~ 17.02.10 13:58:

Автор оригинала: HraKK
*****
Это он привел простой PHP Native и сказал что он _его_ переделал, но код не выкладывает потому что считает что важна идея, которая стара как мир)
Ни в коем разе, я лишь описала ту идею которая стара как мир, да и нет проблем с кодом выложить, просто если ты говоришь что это фигня, то поделись в чем фигня, почему отошел от такого подхода?

-~{}~ 17.02.10 14:00:

Автор оригинала: *****
Это не пример PHP Native.
Это пример гибрида смарти+native
?? почему вот пример шаблона
PHP:
<widget:frame round="3" color="#efefef">
    <table border="0" cellspacing="4" cellpadding="0" width="98%" style="background-color:  #efefef">
        <tr>
            <td valign="top">
                <font size="3" color="#7f7f7f">
                    <b><?=_t('title')?></b>
                </font>
            </td>
            <td align="right">
                <? if ($CronInstalled) { ?>
...
где тут хоть что-то похожее на смарти?
 

Фанат

oncle terrible
Команда форума
смарти делает то же самое.
компилирует то, что понаписал юзер в шаблоне, в пхп
а здесь, соответственно, гибрид, спарти и пхп.
синтаксис не принципиален.
Замени <?=_t(' на { - вот и будет тебе смарти
 

HraKK

Мудак
Команда форума
вот эти виджеты требуют контроллеров. И удобнее их шаблоны разбивать на другие файлы, так как реиспользование этих шаблонов хорошая вещь + облегчается для понимания шаблон.

Я сейчас юзаю обычный PHP Native по типу:

PHP:
<html>
<title><?=$title;?></title>
<body>
<?= wInclude::template( '/banners/header' ); ?>
<table>
<tr>
<td>Hello Word</td>
</tr>
<table>
<?= wPublication::getLast( '/publication/news', 'news', 5 ); ?>
</body>
</html>
Соответственно не надо никаких компиляторов
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: *****
Замени <?=_t(' на { - вот и будет тебе смарти
Так а какой смысл? ведь смысл натив использовать синтаксис пхп, а не сторонний
 

HraKK

Мудак
Команда форума
Так а какой смысл? ведь смысл натив использовать синтаксис пхп, а не сторонний
Смысл натива не в синтаксисе.

А еще я ужасно глупо считаю редактирование шаблонов в wyswyg'е.
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: HraKK
вот эти виджеты требуют контроллеров. И удобнее их шаблоны разбивать на другие файлы, так как реиспользование этих шаблонов хорошая вещь + облегчается для понимания шаблон.

Я сейчас юзаю обычный PHP Native по типу:
Соответственно не надо никаких компиляторов
Да но что если надо проэскейпть переменную
PHP:
<?=htmlspecialchars($var)?>
? а что если нет перtменной $var
PHP:
<?=(isset($var)?htmlspecialchars($var):'')?>
? жесткий код!

виджет, суть класс
PHP:
class TableWidget extends IWidget {}
вот во что выраждается шаблон после компиляции

PHP:
/* {{{ Widget/form */
 { $this->__template_widgets['form'][] = Widgets::Instance()->createWidget('form',array('style'=>"background-color: #efefef;",'form'=>$TaskForm),$this); ob_start();  ?>
                    <table cellpadding="0" cellspacing="2" border="0" style="background-color:  #efefef">
                        <tr>
                            <td><?php  /* {{{ Widget/form/title }}} */ { $object = end($this->__template_widgets['form']); $object->title(array('id'=>"type")); }  ?>:</td>
                            <td><?php  /* {{{ Widget/form/element }}} */ { $object = end($this->__template_widgets['form']); $object->element(array('id'=>"type",'onchange'=>'Widgets().DisplayBySelect(this,[
                                                                  ["reboot",[]],
                                                                  ["manual",[]],
                                                                  ["once",[]],
                                                                  ["hourly",["minute"]],
                                                                  ["daily",["hour","minute"]],
                                                                  ["weekly",["week","hour","minute"]],
                                                                  ["monthly",["day","hour","minute"]],
                                                                  ["yearly",["month","day","hour","minute"]]])')); }  ?></td>
                            <td>
                                <?php  /* {{{ Widget/form/element }}} */ { $object = end($this->__template_widgets['form']); $object->element(array('id'=>"minute",'style'=>"display: none;")); }  ?>
Сорри за большой кусок

-~{}~ 17.02.10 14:49:

Автор оригинала: HraKK
Смысл натива не в синтаксисе.

А еще я ужасно глупо считаю редактирование шаблонов в wyswyg'е.
100%

Обычный редактор с подсветкой пхп синтаксиса имелось ввиду.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Ирокез
Тебе этот "жесткий код" написать один раз и забыть о нем. Все. Или ты так часто переписываешь шаблоны, что каждый день лазаешь в них?
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: *****
если у тебя в шаблоне нет переменной, то это проблема не шаблонизатора....
да согласен, согласен так-же с тем, что не всегда isset полезен, особенно на этапе разработки, но это лишь расширение <?= не более
 

AmdY

Пью пиво
Команда форума
синтаксис получается xhtml + php, его действительно любой нормальный редактор должен подсвечивать, и будет работать фолдинг, что очень важно при редактировании шаблонов.

как заметил c0dex заучивать синтаксис виджетов придётся, но это не сложнее чем php хелперы или синтаксис шаблонизаторов.

виджеты это аналог блочных функций? насколько удобно их писать, учитывая что внутри смесь php и html?
 

Ирокез

бессмертный пони
Команда форума
Партнер клуба
Автор оригинала: c0dex
Ирокез
Тебе этот "жесткий код" написать один раз и забыть о нем. Все. Или ты так часто переписываешь шаблоны, что каждый день лазаешь в них?
Каждый день лажу в них

-~{}~ 17.02.10 15:16:

Автор оригинала: AmdY
виджеты это аналог блочных функций? насколько удобно их писать, учитывая что внутри смесь php и html?
Точно, но у учетом иерархии самих виджетов.
PHP:
<widget:bread>
   <widget:table>
      <table:column .../>
   </widget:table>

   <widget:table>
      <table:column .../>
   </widget:table>
 
   <bread:crumb.../>

</widget:bread>
раскидает все по своим местам. Если я не ошибаюсь (возможно не до конца изучил тему) такого пока не один шаблонизатор не делал. Ну HraKK, почему-то отказался от этого

сам виджет как я говорил суть класс вот пример класса, шаблон для вывода не выкладываю

PHP:
/**
 * <widget:bread>
 *  <bread:crumb url='' title='<заголовок>'/>
 * </widget:bread>
 */
class BreadWidget extends IWidget
{
    public function PreCreate(&$Args,$Entire)
    {
        $this->BC_CRUMBS = array();
    }

    public function Html($innerHTML)
    {
        $this->BC_INNERHTML = $innerHTML;
        $this->Render('tpls/breadcrumbs.tpl');
    }

    public function Crumb($Args)
    {
        $this->BC_CRUMBS[] = array(isset($Args['url'])?$Args['url']:'',isset($Args['title'])?$Args['title']:'');
    }
}
 

HraKK

Мудак
Команда форума
Кстати да - эскейпить задача View, ну лично у меня так)
 
Сверху