Не всегда получается красиво сохранить приходящие данные в БД, к примеру такая ситуация может возникнуть при сохранении списка в одну ячейку, чтобы было более понятно приведу часть кода представления:
$form->field($model, 'color')->checkboxList(Yii::$app->params['color'], [ 'item' => function($index,$label,$name, $checked, $value){ return Html::checkbox($name, $checked, [ 'value' => $value, 'label' => '<label class="color ' . $label .'" for="' . $value . '"></label>', 'id' => $value ]); } ]);
Здесь мы выводим список чекбоксов в которых предлагаем выбрать нужные цвета, данное представление нам отправит массив отмеченных значений.
а в контроллере у нас уже написано стандартное
if ($model->load(Yii::$app->request->post()) && $model->save()) { ... }
и не хотелось бы убирать красивый и понятный метод загрузки и сохранения модели, притом в БД нам нужно просто сохранить, а потом получить значения (без возможности дальнейшей выборки для фильтрации), в этом случае можно переопределить магические методы __set и __get в нашей модели:
public function __set($name, $value) { if ($name === 'color') { $this->setAttribute('color', serialize($value)); } else { parent::__set($name, $value); } } public function __get($name) { if ($name === 'color') { return unserialize($this->getAttribute('color')); } return parent::__get($name); }
в итоге у нас получится что при сохранении мы присваиваем нашему аттрибуту color сериализованный массив, а при выводе мы преобразовываем сериализованную строку в массив.
не забываем в правилах сделать аттрибут color безопасным
['color', 'safe']comments powered by HyperComments