передача экземпляра класса в Smarty

razerxxx

Новичок
Возникли тут разногласия с коллегой.
Ситуация такая. Имеется класс комментариев. У класса есть метод fillTemplate($object_id) - который отдает готовый скомпилированный шаблон(список комментариев плюс форма добавления и пагинация).
Я вызываю его так: в контроллере в шаблон передаю экземпляр класса
PHP:
$output['comments']= new Comments();
в шаблоне вызываю
PHP:
{$comments->fillTemplate($object_id)}
, где object_id - привязка комментариев к объекту.
Коллега считает, что это вкорне неверный путь, и нужно формировать данные в контроллере или в модели, а в шаблон передавать уже сформированный код..
т. е. например если данные сформированы в модели то вывод бы производился так:
PHP:
{$object.title}
{$object.description}
...
{$object.comments} //используется _toString();
- то есть данные уже полученны на строне модели примерно так:
PHP:
$object['comments'] = new Comments($object['id']);
В моем случае, как я считаю, структура получается более гибкой, модель объекта ничего не знает о комментариях, комментариями полностью занимается отдельный класс. Минус же подхода, в том что у нас проникает логика в представление, в чем собственно у нас и спор.
Подобный подход, как я понял используется в LiveStreet - занимался версткой для него шаблона, и там это увидел. Мне показалось это довольно удобным. При верстке не надо лезть в php если нужно получить например картинку пользователя. Там это было примерно так $user->getUserAvatar(100);
 

shelestov

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

razerxxx

Новичок
но ведь если подумать это не очень удобно. Чтобы добавить систему комментариев к какому либо объекту нам нужно редактировать 1. модель, или контроллер 2. Шаблон.
в моем случаем мы к контроллере только инициализувуем класс комментариев (редктированое на строне php сводится к минимуму), и остается только вывести комментарии в шаблоне.
Опять же если захотели убрать комментарии - просто убираем их из шаблона, и не трогаем модель. (В первом случаем тоже можно модель не трогать, или забыть про нее. Ничего страшного не случиться, но получается будет производиться лишняя работ...)
 

AmdY

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

razerxxx

Новичок
ваш вариант называется хелпер и вполне приемлимый. хотя, желательно чтобы для оформления комментария тоже был отдельный шаблон.
Ну вообщето да, у меня шаблон формируется отдельно... То есть $comment->fillTemplate($id) - и отдает сформированный шаблон..
но вообще можно у меня сделать и так $comment->getComments($id) - тут мы уже получим массив с комментариями, и сами будем из формировать как захотим...
Хэлпер значит.. хм.. возможно.. Я сейчас параллельно работаю с SocialEngine - там zend Framework и хэлперы как раз используются, но я думал хэлпер это как бы компонент конкретного модуля, и предназанчен для использования только в нем.. Мои комментарии более глобальные чтоли, их поидее в нашем движке можно к чему угодно подцепить (блогам, новостям и т.п.) Вопрос только в интерфейсе подключения... в итоге пока остались каждый при своем, я в свои модулях подключаю по своему, коллега по своему.. Это не гуд конечно, ну посмотрим...
 

AmdY

Пью пиво
Команда форума
razerxxx
твой вариант экономически оправданнее, это главное ;)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Экономически выгодно в случае, когда проектом занимается только ТС, и только пока не надо вносить изменения.
Когда шаблон только выводит данные, проблем с их отсутствием не бывает.
Но когда в части системы $id внезапно станет null при том, что fillTemplate($id) ждет int, нарисуется картина Репина "Приплыли" Соловьева "не туда заехали", и будет много часов грустных раздумий, как же в разных местах выводить по-разному.

Тут или делаем полноценный хелпер со своей личной моделью Comments, шаблонами для отрисовки и контроллером-фабрикой, и пишем CommentsHelper::drawComments($params),
или оставляем логику в контроллере, а подготовку данных - в модели.
Иначе легко отстрелить ногу и работать только на костылях.
 

razerxxx

Новичок
А че, в этом вашем смарти до сих пор нет макросов? Ну типа как вот тут?
Ну в явном виде вроде нет, хотя причем тут макросы?
А вообще мы делаем так
PHP:
{include (file="path_to_file/file.tpl" var1='some_value1' var2='some_value2')}
а в file.tpl пишется
PHP:
{*
* $var1 - description1
* $var2 - description2
*}
<div>{$var1} {$var2}</div>
вобщем примено тоже самое получается...
И да, мы пользуемся вообщето Dwoo (dwoo.org) - думаю в смарти так же можно, хотя возможно я ошибаюсь...
 

razerxxx

Новичок
Тут или делаем полноценный хелпер со своей личной моделью Comments, шаблонами для отрисовки и контроллером-фабрикой, и пишем CommentsHelper::drawComments($params).
Хм.. ну у меня получается хэлпер и есть.. Своя модель, свой контроллер и шаблон для отрисовки...(ну разве что фабрику не использую - плохо еще знаком с данным шаблоном проектирования)...
 

fixxxer

К.О.
Партнер клуба
>> причем тут макросы?

потому что хелперы (то есть код генерирующий html) это говно, хак и изврат.

аналогичную конструкцию очень удобно представлять так.

Пусть есть компонент, который надо рендерить куда-то там. Какой-то FooComponent. Ну пусть для определенности это будет форма.

PHP:
$Component = new FormComponent(......); // умеет рендерить себя, ну пусть в виде отдачи массива
$Template->bind('form', $Component);
$Template->renderTo($Response);
Пусть, чтобы не выпендриваться, в шаблон при этом уходит массив
PHP:
array(
    'form' => array(
         // то, во что отрендерился FormComponent
    )
)
Для FooComponent мы имеем набор макросов, ну например если Foo == Form, то пусть есть macros/form.tpl
Код:
{% macro input(element) %}
    <input type="{{ element.type|default('text') }}" name="{{ element.name }}" value="{{ element.value|e }}" size="{{ element.size|default(20) }}" />
{% endmacro %}
{# и т.д. #}
итд.

В шаблоне же делаем как-то так
Код:
{% import "macros/forms.tpl" as Form %}
{{ Form.begin(form) }}
Username: {{ Form.input(form.username) }}
Password: {{ Form.password(form.password) }}
{{ Form.end() }}
 

razerxxx

Новичок
то есть получается мы отдаем в шаблонизатор компонент класса, но этот компонент возвращает не скомпилированный шаблон а массив данных.
в шаблоне мы подключаем подшаблон компонента и передаем ему наш экземпляр.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
прям как в yii
хотя, там вместо "макросов" нативный PHP, но по сути так
 

razerxxx

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