fenom-template / fenom

Template Engine for PHP. Maintainers wanted!
Other
446 stars 108 forks source link

Как результат работы тэга обработать в отдельном шаблоне и вывести результат? #262

Closed DaaGER closed 7 years ago

DaaGER commented 7 years ago

Приветствую.

Создал собственный тэг через addFunction. Вызываю в коде {render_block 'rseo_text'}. Все параметры получаю, вызываю класс, который по этим параметрам что-то делает и возвращает массив. Хочу этот массив отдать в шаблон, который обработается и результат поместиться в шаблон, откуда вызывался тэг. Вот с последней частью проблемы и не знаю, как это сделать. Надеюсь на вашу помощь.

bzick commented 7 years ago

То есть вам надо вызвать метод из шаблона?

bzick commented 7 years ago

или вам надо добвить в шаблон некие данные после вызова {render_block} ?

maxisoft-git commented 7 years ago

насколько я смог понять нужно просто сделать echo полученного шаблона в вашей функции. если правильно я понял:

  1. вы передали из шаблона 1 данные в свою функцию
  2. обработали там и передали в шаблон 2 получили его например через fetch
  3. и нужно его вывести - тогда достаточно просто сделать echo.
DaaGER commented 7 years ago

Мне нужно, чтобы вызывался тэг, а за кулисами происходила логика и возвращался уже обработанный шаблон для этого кода. Своеобразный include, но с прослойкой логики.

Рендерится страница, в зависимости от страницы верстальщик вставляет вызов нужного ему блока. Блок вызывается не всегда и заранее его просчитывать не вижу смысла. Поэтому решил сделать так: где нужно вставляется тэг "рендер блока с таким-то названием" fenom видит вызов тэга рендера блока и вызывает нужный стат.метод в методе идет какая-то логика, её результаты передаются в fenom в нужный для этого блока шаблон результат помещается в страницу откуда вызывался тэг

Надеюсь смог объяснить чего я хочу.

DaaGER commented 7 years ago

@maxicms проблемы как раз со вторым шагом. Создавать новый экземпляр fenom, чтобы обработать шаблон тэга не хочу. Вот и интересуюсь, возможно ли это сделать без этого. Среди переданных параметров в мой метод, вижу что Fenom передал еще и Fenom\Template, но не могу с ним совладать.

bzick commented 7 years ago

Попробуйте вариант с макросом. Создайте шаблон для макросов, например blocks.tpl и объявите там нужные вам макросы:

{macro block($name)}
{* получаете данные из метода SomeNS\MyClass::method() *}
{set $data = $.call.SomeNS.MyClass::method($name)} 
{* вызываете нужный вам шаблон*}
{$.fetch("$name.tpl", $data)} 
{/macro} 

Далее где вам нужно расставить блоки импортируйте шаблон с маросами и используйте макрос:

{import 'blocks.tpl' as render}

{render.block 'rseo_text'}

Как бонус вы можете создать кучу макросов на все случаи жизни.

А вообще это все похоже на наследование шаблонов. Вы рассматривали этот вариант?

DaaGER commented 7 years ago

Спасибо!

Мне хотелось минимальный работы конкретно с файлами шаблонов: одна строчка на "инклуд" и файл с шаблоном, дальше обработчик тэга что-то делает и решает нужно ли вообще что-то рендерить на php, чтобы верстальщик не думал об этом.

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

В целом ваше решение мне подходит.

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