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).
Другие вопросы по тегам