mirocow\eav\admin\controllers\AjaxController::actionSave PHP Метод

actionSave() публичный Метод

public actionSave ( )
    public function actionSave()
    {
        if (Yii::$app->request->isPost) {
            $post = Yii::$app->request->post();
            if ($post['payload'] && $post['entityModel']) {
                $payload = Json::decode($post['payload']);
                if (!isset($payload['fields'])) {
                    return;
                }
                $transaction = \Yii::$app->db->beginTransaction();
                try {
                    $categoryId = isset($post['categoryId']) ? $post['categoryId'] : 0;
                    $entityId = EavEntity::find()->select(['id'])->where(['entityModel' => $post['entityModel'], 'categoryId' => $categoryId])->scalar();
                    if (!$entityId) {
                        $entity = new EavEntity();
                        $entity->entityName = isset($post['entityName']) ? $post['entityName'] : 'Untitled';
                        $entity->entityModel = $post['entityModel'];
                        $entity->categoryId = $categoryId;
                        $entity->save(false);
                        $entityId = $entity->id;
                    }
                    $attributes = [];
                    foreach ($payload['fields'] as $order => $field) {
                        if (!isset($field['cid'])) {
                            continue;
                        }
                        // Attribute
                        if (isset($field['cid'])) {
                            $attribute = EavAttribute::findOne(['name' => $field['cid'], 'entityId' => $entityId]);
                        }
                        if (empty($attribute)) {
                            $attribute = new EavAttribute();
                            $lastId = EavAttribute::find()->select(['id'])->orderBy(['id' => SORT_DESC])->limit(1)->scalar() + 1;
                            $attribute->name = 'c' . $lastId;
                        }
                        $attribute->type = $field['group_name'];
                        $attribute->entityId = $entityId;
                        $attribute->typeId = EavAttributeType::find()->select(['id'])->where(['name' => $field['field_type']])->scalar();
                        $attribute->label = $field['label'];
                        $attribute->order = $order;
                        if (isset($field['field_options']['description'])) {
                            $attribute->description = $field['field_options']['description'];
                            unset($field['field_options']['description']);
                        } else {
                            $attribute->description = '';
                        }
                        $attribute->save(false);
                        $attributes[] = $attribute->id;
                        if (isset($field['field_options']['options'])) {
                            $options = [];
                            foreach ($field['field_options']['options'] as $k => $o) {
                                $option = EavAttributeOption::find()->where(['attributeId' => $attribute->id, 'value' => $o['label']])->one();
                                if (!$option) {
                                    $option = new EavAttributeOption();
                                }
                                $option->attributeId = $attribute->id;
                                $option->value = $o['label'];
                                $option->defaultOptionId = (int) $o['checked'];
                                $option->order = $k;
                                $option->save();
                                $options[] = $option->value;
                            }
                            EavAttributeOption::deleteAll(['and', ['attributeId' => $attribute->id], ['NOT', ['IN', 'value', $options]]]);
                            unset($field['field_options']['options']);
                        }
                        // Rule
                        $rule = EavAttributeRule::find()->where(['attributeId' => $attribute->id])->one();
                        if (!$rule) {
                            $rule = new EavAttributeRule();
                        }
                        $rule->attributeId = $attribute->id;
                        if (!empty($field['field_options'])) {
                            foreach ($field['field_options'] as $key => $param) {
                                $rule->{$key} = $param;
                            }
                        }
                        $rule->required = isset($field['field_options']['required']) ? (int) $field['field_options']['required'] : 0;
                        $rule->visible = isset($field['field_options']['visible']) ? (int) $field['field_options']['visible'] : 0;
                        $rule->locked = isset($field['field_options']['locked']) ? (int) $field['field_options']['locked'] : 0;
                        $rule->save();
                    }
                    $attrArray = EavAttribute::find()->select('id')->where(['AND', ['NOT IN', 'id', $attributes], ['IN', 'entityId', $entityId]])->asArray()->all();
                    if (!is_null($attrArray)) {
                        EavAttribute::deleteAll(['IN', 'id', $attrArray]);
                        EavAttributeValue::deleteAll(['IN', 'attributeId', $attrArray]);
                        EavAttributeOption::deleteAll(['IN', 'attributeId', $attrArray]);
                        EavAttributeRule::deleteAll(['IN', 'attributeId', $attrArray]);
                    }
                    $transaction->commit();
                } catch (\Exception $e) {
                    $transaction->rollBack();
                    throw $e;
                }
            }
        }
    }