public function actionModifyPsv() { if (Yii::$app->request->isPost === false || !isset($_POST['id'], $_POST['value'], $_POST['key'])) { throw new BadRequestHttpException(); } if (in_array($_POST['key'], ['dont_filter', 'slug']) === false) { throw new BadRequestHttpException(); } /** @var PropertyStaticValues|null $psv */ $psv = PropertyStaticValues::findOne($_POST['id']); if ($psv === null) { throw new NotFoundHttpException(); } Yii::$app->response->format = Response::FORMAT_JSON; $psv->setAttribute($_POST['key'], $_POST['value']); return $psv->save(); }
/** * @param $id * @throws NotFoundHttpException * @throws \yii\db\Exception */ public function actionGenerate($id) { $post = \Yii::$app->request->post(); if (!isset($post['GeneratePropertyValue'])) { throw new NotFoundHttpException(); } $parent = Product::findById($id, null); if ($parent === null) { throw new NotFoundHttpException(); } $object = Object::getForClass(Product::className()); $catIds = (new Query())->select('category_id')->from([$object->categories_table_name])->where('object_model_id = :id', [':id' => $id])->orderBy(['sort_order' => SORT_ASC, 'id' => SORT_ASC])->column(); if (isset($post['GeneratePropertyValue'])) { $generateValues = $post['GeneratePropertyValue']; $post[HasProperties::FIELD_ADD_PROPERTY_GROUP]['Product'] = $post['PropertyGroup']['id']; } else { $generateValues = []; } $parent->option_generate = Json::encode(['group' => $post['PropertyGroup']['id'], 'values' => $generateValues]); $parent->save(); $postProperty = []; foreach ($post['GeneratePropertyValue'] as $key_property => $values) { $inner = []; foreach ($values as $key_value => $trash) { $inner[] = [$key_property => $key_value]; } $postProperty[] = $inner; } $optionProperty = self::generateOptions($postProperty); foreach ($optionProperty as $option) { /** @var Product|HasProperties $model */ $model = new Product(); $model->load($post); $model->parent_id = $parent->id; $nameAppend = []; $slugAppend = []; $tempPost = []; // @todo something foreach ($option as $optionValue) { foreach ($optionValue as $propertyKey => $propertyValue) { if (!isset($valueModels[$propertyKey])) { $propertyStaticValues = PropertyStaticValues::findOne($propertyValue); $propertyValue = PropertyStaticValues::findById($propertyValue); $key = $propertyStaticValues->property->key; $tempPost[$key] = $propertyValue; } $nameAppend[] = $propertyValue['name']; $slugAppend[] = $propertyValue['id']; } } $model->measure_id = $parent->measure_id; $model->name = $parent->name . ' (' . implode(', ', $nameAppend) . ')'; $model->slug = $parent->slug . '-' . implode('-', $slugAppend); $save_model = $model->save(); $postPropertyKey = 'Properties_Product_' . $model->id; $post[$postPropertyKey] = $tempPost; if ($save_model) { foreach (array_keys($parent->propertyGroups) as $key) { $opg = new ObjectPropertyGroup(); $opg->attributes = ['object_id' => $parent->object->id, 'object_model_id' => $model->id, 'property_group_id' => $key]; $opg->save(); } $model->saveProperties(['Properties_Product_' . $model->id => $parent->abstractModel->attributes]); $model->saveProperties($post); unset($post[$postPropertyKey]); $add = []; foreach ($catIds as $value) { $add[] = [$value, $model->id]; } if (!empty($add)) { Yii::$app->db->createCommand()->batchInsert($object->categories_table_name, ['category_id', 'object_model_id'], $add)->execute(); } $params = $parent->images; if (!empty($params)) { $rows = []; foreach ($params as $param) { $rows[] = [$param['object_id'], $model->id, $param['filename'], $param['image_title'], $param['image_alt'], $param['sort_order']]; } Yii::$app->db->createCommand()->batchInsert(Image::tableName(), ['object_id', 'object_model_id', 'filename', 'image_title', 'image_alt', 'sort_order'], $rows)->execute(); } } } }
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; }
public function actionDeleteStaticValue($id, $property_id, $property_group_id) { $model = PropertyStaticValues::findOne($id); $model->delete(); Yii::$app->session->setFlash('danger', Yii::t('app', 'Object removed')); return $this->redirect(Url::to(['/backend/properties/edit-property', 'id' => $property_id, 'property_group_id' => $property_group_id])); }
/** * renders product item and list. * possible can render all objects, but need for few logic change * @param array $chunkData params for select and render * @param TagDependency $dependency * @return mixed */ private static function renderProducts($chunkData, &$dependency) { $params = ['itemView' => Yii::$app->getModule('shop')->itemView, 'type' => 'show', 'object' => 'product', 'where' => [], 'limit' => 0, 'listView' => Yii::$app->getModule('shop')->listView]; switch ($chunkData['key']) { case 'product': if (ArrayHelper::keyExists('sku', $chunkData)) { $params['where'] = ['sku' => $chunkData['sku']]; } break; case 'productList': $params['type'] = 'list'; break; default: $expression = '%(?P<objectName>[^#]+?)#(?P<objectId>[\\d]+?)$%'; if (preg_match($expression, $chunkData['key'], $matches)) { $params['where']['id'] = $matches['objectId']; } break; } switch ($params['object']) { case 'product': $dependency->tags[] = ActiveRecordHelper::getCommonTag(Product::className()); $query = Product::find(); if (!empty($chunkData['categoryId'])) { $query->leftJoin('{{%product_category}}', Product::tableName() . '.id = {{%product_category}}.object_model_id')->andWhere(['{{%product_category}}.category_id' => $chunkData['categoryId']]); $dependency->tags[] = ActiveRecordHelper::getCommonTag(Category::className()); $dependency->tags[] = ActiveRecordHelper::getObjectTag(Category::className(), $chunkData['categoryId']); } if (!empty($chunkData['property'])) { $expression = '%(?P<propertyKey>[^:]+?):(?P<propertyValue>.+?)$%'; if (preg_match($expression, $chunkData['property'], $matches)) { $property = Property::findOne(['key' => $matches['propertyKey']]); if (!is_null($property)) { /** @var Property $property */ $dependency->tags[] = ActiveRecordHelper::getCommonTag(Property::className()); $dependency->tags[] = $property->objectTag(); if ($property->is_eav == 1) { $query->leftJoin('{{%product_eav}}', Product::tableName() . '.id = {{%product_eav}}.object_model_id')->andWhere(['{{%product_eav}}.key' => $matches['propertyKey'], '{{%product_eav}}.value' => $matches['propertyValue']]); } elseif ($property->has_static_values == 1) { $psv = PropertyStaticValues::findOne(['property_id' => $property->id, 'value' => $matches['propertyValue']]); if (!is_null($psv)) { $dependency->tags[] = ActiveRecordHelper::getCommonTag(PropertyStaticValues::className()); $dependency->tags[] = $psv->objectTag(); $query->leftJoin('{{%object_static_values}}', Product::tableName() . '.id = {{%object_static_values}}.object_model_id')->andWhere(['object_id' => 3, '{{%object_static_values}}.property_static_value_id' => $psv->id]); } else { return ''; } } /** @todo add column_stored */ } else { return ''; } } } break; default: $query = Product::find(); break; } $params = ArrayHelper::merge($params, array_intersect_key($chunkData, $params)); if (!empty($params['where'])) { $query->andWhere($params['where']); } if (!empty($params['limit'])) { $query->limit($params['limit']); } if ($params['type'] === 'list') { $view = $params['listView']; $objects = $query->all(); foreach ($objects as $object) { $dependency->tags[] = $object->objectTag(); } switch ($params['object']) { case 'product': $viewParams = ['products' => $objects]; break; default: $viewParams = ['products' => $objects]; break; } } else { $view = $params['itemView']; $object = $query->one(); if (is_null($object)) { return ''; } $dependency->tags[] = $object->objectTag(); switch ($params['object']) { case 'product': $viewParams = ['product' => $object, 'url' => Url::to(['@product', 'model' => $object, 'category_group_id' => $object->getMainCategory()->category_group_id])]; break; default: $viewParams = ['product' => $object, 'url' => Url::to(['@product', 'model' => $object, 'category_group_id' => $object->getMainCategory()->category_group_id])]; break; } } return Yii::$app->view->render($view, $viewParams); }
public function actionDeleteStaticValue($id, $property_id, $property_group_id) { /** @var PropertyStaticValues $model */ $model = PropertyStaticValues::findOne($id); if (is_null($model)) { throw new NotFoundHttpException(); } $model->delete(); Yii::$app->session->setFlash('danger', Yii::t('app', 'Object removed')); return $this->redirect(Url::to(['/backend/properties/edit-property', 'id' => $property_id, 'property_group_id' => $property_group_id])); }