public function afterSave() { if ($this->type == Attribute::TYPE_DROPDOWN) { // список новых значений опций атрибута, не пустые, без лишних пробелов по бокам, уникальные $newOptions = array_unique(array_filter(array_map('trim', explode("\n", $this->rawOptions)))); // в нижнем регистре, чтобы не надо было переназначать привязку атрибутов в товарах $newOptionsLower = array_map(function ($x) { return mb_strtolower($x, 'utf-8'); }, $newOptions); $oldOptionsLower = []; // список имен опций, которые уже сохранены // удалим те из них, которых нет, в остальных обновим значение и позицию foreach ((array) $this->options as $option) { /* @var $option AttributeOption */ $position = array_search(mb_strtolower($option->value), $newOptionsLower); // опция была удалена if ($position === false) { $option->delete(); } else { $oldOptionsLower[] = mb_strtolower($option->value, 'utf-8'); $option->value = $newOptions[$position]; // если поменяли регистр опции $option->position = $position; $option->save(); } } // добавим оставшиеся foreach (array_diff($newOptionsLower, $oldOptionsLower) as $position => $value) { $option = new AttributeOption(); $option->attribute_id = $this->id; $option->value = $newOptions[$position]; $option->position = $position; $option->save(); } } parent::afterSave(); }
/** * @param $id * @throws CHttpException */ public function actionAddOption($id) { if (Yii::app()->getRequest()->getIsPostRequest()) { $model = $this->loadModel($id); $option = new AttributeOption(); $option->setAttributes(['value' => Yii::app()->getRequest()->getPost('value'), 'attribute_id' => $model->id]); if (true === $option->save()) { Yii::app()->ajax->success(); } Yii::app()->ajax->failure(); } else { throw new CHttpException(400, Yii::t('StoreModule.store', 'Bad request. Please don\'t use similar requests anymore')); } }
public function afterSave() { // удаляем старые значения AttributeOption::model()->deleteAllByAttributes(['attribute_id' => $this->id]); if (in_array($this->type, [Attribute::TYPE_DROPDOWN])) { $newOptions = explode("\n", $this->rawOptions); $newOptions = array_filter($newOptions, function ($x) { return strlen(trim($x)); }); foreach (array_values((array) $newOptions) as $key => $op) { $option = new AttributeOption(); $option->attribute_id = $this->id; $option->value = trim($op); $option->position = $key; $option->save(); } } parent::afterSave(); }
/** * @param array $attributes * @return bool * @throws CDbException */ public function setMultipleValuesAttributes(array $attributes) { if (!$this->isMultipleValues()) { return true; } $transaction = Yii::app()->getDb()->beginTransaction(); try { foreach ($attributes as $attribute) { $model = new AttributeOption(); $model->setAttributes(['attribute_id' => $this->id, 'value' => trim($attribute)]); if (false === $model->save()) { throw new CDbException(); } } $transaction->commit(); return true; } catch (Exception $e) { $transaction->rollback(); return false; } }
public function addOption($spec, $attr) { $options = AttributeOption::model()->findAllByAttributes(['attribute_id' => $attr->id]); $list = CHtml::listData($options, 'position', 'value'); if (!in_array($spec['value'], $list)) { end($list); $key = key($list); $option = new AttributeOption(); $option->attribute_id = $attr->id; $option->position = $key + 1; $option->value = $spec['value']; $option->save(); if (!$option->save()) { echo "\n"; echo "Error: save AttributeOption for id_product = {$spec['id_product']} \n"; echo "\n"; } } }