Не всегда получается красиво сохранить приходящие данные в БД, к примеру такая ситуация может возникнуть при сохранении списка в одну ячейку, чтобы было более понятно приведу часть кода представления:
$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