Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Для профи > Организация шаблонов


Автор: Diesel Draft 13.8.2007, 11:09
Привет мальчики и девочки. Вот пишу я ЦМС. Знаете я всегда удивлялся з людей которые прутся написать свою ЦМС. ЦМС с такой архитектурой нигде найти не мог, ну кроме asp (ЦМС composite) и то даже на 70% не задовольняет. Все система создает сама себя. Поэтому шаблонизатор нужен очень хороший.

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

Немного про архитектуру. Сайт поделятся на две части : администратор и сам сайт.  Когда открываешь страничку то создается класс этой страницы, которая походит от class Page, который в свою очередь походит от class Block. 
По очереди запускаются методы класса
     public function OnInit(){}     
     public function OnPostData(){}     
     public function OnAjax(){}  або public function OnRend(){}  

Можно вставлять блок в блок. Сейчас я делаю так: сначала я инициализирую страницу, где кроме настроек еще создаю под блоки, которые в свою очередь инициализируются и могут иметь под блоки. Все это происходит в рекурсии.
Потом рекурсивно выкликаю OnPostData() где считую входные даные.
Потом обрабатывать данные в OnRend() или OnAjax() в зависимости от запроса.

А теперь проблема. Когда я вызываю OnRend() то он включается рекурсивно в жаждем блоке. Тоесть блок имеет текст которые видренедил его под блок. А когда вставляю то приходится писать
Код

<xsl:value-of select="/xml/Block" disable-output-escaping = "yes" />

А мне это ни нравится. И потом з кэшированием сложно. 
Я думаю использовать вставки в шаблон.  Тоесто на выходе, когда уже блок выдренедерилса, я ищу вставку и заменяю на контекст блока. Тоесть я в шаблоне решаю когда что вставить. И не надо предварительно инициализировать бод блоки.


Пример:
Код

      <div class="managerdiv">
        $$blokname;
      </div>


Это значит что надо загрузить блок blokname.

1. Стоить так менять?
2. Какая должна быть вставка ($$blokname; или другая)?


П.С. Ребята, как же неймспейсов не хватает  smile 

Автор: Diesel Draft 13.8.2007, 14:56
Ау, я думал эта тема соберет людей желающих помочь советом.

Автор: qeqeru 3.9.2007, 15:51
Если честно пока читал, по пути расстерял весь смысл... 
... кароче, ничё не понятно...   smile 

Автор: ewolf 3.9.2007, 16:28
Я правильно понял, что идея в том, что один файл шаблона может включать в себя другой файл, при этом каждый файл шаблона (который ты называешь блоком) выводит некоторые данные, которые ему предоставляет соответствующий обработчик на php?

Соответственно, чтобы определить какие обработчики загружать ты предварительно разбираешь шаблон.

Теперь же ты хочешь вызывать сразу все обработчики, передавать результаты их работы в шаблон и там просто вставлять переменные?

Ну, можно сделать и так и эдак.

Я бы правда сделал по другому. Сделал бы некоторый конфиг, где для каждой страницы указал какие обработчики загружать, а в шаблоне просто выводил переменные. В таком случае шаблонизатором тебе вполне подойдет смарти

Автор: SamDark 3.9.2007, 17:05
Вот-вот. Второй раз писать заново Smarty не стоит... http://smarty.php.net/

Автор: Diesel Draft 4.9.2007, 10:20
SamDark, Это точно не смарти.


Цитата(ewolf)

Теперь же ты хочешь вызывать сразу все обработчики, передавать результаты их работы в шаблон и там просто вставлять переменные?


Не все, я вызывал только нужные и рендерю их в переменную.


Цитата(ewolf)

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

Не другой файл, это другой класс. Если б файлы я б просто это сделал

Автор: ewolf 5.9.2007, 00:22
Ну, если честно, я тогда не понимаю, о чем спрашивается в первом посте. Чего конкретно хочется сделать и в чем проблема?

Автор: Diesel Draft 5.9.2007, 10:02
Проблема в том что я хочу з шаблона выбирать что мне грузить

Автор: SamDark 5.9.2007, 11:00
Diesel Draft, 
Smarty:
Код

{smartblock type=managerdiv val=$data}

Автор: Diesel Draft 5.9.2007, 11:02
а, то самое но на XSL

Добавлено через 1 минуту и 35 секунд
php-функцию вставлять можно но не хочется, просто иногда шаблон реагирует человек з кривыми ручками

Автор: SamDark 5.9.2007, 12:01
Код

<xsl:template match="managerdiv">
...
</xsl:template>

Автор: Diesel Draft 5.9.2007, 12:13
SamDark, ты тогда вставляешь кусок з того самого шаблона.

А можно как нибудь организовать колбек?

Автор: SamDark 5.9.2007, 13:17
Diesel Draft, 
1. С какого того самого?
2. Зачем тебе колбэк? (Организовать можно).

Автор: Diesel Draft 5.9.2007, 13:46
у смотри, я в шаблоне делаю колбэк функции, она генерирует блок и отдает назад.

Автор: SamDark 5.9.2007, 13:52
Diesel Draft, 
Это неправильно. Шаблон не должен получать данные самостоятельно без контроллера.

Но если уж очень хочется: http://ru2.php.net/manual/ru/function.xslt-set-object.php

Автор: Diesel Draft 5.9.2007, 17:07
Все таки наверно придется ставить саблотрон. Кстати не подскажешь часто ли он на хостингах установлен?

Автор: SamDark 5.9.2007, 18:37
Diesel Draft, 
Libxslt? Нормальных хостеры ставят по требованию.

Автор: Diesel Draft 6.9.2007, 10:36
А как насчет Саблотрона?
А не видел ты может что то подобное написанного на РНР. правда это путая затея

Автор: SamDark 6.9.2007, 11:56
Diesel Draft, 
Чем тебе Libxslt не приглянулся?

Автор: Diesel Draft 6.9.2007, 12:31
SamDark, та я вот ищу по нем инфу

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)