Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Шаблонизатор на XML+XSL, Рекомендации и обмен опытом 
:(
    Опции темы
Vaulter
Дата 7.12.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1724
Регистрация: 30.12.2002
Где: бункер

Репутация: нет
Всего: 22



SamDark, Дык. если он плохой, пусть жрет обычную HTML разметку (сделанную на сервере),
а если хороший (или врет что секёт в xml) кормим ему xml + xsl 
дабы снизить нагрузки на сервере.


--------------------
PM MAIL WWW ICQ   Вверх
SamDark
Дата 7.12.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 0
Всего: 38



Vaulter
Ну, когда нагрузка большая - это оправдано. А так - лишняя заморочка.

Это сообщение отредактировал(а) SamDark - 7.12.2007, 16:24


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
egao
Дата 9.12.2007, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 6.8.2007

Репутация: нет
Всего: нет



> Этапы верные. Подозрения про скорость тоже. Но упадёт она не при генерации XML, а при применении XSLT-преобразования.

процентов в 80 всех запросов шаблонизация будет происходить на стороне клиента, что в конечном счёте даст приличную экономию на шаблонизации и уменьшение исходящего трафика.


> Жду критику, замечания и идеи.

вместо for-each лучше по возможности применять apply-templates. будет гибче.


> Насчет преобразования на стороне клиента - думал, но там больше проблем - совместимость браузеров, проблемы с кнопкой "Назад", закладки.

что там не так с кнопкой "назад" и закладками?? с аяксом не путаешь?


> p.s. преобразования на стороне клиента лучше не делать. Ещё рано. Браузерам от этого нехорошо... 

да ладно smile не так уж всё и плохо smile


> ващет "хорошие" броузеры сами говорят чего они могут а чего нет в HTTP заголовках

они не говорят, поддерживают ли они xslt smile


формирование данных:
Код
    $reg->page= $page= (object) array();
    $page->title= '\(^_^)/';
    $page->content= array( );
    $page->theme= 'papyrus';
    $reg->printer= 'printers/xslt';


трансформация в xml:
Код
function native2xml( $var, $name='data' ){
    $xml= '';
    if( is_object( $var ) || is_array( $var ) ):
        foreach( $var as $n => $v )
            $xml.= "\n" . native2xml( $v, $n ) . "\n";
    else:
        $xml= $var;
    endif;
    $shortN= preg_replace( '/(^[^a-zA-Z_]+|[^\w]+)/', '_', $name );
    if( !$shortN ) $shortN= 'i';
    $name= htmlspecialchars( $name, ENT_QUOTES, 'UTF-8' );
    return '<' . $shortN . (( $shortN != $name )?( ' _="'. $name . '"' ):( '' )) . '>' .$xml . '</' . $shortN . '>';
}


вывод пользователю:
Код
$clientXSLT= preg_match( '!^(Mozilla/[456]|Opera/9)!', @$reg->server->HTTP_USER_AGENT );

$page->link2xsl= '/theme/' . $page->theme . '/xsl/get.xsl';
$page->extRoot= $reg->extRoot;
$page->linkPrefix= $reg->linkPrefix;
if( $clientXSLT ):
    $page->xslType= 'client side';
    header( 'Content-Type: application/xml; charset="utf-8"' );
    echo '<?xml version="1.0" encoding="utf-8" ?><?xml-stylesheet type="text/xsl" href="' . $reg->extRoot . $page->link2xsl . '" ?>';
    echo native2xml( $page, 'page' );
else:
    $page->xslType= 'server side';
    $xml= new DOMDocument( );
    $xml->loadXML( native2xml( $page, 'page' ) );
    $xsl= new DOMDocument( );
    $xsl->load( $reg->intRoot . $page->link2xsl );
    $proc= new XSLTProcessor( );
    $proc->importStyleSheet( $xsl );
    header( 'Content-Type: text/html; charset="utf-8"' );
    echo $proc->transformToXML( $xml );
endif;


вот, что из этого в итоге получается 
 посредством этого шаблона 

ещё один пример

немного теории

Это сообщение отредактировал(а) egao - 9.12.2007, 14:15
PM MAIL   Вверх
Endeveit
Дата 10.12.2007, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 100
Регистрация: 2.6.2006

Репутация: 1
Всего: 7



Цитата(SamDark @  4.12.2007,  22:12 Найти цитируемый пост)
Опыт с XSL есть. Получается очень гибко, довольно сложно и не сильно быстро.

Поддержу тостующего по всем пунктам кроме сложности.
На самом деле достаточно нескольких недель чтобы в полной мере овладеть работой с XSL-преобразованиями.
Проблемы со скоростью решаются кэшированием всего и вся.
На преобразование на стороне клиента надеяться не советую.
PM WWW   Вверх
Feldmarschall
Дата 11.12.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



Я, всё же, полагаю, что изначальные предпосылки у автора не совсем верные.
Цитата(mishaSL @  4.12.2007,  20:31 Найти цитируемый пост)
Но смущает одно:
Составление XML файла из информации полученной из БД MySQL - получается как бы дополнительный этап и есть подозрения, что скорость работы всей этой системы после такой организации шаблонов резко снизится.

Непонятно, почему логика приложения названа "дополнительным этапом".
Сам же пишет - "приложение только формирует нужные данные в нужном формате". Ну, если это лишний шаг - то я уже даже и не знаю. по мне - так это основная часть приложения. А вот шаблонизатор - это так, украшения. Сменить шаблонизатор для грамотно написанного скрипта - пара пустяков. 

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

Непонятно, из каких соображений получилась мысль о том, что скорость работы значительно снизится. Вроде бы, приложение делает все то же самое, что и любые другие. Откуда снижение производительности?

Цитата(mishaSL @  4.12.2007,  20:31 Найти цитируемый пост)
Так вот хотел услышать мнения тех, кто уже писал что-то подобное. Или начинал писать, но остановился по каким-либо причинам. Как вы думаете, есть ли еще какие-либо минусы в данной структуре организации шаблонов?

Непонятно, если честно, чем "данная структура" отличается от любых других. Вроде бы, система везде одна и та же - получили нужные данные и отдали их шаблонизатору. Или я его-то не понял?
PM   Вверх
SamDark
Дата 11.12.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 0
Всего: 38



Feldmarschall
Читаем внимательней. Хотелось разделить php и вёрстку, а не логику и представление.

Про структуру вы правы: все шаблонизаторы одинаковы.


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Feldmarschall
Дата 11.12.2007, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



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

Впрочем, перечитав повнимательнее исходное сообщение, я понял, что "дополнительным этапом" автор называет не получение данных, а генерацию из них XML. И даже частично, пожалуй, разделяю его опасения. Но, всё-таки, поскольку мы ограничены пределами восприятия человека и пропускной способностью интернета, я не думаю, что объем сначала генерируемого, а потом тут же разбираемого XML будет таким, чтобы сказаться на  производительности.

Зато нашёл гораздо более серьёзный недостаток:

Цитата(N0dwis @  5.12.2007,  01:25 Найти цитируемый пост)
иногда надо вставить какую-то мелочь - типа заголовок, таблицу специального вида и т.п. Городить из-за этого очередной тег xml не хочется, вот и приходится все-таки вставлять чистый xhtml.


Ежу понятно, что это перечеркивает всю идею и все заявления о том, что "Если придется даже самым кардинальным способом изменять дизайн - это затронет только xsl файл".
Особенно учитывая, что все наши проекты состоят из таких "мелочей".
PM   Вверх
SamDark
Дата 12.12.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 0
Всего: 38



Feldmarschall
Цитата

Sam Dark: Так вы про логику или про язык? Логика легко разделяется с использованием native-шаблонов.

N0dwis: Я про язык - не люблю дикую смесь php и html, которая есть практически во всех движках.



--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Feldmarschall
Дата 12.12.2007, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



Ох. Ну я же говорю, что "несмотря на термины, которые он употребляет".
Вообще, мы о чем сейчас говорим? О том, что я неправильно цитирую букву высказываний автора? О том, что я невнимательный?
Или, все-таки, о сути его действий? Я предпочитаю последнее.

В отделении "пхп от хтмл" как таковом нет смысла.
Делать что-то имеет смысл, если у тебя есть объективные причины.
Я могу назвать 3-4 объективные причины отделять логику представления от логики отображения.
Разделять же "пхп и хтмл" ни одной объективной причины назвать нельзя.
А как он там это называет - дело десятое. 

Заявления типа "мне не нравится дикая смесь" и "я написал движок, который позволяет легко сменить дизайн" (как будто движок с native шаблонизатором этого не позволяет!) - исключительно субъективные. И обсуждать их тогда вообще бессмысленно. Все равно что спорить, что вкуснее - яблоки или колбаса. 

Но если вам так хочется, я могу принять правила этой игры, и говорить про отделение пхп от хтмл. Хотя мне очень не хочется этого делать, поскольку такое именование поддерживает одно из самых дремучих заблуждений пхп-программистов.

Тем более, что сам автор, в результате, так до конца их и не разделил.

Это сообщение отредактировал(а) Feldmarschall - 12.12.2007, 13:49
PM   Вверх
SamDark
Дата 12.12.2007, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 0
Всего: 38



Feldmarschall
Смысла для меня лично нет, но не для автора. У автора причины субъективны. Но они тоже причины. Он спросил, как сделать, чтобы ему было вкусно, а не как сделать универсально и правильно.

p.s. я-то пытался в самом начале навести на правильный путь, но не вышло...


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
N0dwis
Дата 12.12.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: 1
Всего: 4



Цитата(Feldmarschall @  12.12.2007,  13:48 Найти цитируемый пост)
Разделять же "пхп и хтмл" ни одной объективной причины назвать нельзя.

Я назвал ее выше, может не в явной форме. Причина - возможность довольно кардинально поменять дизайн сайта человеку, абсолютно не знакомому с php и смутно представляющего себе что такое программирование вообще.
Плюс еще одна причина - такой движок довольно легко можно переделать для wap (пока близко не сталкивался, но там же вроде идет чистый xml).
Кроме того, native шаблоны даже программисту будет править довольно тяжело - опять смесь php и html тяжело воспринимается.

Цитата(Feldmarschall @  11.12.2007,  23:51 Найти цитируемый пост)
Ежу понятно, что это перечеркивает всю идею и все заявления о том, что "Если придется даже самым кардинальным способом изменять дизайн - это затронет только xsl файл".

Ну во-первых никто не идеален. Во-вторых это относится к очень уж экзотическим мелочам, если элемент встречается больше 2-х раз, уже есть смысл для него создать отдельный класс представления и стандартизировать его. Да и сейчас я использую вставку xhtml чаще всего просто для сообщений пользователю типа "Неправильный пароль". Ну а в третьих - я над этим работаю.


Цитата(Feldmarschall @  12.12.2007,  13:48 Найти цитируемый пост)
Я могу назвать 3-4 объективные причины отделять логику представления от логики отображения.

Назовите объективные причины.


Цитата(SamDark @  12.12.2007,  14:21 Найти цитируемый пост)
Он спросил, как сделать, чтобы ему было вкусно, а не как сделать универсально и правильно.

Правильно вообще понятие относительное, но от хорошей идеи никогда не отказывался. Буду благодарен за объяснение.

PM MAIL   Вверх
SamDark
Дата 12.12.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Добрый кот
***


Профиль
Группа: Участник
Сообщений: 1424
Регистрация: 25.7.2006
Где: Voronezh

Репутация: 0
Всего: 38



N0dwis
Код

class View{
    private $vars = array(); 
    
    function assign($varname, $value){ 
        $this->vars[$varname] = $value; 
    } 

    function remove($varname) { 
        unset($this->vars[$varname]); 
    }

    function fetch($name){
        $template = $this->getTemplate($name);
        if($template){
            ob_start();
            $err_level = error_reporting(1015);
    
            // Загружаем переменные 
            foreach ($this->vars as $key => $value) { 
                    $$key = $value; 
            }
            
            include($template);
            error_reporting($err_level);
            return ob_get_clean();         
        }
        else{
            return false;
        }
    }

    function display($name){
        echo $this->fetch($name);
        die();
    }
}


В контроллере соотв.:

Код

$this->view->set('posts', array(
  0 => array(
     'title' => 'test1',
     'text' => 'test1'
  ),
  1 => array(
     'title' => 'test2',
     'text' => 'test2'
  )
));
$this->view->display('posts');


Шаблон:
Код

<dl>
<?foreach($posts as $post):?>
   <dt><?=$post['title']?></dt>
   <dd><?=$post['text']?></dd>
<?endforeach?>
</dl>


Это сообщение отредактировал(а) SamDark - 12.12.2007, 17:56


--------------------
rmcreative.ru — Это жжж неспроста...
yiiframework.ru — О фреймворке Yii на русском.
reggi — здесь я регистрирую домены
PM MAIL WWW GTalk Jabber MSN   Вверх
Feldmarschall
Дата 12.12.2007, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



N0dwis, спасибо за интересный ответ.
Прежде, чем отвечать по пунктам, хочу задать один вопрос:
Скажи, почему ты так сопротивляешься определению "отделение логики приложения от логики представления"? Что тебе кажется в нем неправильным? Неприложимым к твоему случаю?


Это сообщение отредактировал(а) Feldmarschall - 12.12.2007, 19:14
PM   Вверх
N0dwis
Дата 12.12.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 238
Регистрация: 18.9.2007
Где: Луганск

Репутация: 1
Всего: 4



Цитата(Feldmarschall @  12.12.2007,  19:14 Найти цитируемый пост)
Скажи, почему ты так сопротивляешься определению "отделение логики приложения от логики представления"? Что тебе кажется в нем неправильным? Неприложимым к твоему случаю?

Я не сопротивляюсь, а полностью поддерживаю! Просто я задавался целью именно отделить код html от кода php, т.к. смотреть на вот это
Код

echo "<table cellpadding='0' cellspacing='0' width='100%'>\n";
    echo "<tr>\n<td align='left' width='100%' class='tbl'><a href='".FUSION_SELF."?msg_send=0'>".$locale['401']."</a></td>\n";
    echo "<td width='1%' class='tbl' style='white-space:nowrap;font-weight:".($folder=="inbox"?"bold":"normal")."'><a href='".FUSION_SELF."?folder=inbox'>".$locale['402']." [".$bdata['inbox_total']."/".$msg_settings['pm_inbox']."]</a></td>\n";
    echo "<td width='1%' class='tbl' style='white-space:nowrap;font-weight:".($folder=="outbox"?"bold":"normal")."'><a href='".FUSION_SELF."?folder=outbox'>".$locale['403']." [".$bdata['outbox_total']."/".$msg_settings['pm_sentbox']."]</a></td>\n";

немного утомительно (кусок из php-fusion).
А отделение логики приложения от логики представления - классическая в общем-то задача, решается с помощью MVC-подобных паттернов (Mediator, Observer), хотя честно признаюсь на php я это не реализовывал, только на С++ smile . 
Если использовать еще и шаблоны в смысле отделения php от html, то класс View делится еще на 2 - собственно логика представления и внешний вид представления (где-то так, хотя теорию я по этому поводу не развивал smile ).
SamDark, спасибо!

P.S. Вспомнил еще один плюс связки xml+xslt - не разрываются теги html. Обычно в шаблонизаторах код шаблонов храниться в нескольких файлах (даже если в одном - проблема остается) и получается, грубо, что теги, скажем, <body> и </body>, будут находиться в разных файлах, либо в разных частях файла - опять нарушается логика и восприятие. В случае же xslt - каждый блок представляет собой законченный кусок с начальным и конечным тегом.
PM MAIL   Вверх
Feldmarschall
Дата 12.12.2007, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: -2
Всего: 32



Возьмем два куска кода.
Один из примера, SamDark,  второй - из примера на w3schools.com
Код

<xsl:for-each select="catalog/cd">
  <tr>
    <td><xsl:value-of select="title"/></td>
    <td><xsl:value-of select="artist"/></td>
  </tr>
</xsl:for-each>

Код

<?foreach($posts as $post):?>
  <tr>
    <td><?=$post['title']?></td>
    <td><?=$post['artist']?></td>
  </tr>
<?endforeach?>

положа руку на сердце, сможешь ли ты сказать, что первый чем-то принципиально отличается от второго?
PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1160 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.