A
A
alysenko2016-08-09 13:12:23
Yii
alysenko, 2016-08-09 13:12:23

How to add an attribute to a Yii model?

The situation on Yii (version 1).
There is a table "Products" in the database. The product has fields:

'promo' => 'Акционный',
'status_new' => 'Новинка',
'status_ends' => 'Заканчивается',
'status_leader' => 'Лидер продаж',
'status_shop_select' => 'Выбор магазина',
'status_super_price' => 'Супер цена',

Each field can have a value of 1 or 0.
The form has a field in which the status is selected:
<?php echo $form->dropDownList($model, 'promo_status',
 array(
'promo' => 'Акционный',
'status_new' => 'Новинка',
'status_ends' => 'Заканчивается',
'status_leader' => 'Лидер продаж',
'status_shop_select' => 'Выбор магазина',
'status_super_price' => 'Супер цена',
),
 array('empty' => 'Выберите статус')
);?>

The $promo_status variable has been added to the model , which we get from the form and use the filters in the rules to write the appropriate values ​​into the required fields:
public function rules()
  {
    return array(
                      ...
      array('promo_status', 'safe'),
      array('status_new', 'filter', 'filter'=> function (){ return ($this->promo_status == 'status_new') ? 1 : 0; }),
      array('promo', 'filter', 'filter'=> function (){ return ($this->promo_status == 'promo') ? 1 : 0; }),
      array('status_ends', 'filter', 'filter'=> function (){ return ($this->promo_status == 'status_ends') ? 1 : 0; }),
      array('status_leader', 'filter', 'filter'=> function (){ return ($this->promo_status == 'status_leader') ? 1 : 0; }),
      array('status_shop_select', 'filter', 'filter'=> function (){ return ($this->promo_status == 'status_shop_select') ? 1 : 0; }),
      array('status_super_price', 'filter', 'filter'=> function (){ return ($this->promo_status == 'status_super_price') ? 1 : 0; }),
    );
  }

The problem is as follows: when updating a product, values ​​from the database are pulled into the form, except for the promo_status field , since there is no such field in the database. How to make the promo_status field by default receive the status value? For example, if the status in the database is 'status_new' , then when updating the product, the value in the promo_status field is also automatically set to 'status_new' , that is, so that it is not empty.

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Максим Тимофеев, 2016-08-09
@alysenko

В afterFind написать логику присвоения

T
ThunderCat, 2016-08-09
@ThunderCat

1) нехорошо смешивать названия ключей и массивы данных по именам, поле promo_status и переменная $promo_status, кроме того что переменная не по пср, так еще и путаемся в названиях и домавляем себе и другим батхерта.
2) Поле promo_status в таблице отсутствует, делаем вывод что это костылик, а раз пошли в разнос - на отрубленной голове по волосам не плачут. Фигачь костыль для тупого копирования: либо метод который будет делать это доп поле, и его в любой момент можно закоментить или отрефакторить, либо в тот же филтер еще одну строчку кода. Пометить как туду и убрать этот фикалоход в ближайшем будущем.
PS: Максим Тимофеев вот дело говрит, сразу в afterFind засунуть.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question