Yii2 Поведения / Сценарии Изменение атрибута
У меня есть модель "Продукт", для которой я хотел бы изменить или "изменить" один из ее атрибутов, но только в определенных случаях.
Я храню атрибут, цена как целое число. Таким образом, $1,99 сохраняется как 199.
Я хотел бы включить это в activeForm таким образом, чтобы при получении цены он конвертировался в поле на "1,99" (визуально). Но когда я отправляю форму, перед проверкой она изменяет цену с "1,99" до "199".
Я предполагаю, что для этого потребуется поведение и конкретное присоединение поведения к модели перед созданием активной формы. Тем не менее, я все еще не понимаю, как это настроить. Я вижу, что есть класс AttributeBehavior, или я могу создать свой собственный класс Behavior, но у меня были проблемы с выяснением реализации в этом случае.
Ситуация:
foreach ($store_item->storeProducts as $i=>$product) {
?>
<tr>
<td>
<?= $form->field($product, '['.$i.']price')->label(false); ?>
</td>
</tr>
<?php
$i++;
}
?>
2 ответа
Вот сценарий, в котором я проверяю пустой атрибут и присваиваю значение перед сохранением. Владелец заметки возвращает модель, чтобы вы могли получить доступ к атрибутам и функциям модели, которые являются общими. Дайте мне знать, если я могу объяснить что-нибудь дальше
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
];
}
Вы можете просто использовать метод получения / установки, например:
public function getRealPrice()
{
return $this->price/100;
}
public function setRealPrice($value)
{
$this->price = $value*100;
}
И не забудьте:
- добавлять
realPrice
в правилах вашей модели, - использование
realPrice
в вашей форме (вместоprice
).