Декораторы. Как делаете вы

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Декораторы. Как делаете вы

Сообщение taral14 »

К примеру у нас есть модель Product

Код: Выделить всё

 * @product integer $id
 * @product string $name
 * @product float $price
 * @product string $description
В представлении я вывожу

Код: Выделить всё

<?php foreach($products as $product): ?>
<div>
<a href="URL">ID => NAME</a> PRICE <br>
DESCRIPTION
</div>
<?php endforeach; ?>
Вывод URL я реализую так <?php echo $product->url; ?>. А в моделе Product описываю метод Product ::getUrl()
А теперь самое интересное.
ID это просто <?php echo $product->id; ?>
А вот PRICE это отформатированное, переведенное в нужную валюту свойство $product->price; Сейчас я реализую это через статические свойства класса Format. <?php echo Format::price($product->price); ?>. С одной стороны хорошо. Но недостаток что в клиентской части всегда нужно писать <?php echo Format::price($product->price); ?> вместо <?php echo $product->price; ?> ведь нету ситуации где нам будет нужна цена без наценок. Выходит что можно сразу форматировать product->price если он вызывается в клиентской части. Кто то думал по этому поводу?
ort
Сообщения: 17
Зарегистрирован: 2011.04.04, 17:39

Re: Декораторы. Как делаете вы

Сообщение ort »

можно попробовать сделать в моделе метод getPriceFormat() либо в getPrice($bFormat=false) добавить параметр
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: Декораторы. Как делаете вы

Сообщение taral14 »

Большое спасибо за ответ. Неужели никого больше не волновала эта тема? И других вариантов решения кроме как предоставленные мной и ort нету?
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: Декораторы. Как делаете вы

Сообщение Johnatan »

Я всем свойствам, которые выводятся пользователю и требуют перевода/форматирования/изменения ещё при создании модели, создаю геттеры (getPrice, getAmount, getDescription и т.д.)
Это как бы стандарт программирования. В последнее время я стал считать, что вывод свойств через $item->property это дурной тон. Свойство всегда должно выводиться через геттер, то есть $item->getProperty().
Собственно вот.
Конференция: yii@conference.jabber.ru
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Декораторы. Как делаете вы

Сообщение rak »

а что если понадобится вывести без форматирования?
Nihisil
Сообщения: 118
Зарегистрирован: 2010.08.05, 06:39

Re: Декораторы. Как делаете вы

Сообщение Nihisil »

ort писал(а):можно попробовать сделать в моделе метод getPriceFormat() либо в getPrice($bFormat=false) добавить параметр
Может делать так? Если не нужно форматирование
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: Декораторы. Как делаете вы

Сообщение rak »

Nihisil писал(а):
ort писал(а):можно попробовать сделать в моделе метод getPriceFormat() либо в getPrice($bFormat=false) добавить параметр
Может делать так? Если не нужно форматирование
Ну по моему форматирование - это как раз более частный случай, поэтому его надо выносить в функцию, а не наоборот. При обращении к свойству модели мы должны получать свойство, а если нам нужно что то сделать с этим свойством - вызываем ф-ю
Johnatan
Сообщения: 167
Зарегистрирован: 2010.10.27, 13:06
Откуда: Reino de España

Re: Декораторы. Как делаете вы

Сообщение Johnatan »

getPrice($bFormat=false) наилучший вариант. Добавить дополнительные аргументы в функцию можно всегда.
Конференция: yii@conference.jabber.ru
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: Декораторы. Как делаете вы

Сообщение taral14 »

Я долго работал с smarty. Очень нравилась идея декораторов реализованных там. {$product->price|price_format} или {$product->created|date_format}
В последнее время я стал считать, что вывод свойств через $item->property это дурной тон. Свойство всегда должно выводиться через геттер, то есть $item->getProperty().
Собственно вот.
Я согласен с вами. Выводить через методы наиболее верно. Но в Yii есть один момент. $item->getProperty() можно вызывать и так $item->property если объект не содержит свойство property.
Основная идея заключалась вот в чем. Для админки не сильно страшно если будет много php кода в шаблонах. А для публичной части сайта код в шаблонах есть смысл делать как можно более простым. Ведь с ним будут работать люди которые не очень хорошо знают php. И им чем меньше закарючек тем лучше. Именно по этому мне нравится вызов методов как свойств $item->property. Пример с $item->formatProperty понравился. Но считаю это усложнением. Ведь у нас четко разделены публичная версия и версия администрирования. В публичной нужно вызывать только отформатированные свойства, в админке в основном не отформатированные. В прочем это лиш мысли. И я еще не решил как лучше делать. Потому меня очень интересуют Ваши мнения. И спасибо что заинтересовались этой темой!
taral14
Сообщения: 236
Зарегистрирован: 2011.02.26, 23:48

Re: Декораторы. Как делаете вы

Сообщение taral14 »

Только что пришла мысль. А что если в местах где нужно получать только декорированные свойства. Вешать Behavior на AR обьект который будет декорировать свойства при выводе. Я не уверен что мысль удачная =) но может что из нее и выплывет в последствии.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Декораторы. Как делаете вы

Сообщение samdark »

Вообще можно применять разные шаблонизаторы для разных частей сайта и в публичной части использовать что-то вроде Smarty.
Ответить