передача экземпляра класса в 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);
 
Коллега считает, что это вкорне неверный путь, и нужно формировать данные в контроллере или в модели, а в шаблон передавать уже сформированный код..
Я согласен с вашим коллегой.
 
но ведь если подумать это не очень удобно. Чтобы добавить систему комментариев к какому либо объекту нам нужно редактировать 1. модель, или контроллер 2. Шаблон.
в моем случаем мы к контроллере только инициализувуем класс комментариев (редктированое на строне php сводится к минимуму), и остается только вывести комментарии в шаблоне.
Опять же если захотели убрать комментарии - просто убираем их из шаблона, и не трогаем модель. (В первом случаем тоже можно модель не трогать, или забыть про нее. Ничего страшного не случиться, но получается будет производиться лишняя работ...)
 
ваш вариант называется хелпер и вполне приемлимый. хотя, желательно чтобы для оформления комментария тоже был отдельный шаблон.
 
ваш вариант называется хелпер и вполне приемлимый. хотя, желательно чтобы для оформления комментария тоже был отдельный шаблон.
Ну вообщето да, у меня шаблон формируется отдельно... То есть $comment->fillTemplate($id) - и отдает сформированный шаблон..
но вообще можно у меня сделать и так $comment->getComments($id) - тут мы уже получим массив с комментариями, и сами будем из формировать как захотим...
Хэлпер значит.. хм.. возможно.. Я сейчас параллельно работаю с SocialEngine - там zend Framework и хэлперы как раз используются, но я думал хэлпер это как бы компонент конкретного модуля, и предназанчен для использования только в нем.. Мои комментарии более глобальные чтоли, их поидее в нашем движке можно к чему угодно подцепить (блогам, новостям и т.п.) Вопрос только в интерфейсе подключения... в итоге пока остались каждый при своем, я в свои модулях подключаю по своему, коллега по своему.. Это не гуд конечно, ну посмотрим...
 
razerxxx
твой вариант экономически оправданнее, это главное ;)
 
Экономически выгодно в случае, когда проектом занимается только ТС, и только пока не надо вносить изменения.
Когда шаблон только выводит данные, проблем с их отсутствием не бывает.
Но когда в части системы $id внезапно станет null при том, что fillTemplate($id) ждет int, нарисуется картина Репина "Приплыли" Соловьева "не туда заехали", и будет много часов грустных раздумий, как же в разных местах выводить по-разному.

Тут или делаем полноценный хелпер со своей личной моделью Comments, шаблонами для отрисовки и контроллером-фабрикой, и пишем CommentsHelper::drawComments($params),
или оставляем логику в контроллере, а подготовку данных - в модели.
Иначе легко отстрелить ногу и работать только на костылях.
 
А че, в этом вашем смарти до сих пор нет макросов? Ну типа как вот тут?
Ну в явном виде вроде нет, хотя причем тут макросы?
А вообще мы делаем так
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) - думаю в смарти так же можно, хотя возможно я ошибаюсь...
 
Тут или делаем полноценный хелпер со своей личной моделью Comments, шаблонами для отрисовки и контроллером-фабрикой, и пишем CommentsHelper::drawComments($params).
Хм.. ну у меня получается хэлпер и есть.. Своя модель, свой контроллер и шаблон для отрисовки...(ну разве что фабрику не использую - плохо еще знаком с данным шаблоном проектирования)...
 
>> причем тут макросы?

потому что хелперы (то есть код генерирующий 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() }}
 
то есть получается мы отдаем в шаблонизатор компонент класса, но этот компонент возвращает не скомпилированный шаблон а массив данных.
в шаблоне мы подключаем подшаблон компонента и передаем ему наш экземпляр.
 
прям как в yii
хотя, там вместо "макросов" нативный PHP, но по сути так
 
прям как в yii
хотя, там вместо "макросов" нативный PHP, но по сути так
Вообще нравится yii - хотя я его не столь хорошо знаю. Не приходилось использовать на серьезных проектах, потому и вглубь сильно не залазил. Но думаю если сменю место работы то буду искать проект на yii.
 
Сверху