вторник, 3 января 2012 г.

Yii Хелпер (helpers)

Хелперы в Yii это такие вспомогательные пользовательские функции, которые могут вызываться из любых мест программы и выполнять какие либо простые преобразования. В моем случае хелпер будет форматировать цену, то есть приобразовывать число в форматированную строку. Отделять тысячи пробелом, если «копеек» нету – рисовать прочерк, подставлять символ волюты и тому подобное. В таблице 1 показано, в каком виде я хочу показывать цены на сайте в зависимости от того, что представляет собой цена.



Хелпер создается так: в каталоге Z:\home\catalog.loc\www\protected создаем папку helpers затем создаем в ней файл, например Z:\home\catalog.loc\www\protected\helpers\Cprise.php

Вот то, что находится в этом файле:

<?php
class CPrise
{
 /**
 * Get money in specific format 1234 = 1 234
 * —static
 * —param $price money number
 * —return string money in specific format
 * Yii::app()->params[Yii::app()->params['region']]
        * - currensy symbol definded in 
 *  main.php
 */
 public static function GetMoneyFormat($price)
 { 
  if ($price<>'0')
  {
   if ((int)$price == $price) // return 1 256,- {corrency symbol}
   {
    return number_format( (int)$price, 0, ',', ' ' ).'.-'.
Yii::app()->params[Yii::app()->params['region']];
   }
   else // return 1 256,25 {corrency symbol}
   return number_format( (float)$price, 2, ',', ' ' ).
Yii::app()->params[Yii::app()->params['region']]; 
  }
  else
  return FALSE; // $prise = 0 or $prise = null
 }
}

Там, где надо вывести цену я пишу так:
CPrise::GetMoneyFormat(Имя_переменной_где хранится_цена)

Вернее я пишу так:

<?php echo Yii::t('main-ui', 'Prise'); ?>:</b>
<?php 
echo '<div class="oldprise">'.CPrise::GetMoneyFormat(
$data->prise_old).'</div> <div class="prise">'.
CPrise::GetMoneyFormat($data->prise).'</div>';
?>
По порядку:
Вывожу надпись «Цена:» на выбранном пользователем языке (смотри пост про мультиязычность)
Затем вывожу старую цену и за ней новую. Для этого использую стили css

Они добавляюстя в файл Z:\home\catalog.loc\www\css\main.php

.oldprise
{
display: inline;
font: 25px Arials;
text-decoration: line-through;
color: #FF9999;
border-radius:8px; 
-webkit-border-radius:8px; 
-moz-border-radius:15px; 
-khtml-border-radius:20px;
padding:5px;
}
.prise
{
padding: 5px;
border: 1px solid #33CC33;
display: inline;
font: bold 30px Arials;
color: #008000;
border-radius:8px; 
-webkit-border-radius:8px; 
-moz-border-radius:15px; 
-khtml-border-radius:20px;
padding:5px;
}

Теперь цены выделяются и выгрядят красиво.

Чтобы хелпер заработал его надо подключить в файле Z:\home\catalog.loc\www\protected\config\main.php

Надо добавить подгрузку хелперов:

// autoloading model and component classes
 'import'=>array(
  'application.models.*',
  'application.components.*',
  'application.widgets.*',
  'application.modules.*',
  'application.helpers.*',
  'application.modules.staticpage.models.*',
 ),
,

Вот пример кода, когда я вывожу цену при просмотре товара на первой странице. Файл Z:\home\catalog.loc\www\protected\views\assortiment\index.php

$this->widget('zii.widgets.CDetailView', array(
    'data'=>$model,
        'attributes'=>array(
  
        array(
        'label'=>Yii::t('main-ui', 'Name'),
        'type'=>'html',
        'value'=>$model->{name_.Yii::app()->language},
              ),
  'id',
        array(
        'label'=>Yii::t('main-ui', 'Category'),
        'type'=>'raw',
        'value'=>$model->category->{name_.Yii::app()->language},
              ),
  ...
  Другие поля
  ...
     
        array(
        'label'=>Yii::t('main-ui', 'Prise'),
        'type'=>'raw',
        'value'=>'<div class="oldprise">'.
CPrise::GetMoneyFormat($model->prise_old).
'</div> <div class="prise">'.
CPrise::GetMoneyFormat($model->prise).'</div>' ),
)//attributes
)//array
);//widget

Продолжение следует

2 комментария:

  1. Выдержка из документации:

    Поскольку пространства имён не поддерживаются версиями PHP до 5.3.0, рекомендуется, чтобы имена классов были уникальными во избежание конфликта имён с классами сторонних разработчиков. По этой причине все имена классов фреймворка имеют префикс "C".

    http://www.yiiframework.com/doc/guide/1.1/ru/basics.convention

    ОтветитьУдалить
    Ответы
    1. В пользовательских классах префикс "C" использовать неверно

      Удалить