Интерпретировать как шаблон Smarty(или PHP)-переменную?

Balancer

Guest
Интерпретировать как шаблон Smarty(или PHP)-переменную?

Есть такая система (CMS)

1. Шаблоны страниц, хранящиеся в общей БД и редактируемые как обычные страницы.
2. Есть контент страниц.
3. Есть Смарти-фронтенд, который компилирует шаблон, вставляя туда значения заголовков, тела и т.п.

Вот хотелось бы, чтобы тело страниц само было Смарти-шаблонами. Т.е. в шаблоне страницы стоит включение текста страницы, но и сам текст работает тоже как шаблон.

Если ещё плохо объяснил, такой пример. Есть шаблон:

Код:
<html>
<title>{$page_title}</title>
....
{page_body}
....
</html>
Есть страница, содержащая
Код:
Это тест, сюда включим PHP-модуль: {include_php ...}
Если делать в лоб, то этот кусок вставится без интерпретации Smarty, т.е. {include...} будет простым текстом. Можно ли интерпретировать?
 

Demiurg

Guest
В смарти есть так называемые ресурсы, в мануале описывается как добиться хранения шаблонов в базе.
 

Balancer

Guest
Не то! Шаблоны у меня итак хранятся в базе, с этим всё ок, я ж написал выше. Мне нужно, чтобы, грубо говоря, в шаблоны вставлять шаблоны, а не данные.

Впрочем, я уже нашёл решение, хотя и не очень красивое.

Вводится ещё один протокол и в шаблон ставится соответствующий ему {include file="$page"}, а $page присваивается во фронтенде в имя это страницы.

Вечером попробую.
 

Balancer

Guest
Заполняется основным Smarty-скриптом из БД в нынешней версии. Поэтому он её и интепретирует. А теперь я буду подключать не по {$page_body}, а по {include file="hts_body:$page_url"}

Только экспериментировать придётся ночью, а то сервер ляжет от внезапного сброса кешей :)

-~{}~ 30.08.04 15:20:

Впрочем, видно, надо, чтобы было понятнее, объяснить с самого низа.

- Есть CMS. С идеологией в духе Wiki.
- Со своим языком разметки.
- Данные хранятся в БД
- Для каждой страницы хранится как исходный код (для редактирования, diff'ов изменений и т.п.), так и скомпилированный вариант. На лету не компилирую, т.к. некоторые тэги могут быть очень сложными и ресурсоёмкими.
- Раньше система компилировала просто PHP-страницы, которые сами себя и показывали. Соответственно, никаких проблем с активным контентом страниц - пиши нужный PHP-код в исходнике, он и в итоговой странице будет.
- Теперь решил перейти на Smarty. Т.к., во-первых, подключаю к написанию страниц народ и неразумно им давать PHP в руки, во-вторых, чтобы не изобретать велосипед в плане шаблонов.

Вот отсюда и пошли сабжевые проблемы. Сейчас все страницы получаются статическими - их основная часть Smarty не транслируется, т.к. вставляется "как есть", как значение переменной.

Ну да я сразу не сообразил, что {include ...} может взять в качестве параметра шаблон, адресуемый на свой обработчик. Сегодня реализую :)

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

Блин, а неприятности всё равно будут. Поскольку фигурные скобки на страницах должны использоваться произвольно, придётся реализовывать тэг, типа [ smarty ] {smarty}-{коды...} [ /smarty ] , а скобки экранировать... Эх, не было печали... :)

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

Demiurg

Guest
Честно говоря очень сложно тут разобрать в подобном проекте, поэтому конкретные советы давать тоже сложно. Посмотри еще в сторону insert.
 

Balancer

Guest
Ага, спасибо. Но это не совсем то, что надо.

А вот зато плагины класса Output Filters - кажется то, что меня и спасёт. Введу просто новый тэг, типа своего include, а интерпретировать его буду выходным фильтром Smarty.

Тоже не идеальное решение, но уже почти на грани корректного :)

Вообще, Smarty весьма мощная система. Жаль только, что разработчики его с Фортом знакомы не были, его синтаксис во вставках был бы куда мощнее при высокой производительности.
 
Сверху