2015-09-22 2 views
1

У меня есть модель «Продукт», которую я хотел бы изменить или «мутировать» один из его атрибутов, но только в определенных случаях.Yii2 Поведение/сценарии Изменение атрибута

Я хранил атрибут, Цена как целое число. Таким образом, 1,99 доллара хранится как 199.

Я хотел бы включить это с activeForm таким образом, чтобы при получении цены он конвертировался в «1.99» в поле (визуально). Но когда я отправляю форму, перед ее проверкой она изменяет цену от «1.99» до «199».

Я предполагаю, что для этого потребуется поведение Behaviors и, в частности, привязка поведения к модели перед созданием активной формы. Тем не менее, я все еще путаюсь, как это сделать. Я вижу, что есть класс AttributeBehavior, или я могу создать свой собственный класс Behavior, но у меня возникли проблемы с выяснением реализации в этом случае.

Ситуация:

foreach ($store_item->storeProducts as $i=>$product) { 
?> 
<tr> 
    <td> 
     <?= $form->field($product, '['.$i.']price')->label(false); ?> 
    </td> 
</tr> 
<?php 
    $i++; 
    } 
?> 
+0

Вы можете использовать модельное событие ** beforeValidate() ** для хранения $ 1.99 как 199, и при получении результатов вы можете использовать ** afterFind() ** для получения от 199 до 1.99 –

+3

Есть ли конкретная причина, по которой база данных Поле имеет тип 'int' вместо' decimal'? – topher

+2

Вы можете просто использовать getter/setter – soju

ответ

1

Вот сценарий, в котором я проверяю для пустого атрибута и присвоить значение перед сохранением. Примечание owner возвращает модель, чтобы вы могли получить доступ к атрибутам и функциям модели, которые являются общедоступными. Дайте мне знать, если я смогу объяснить что-нибудь еще

public function behaviors() 
{ 
    return [ 
     [ 
      'class' => AttributeBehavior::className(), 
      'attributes' => [ 
       ActiveRecord::EVENT_BEFORE_INSERT => 'yourAttrib', 
      ], 
      'value' => function ($event) { 
       $code = "N/A"; 
       if(!empty($this->owner->yourAttrib)) 
       { 
        $code = $this->owner->yourAttrib; //here change your attribute accordingly 
       } 
       return $code; 
      }, 
     ], 
     //other behaviors 
    ]; 
} 
1

Вы можете просто использовать геттер/сеттер, например. :

public function getRealPrice() 
{ 
    return $this->price/100; 
} 

public function setRealPrice($value) 
{ 
    $this->price = $value*100; 
} 

И не забудьте:

  • добавить realPrice в правилах Вашей модели,
  • использование realPrice в вашей форме (вместо price).
Смежные вопросы