protected function createProduct($item = [], $createNotExists = true) { if (empty($item) || !isset($item[static::ELEMENT_ID]) || !isset($item[static::ELEMENT_NAIMENOVANIE])) { return false; } $guid = CommercemlGuid::findOne(['guid' => $item[static::ELEMENT_ID], 'type' => 'PRODUCT']); if (empty($guid) && $createNotExists) { $category = !empty($item['categories']) ? array_shift($item['categories']) : null; $product = new Product(); $product->name = $product->title = $product->h1 = $item[static::ELEMENT_NAIMENOVANIE]; $product->slug = Helper::createSlug($product->name); $product->main_category_id = isset($this->categoryCache[$category]) ? $this->categoryCache[$category] : $this->rootCategoryCache; $product->content = empty($item[static::ELEMENT_OPISANIE]) ? '' : $item[static::ELEMENT_OPISANIE]; if ($product->validate() && $product->save()) { $product->refresh(); $product->linkToCategory($this->rootCategoryCache); $guid = new CommercemlGuid(); $guid->guid = $item[static::ELEMENT_ID]; $guid->name = $item[static::ELEMENT_NAIMENOVANIE]; $guid->model_id = $product->id; $guid->type = 'PRODUCT'; $guid->save(); return true; } } if (!empty($guid)) { /** @var Product $product */ $product = isset($product) ? $product : $guid->product; if (!empty($product)) { $product->price = empty($item['price']) ?: array_shift($item['price']); $product->content = empty($item[static::ELEMENT_OPISANIE]) ?: $item[static::ELEMENT_OPISANIE]; $product->name = empty($item[static::ELEMENT_NAIMENOVANIE]) ?: $item[static::ELEMENT_NAIMENOVANIE]; if (!empty($item['properties'])) { AbstractPropertyEavModel::setTableName($this->objectProduct->eav_table_name); $product_eav = array_reduce(AbstractPropertyEavModel::findByModelId($product->id), function ($result, $item) { $key = $item->property_group_id . ':' . $item->key; $result[$key] = $item; return $result; }, []); $product_groups = array_reduce(ObjectPropertyGroup::getForModel($product), function ($result, $item) { $result[] = $item->property_group_id; return $result; }, []); $product_osv = array_reduce(ObjectStaticValues::findAll(['object_id' => $this->objectProduct->id, 'object_model_id' => $product->id]), function ($result, $item) { $result[] = $item->property_static_value_id; return $result; }, []); foreach ($item['properties'] as $key => $value) { if (isset(static::$propertiesCache[$key])) { /** @var Property $prop */ $prop = static::$propertiesCache[$key]; if (!in_array($prop->property_group_id, $product_groups)) { $objectGroup = new ObjectPropertyGroup(); $objectGroup->object_id = $this->objectProduct->id; $objectGroup->object_model_id = $product->id; $objectGroup->property_group_id = $prop->property_group_id; $objectGroup->save(); } if ($prop->has_static_values) { $psv = PropertyStaticValues::findOne(['value' => $value]); if (empty($psv)) { $psv = new PropertyStaticValues(); $psv->name = $psv->value = $value; $psv->property_id = $prop->id; $psv->slug = Helper::createSlug($value); if ($psv->validate() && $psv->save()) { $psv->refresh(); } else { $psv = null; } } if (!empty($psv) && !in_array($psv->id, $product_osv)) { $osv = new ObjectStaticValues(); $osv->object_id = $this->objectProduct->id; $osv->object_model_id = $product->id; $osv->property_static_value_id = $psv->id; $osv->save(); } } elseif ($prop->is_eav) { $_key = $prop->property_group_id . ':' . $prop->key; if (isset($product_eav[$_key])) { /** @var AbstractPropertyEavModel $eav */ $eav = $product_eav[$_key]; $eav->value = $value; $eav->save(); } else { $eav = new AbstractPropertyEavModel(); $eav->object_model_id = $product->id; $eav->property_group_id = $prop->property_group_id; $eav->key = $prop->key; $eav->value = $value; $eav->save(); } } } } } $product->save(); return true; } } return false; }
/** * @param array $params * @return string */ public function actionUpload($params = []) { $result = []; /** @var \app\models\Property $property */ $property = $params['property']; /** @var \yii\db\ActiveRecord $modelObject */ $modelObject = new $params['model_name'](); $modelId = $params['model_id']; /** @var \app\models\Object $object */ $object = $params['object_id']; $formProperties = 'Properties_' . $modelObject->formName() . '_' . $modelId; $modelEav = new AbstractPropertyEavModel(); $modelEav::setTableName($object->eav_table_name); $modelEav->property_group_id = $property->property_group_id; $modelEav->key = $property->key; $modelEav->object_model_id = $modelId; $files = UploadedFile::getInstancesByName($formProperties . '[' . $property->key . ']'); foreach ($files as $file) { $fileName = $file->baseName . '.' . $file->extension; if (is_file($this->uploadDir . DIRECTORY_SEPARATOR . $fileName)) { $fileName = $file->baseName . substr(md5($fileName . microtime()), 0, 6) . '.' . $file->extension; } if ($file->saveAs($this->uploadDir . DIRECTORY_SEPARATOR . $fileName)) { $modelEav->isNewRecord = true; $modelEav->value = $fileName; $modelEav->save(); } } AbstractPropertyEavModel::setTableName(null); \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; return $result; }