Compare View
Commits (2)
Showing
16 changed files
Show diff stats
backend/views/layouts/main-sidebar.php
@@ -45,10 +45,20 @@ use yii\widgets\Menu; | @@ -45,10 +45,20 @@ use yii\widgets\Menu; | ||
45 | 'options' => ['class'=>\Yii::$app->user->can('product') ? '' :'hide'], | 45 | 'options' => ['class'=>\Yii::$app->user->can('product') ? '' :'hide'], |
46 | ], | 46 | ], |
47 | [ | 47 | [ |
48 | + 'label' => 'Типы вариантов', | ||
49 | + 'url' => ['/product/product-variant-type'], | ||
50 | + 'options' => ['class'=>\Yii::$app->user->can('product') ? '' :'hide'], | ||
51 | + ], | ||
52 | + [ | ||
48 | 'label' => 'Импорт товаров', | 53 | 'label' => 'Импорт товаров', |
49 | 'url' => ['/product/manage/import'], | 54 | 'url' => ['/product/manage/import'], |
50 | 'options' => ['class'=>\Yii::$app->user->can('product') ? '' :'hide'], | 55 | 'options' => ['class'=>\Yii::$app->user->can('product') ? '' :'hide'], |
51 | ], | 56 | ], |
57 | + [ | ||
58 | + 'label' => 'Экспорт товаров', | ||
59 | + 'url' => ['/product/manage/export'], | ||
60 | + 'options' => ['class'=>\Yii::$app->user->can('product') ? '' :'hide'], | ||
61 | + ], | ||
52 | ] | 62 | ] |
53 | ], | 63 | ], |
54 | [ | 64 | [ |
common/modules/product/controllers/ManageController.php
@@ -4,6 +4,7 @@ namespace common\modules\product\controllers; | @@ -4,6 +4,7 @@ namespace common\modules\product\controllers; | ||
4 | 4 | ||
5 | use common\modules\product\helpers\ProductHelper; | 5 | use common\modules\product\helpers\ProductHelper; |
6 | use common\modules\product\models\Category; | 6 | use common\modules\product\models\Category; |
7 | +use common\modules\product\models\Export; | ||
7 | use common\modules\product\models\Import; | 8 | use common\modules\product\models\Import; |
8 | use common\modules\product\models\ProductImage; | 9 | use common\modules\product\models\ProductImage; |
9 | use common\modules\product\models\ProductVariant; | 10 | use common\modules\product\models\ProductVariant; |
@@ -278,6 +279,14 @@ class ManageController extends Controller | @@ -278,6 +279,14 @@ class ManageController extends Controller | ||
278 | ]); | 279 | ]); |
279 | } | 280 | } |
280 | 281 | ||
282 | + public function actionExport() { | ||
283 | + $model = new Export(); | ||
284 | + if (($file = $model->process(Yii::getAlias('@uploadDir')))) { | ||
285 | + return Yii::$app->response->sendFile($file)->send(); | ||
286 | + } | ||
287 | + throw new NotFoundHttpException('Error'); | ||
288 | + } | ||
289 | + | ||
281 | /** | 290 | /** |
282 | * Finds the Product model based on its primary key value. | 291 | * Finds the Product model based on its primary key value. |
283 | * If the model is not found, a 404 HTTP exception will be thrown. | 292 | * If the model is not found, a 404 HTTP exception will be thrown. |
common/modules/product/helpers/ProductHelper.php
@@ -10,12 +10,19 @@ use yii\base\Object; | @@ -10,12 +10,19 @@ use yii\base\Object; | ||
10 | use Yii; | 10 | use Yii; |
11 | 11 | ||
12 | class ProductHelper extends Object { | 12 | class ProductHelper extends Object { |
13 | + const PRODUCT_TAX_GROUP_ID_TARGET = 20; | ||
14 | + const PRODUCT_TAX_GROUP_ID_YEAR = 21; | ||
15 | + const PRODUCT_TAX_GROUP_ID_SEX = 22; | ||
16 | + | ||
17 | + const PRODUCT_VARIANT_TYPE_COLOR = 1; | ||
18 | + const PRODUCT_VARIANT_TYPE_SIZE = 2; | ||
19 | + | ||
13 | public static function getCategories() { | 20 | public static function getCategories() { |
14 | - return Category::find()->with('categoryName')->getTree(); | 21 | + return Category::find()->getTree(); // with('categoryName')-> |
15 | } | 22 | } |
16 | 23 | ||
17 | public static function getBrands() { | 24 | public static function getBrands() { |
18 | - return Brand::find()->with('brandName'); | 25 | + return Brand::find(); // ->with('brandName') |
19 | } | 26 | } |
20 | 27 | ||
21 | /* | 28 | /* |
common/modules/product/models/BrandQuery.php
@@ -20,7 +20,7 @@ class BrandQuery extends \yii\db\ActiveQuery | @@ -20,7 +20,7 @@ class BrandQuery extends \yii\db\ActiveQuery | ||
20 | */ | 20 | */ |
21 | public function all($db = null) | 21 | public function all($db = null) |
22 | { | 22 | { |
23 | - $this->with('brandName'); | 23 | +// $this->with('brandName'); |
24 | return parent::all($db); | 24 | return parent::all($db); |
25 | } | 25 | } |
26 | 26 | ||
@@ -30,7 +30,7 @@ class BrandQuery extends \yii\db\ActiveQuery | @@ -30,7 +30,7 @@ class BrandQuery extends \yii\db\ActiveQuery | ||
30 | */ | 30 | */ |
31 | public function one($db = null) | 31 | public function one($db = null) |
32 | { | 32 | { |
33 | - $this->with('brandName'); | 33 | +// $this->with('brandName'); |
34 | return parent::one($db); | 34 | return parent::one($db); |
35 | } | 35 | } |
36 | 36 |
common/modules/product/models/BrandSearch.php
@@ -42,7 +42,7 @@ class BrandSearch extends Brand | @@ -42,7 +42,7 @@ class BrandSearch extends Brand | ||
42 | */ | 42 | */ |
43 | public function search($params) | 43 | public function search($params) |
44 | { | 44 | { |
45 | - $query = Brand::find()->with('brandName'); | 45 | + $query = Brand::find(); // ->with('brandName') |
46 | 46 | ||
47 | // add conditions that should always apply here | 47 | // add conditions that should always apply here |
48 | 48 | ||
@@ -71,15 +71,17 @@ class BrandSearch extends Brand | @@ -71,15 +71,17 @@ class BrandSearch extends Brand | ||
71 | 'brand_name_id' => $this->brand_name_id, | 71 | 'brand_name_id' => $this->brand_name_id, |
72 | ]); | 72 | ]); |
73 | 73 | ||
74 | - $query->joinWith('brandName'); | ||
75 | - | 74 | + |
76 | $query->andFilterWhere(['ilike', 'alias', $this->alias]) | 75 | $query->andFilterWhere(['ilike', 'alias', $this->alias]) |
77 | ->andFilterWhere(['ilike', 'image', $this->image]) | 76 | ->andFilterWhere(['ilike', 'image', $this->image]) |
78 | ->andFilterWhere(['ilike', 'meta_title', $this->meta_title]) | 77 | ->andFilterWhere(['ilike', 'meta_title', $this->meta_title]) |
79 | ->andFilterWhere(['ilike', 'meta_desc', $this->meta_desc]) | 78 | ->andFilterWhere(['ilike', 'meta_desc', $this->meta_desc]) |
80 | ->andFilterWhere(['ilike', 'meta_robots', $this->meta_robots]) | 79 | ->andFilterWhere(['ilike', 'meta_robots', $this->meta_robots]) |
81 | - ->andFilterWhere(['ilike', 'seo_text', $this->seo_text]) | ||
82 | - ->andFilterWhere(['ilike', 'brand_name.value', $this->brand_name]); | 80 | + ->andFilterWhere(['ilike', 'seo_text', $this->seo_text]); |
81 | + if (!empty($this->brand_name)) { | ||
82 | + $query->joinWith('brandName'); | ||
83 | + $query->andFilterWhere(['ilike', 'brand_name.value', $this->brand_name]); | ||
84 | + } | ||
83 | 85 | ||
84 | $query->orderBy('brand_id', 'asc'); | 86 | $query->orderBy('brand_id', 'asc'); |
85 | 87 | ||
@@ -94,8 +96,7 @@ class BrandSearch extends Brand | @@ -94,8 +96,7 @@ class BrandSearch extends Brand | ||
94 | ]) | 96 | ]) |
95 | ->innerJoin(Product::tableName(), Product::tableName() .'.brand_id='. Brand::tableName() .'.brand_id') | 97 | ->innerJoin(Product::tableName(), Product::tableName() .'.brand_id='. Brand::tableName() .'.brand_id') |
96 | ->innerJoin(ProductCategory::tableName(), ProductCategory::tableName() .'.product_id='. Product::tableName() .'.product_id') | 98 | ->innerJoin(ProductCategory::tableName(), ProductCategory::tableName() .'.product_id='. Product::tableName() .'.product_id') |
97 | - | ||
98 | - ->with('brandName'); | 99 | + ->with(['brandName']); |
99 | if (!empty($category)) { | 100 | if (!empty($category)) { |
100 | $query->where([ | 101 | $query->where([ |
101 | ProductCategory::tableName() .'.category_id' => $category->category_id | 102 | ProductCategory::tableName() .'.category_id' => $category->category_id |
common/modules/product/models/Category.php
@@ -134,11 +134,10 @@ class Category extends \yii\db\ActiveRecord | @@ -134,11 +134,10 @@ class Category extends \yii\db\ActiveRecord | ||
134 | } | 134 | } |
135 | 135 | ||
136 | public function getProducts() { | 136 | public function getProducts() { |
137 | - return $this->hasMany(Product::className(), ['product_id' => 'product_id']) | ||
138 | - ->viaTable('product_category', ['category_id' => 'category_id']) | ||
139 | - ->joinWith(['variants']) | ||
140 | - ->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); | ||
141 | -// return $this->getRelations('product_categories'); | 137 | +// return $this->hasMany(Product::className(), ['product_id' => 'product_id']) |
138 | +// ->viaTable('product_category', ['category_id' => 'category_id']) | ||
139 | +// ->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); | ||
140 | + return $this->getRelations('product_categories'); | ||
142 | } | 141 | } |
143 | 142 | ||
144 | /** | 143 | /** |
1 | +<?php | ||
2 | + | ||
3 | +namespace common\modules\product\models; | ||
4 | + | ||
5 | +use common\modules\product\helpers\ProductHelper; | ||
6 | +use yii\base\Model; | ||
7 | + | ||
8 | +class Export extends Model { | ||
9 | + public $errors = []; | ||
10 | + public $output = []; | ||
11 | + | ||
12 | + public function process($dirName, $filename = null, $use_not_enables = false) { | ||
13 | + if (is_null($filename)) { | ||
14 | + $filename = 'products_'. date('d_m_Y_H_i') .'.csv'; | ||
15 | + } | ||
16 | + setlocale(LC_ALL, 'ru_RU.CP1251'); | ||
17 | + $handle = fopen($dirName .'/'. $filename, "w"); | ||
18 | + $products = Product::find()->joinWith(['variants'])->where(['!=', ProductVariant::tableName() .'.stock', 0])->select('product.product_id')->all(); | ||
19 | + $i = 0; | ||
20 | + foreach ($products as $product_id) | ||
21 | + { | ||
22 | + $product = Product::findOne($product_id); | ||
23 | + $i++; | ||
24 | + /*if ($i>1e2) { | ||
25 | + break; | ||
26 | + }*/ | ||
27 | + $mods = []; | ||
28 | + | ||
29 | + foreach ($product->enabledVariants as $variant) | ||
30 | + { | ||
31 | + $size = $color = ''; | ||
32 | + if ($product->product_variant_type_id) { | ||
33 | + $productVariantType = ProductVariantType::findOne($product->product_variant_type_id); | ||
34 | + if ($productVariantType) { | ||
35 | + if ($productVariantType->product_variant_type_id == ProductHelper::PRODUCT_VARIANT_TYPE_COLOR) { | ||
36 | + $color = $product->name; | ||
37 | + } elseif ($productVariantType->product_variant_type_id == ProductHelper::PRODUCT_VARIANT_TYPE_SIZE) { | ||
38 | + $size = $product->name; | ||
39 | + } | ||
40 | + } | ||
41 | + } | ||
42 | + $mods[] = $variant->sku . '=' . $size . '=' . $color . '=' . $variant->imageUrl; | ||
43 | + } | ||
44 | + | ||
45 | + $fotos = []; | ||
46 | + | ||
47 | + foreach ($product->images as $image) | ||
48 | + { | ||
49 | + $fotos[] = $image->imageUrl; | ||
50 | + } | ||
51 | + | ||
52 | + $filters = $product->properties; | ||
53 | + | ||
54 | + $list = [ | ||
55 | + $product->category->name, | ||
56 | + $product->brand->name, | ||
57 | + $product->name, | ||
58 | + '', | ||
59 | + ((! empty($product->description)) ? $product->description : ''), | ||
60 | + ((! empty($filters[ProductHelper::PRODUCT_TAX_GROUP_ID_TARGET])) ? implode (',', $filters[ProductHelper::PRODUCT_TAX_GROUP_ID_TARGET]) : ''), | ||
61 | + '', | ||
62 | + ((! empty($filters[ProductHelper::PRODUCT_TAX_GROUP_ID_SEX])) ? implode (',', $filters[ProductHelper::PRODUCT_TAX_GROUP_ID_SEX]) : ''), | ||
63 | + ((! empty($filters[ProductHelper::PRODUCT_TAX_GROUP_ID_YEAR])) ? implode (',', $filters[ProductHelper::PRODUCT_TAX_GROUP_ID_YEAR]) : ''), | ||
64 | + $product->price_old, | ||
65 | + $product->price, | ||
66 | + intval($product->akciya), | ||
67 | + '', | ||
68 | + intval($product->new), | ||
69 | + intval($product->top), | ||
70 | + '', | ||
71 | + $product->video, | ||
72 | + implode (',', $fotos), | ||
73 | + ]; | ||
74 | + | ||
75 | + $to_write = array_merge ($list, $mods); | ||
76 | + foreach($to_write as &$cell) { | ||
77 | + $cell = iconv("UTF-8", "WINDOWS-1251", $cell); | ||
78 | + } | ||
79 | + | ||
80 | + fputcsv($handle, $to_write, ';'); | ||
81 | + } | ||
82 | + | ||
83 | + fclose ($handle); | ||
84 | + | ||
85 | + return $dirName .'/'. $filename; | ||
86 | + } | ||
87 | +} | ||
0 | \ No newline at end of file | 88 | \ No newline at end of file |
common/modules/product/models/Product.php
@@ -3,6 +3,7 @@ | @@ -3,6 +3,7 @@ | ||
3 | namespace common\modules\product\models; | 3 | namespace common\modules\product\models; |
4 | 4 | ||
5 | use common\behaviors\Slug; | 5 | use common\behaviors\Slug; |
6 | +use common\modules\rubrication\models\TaxGroup; | ||
6 | use common\modules\rubrication\models\TaxOption; | 7 | use common\modules\rubrication\models\TaxOption; |
7 | use Yii; | 8 | use Yii; |
8 | use common\modules\relation\relationBehavior; | 9 | use common\modules\relation\relationBehavior; |
@@ -163,7 +164,7 @@ class Product extends \yii\db\ActiveRecord | @@ -163,7 +164,7 @@ class Product extends \yii\db\ActiveRecord | ||
163 | } | 164 | } |
164 | 165 | ||
165 | public function getEnabledVariantPrice() { | 166 | public function getEnabledVariantPrice() { |
166 | - return $this->enabledVariant->price; | 167 | + return $this->enabledVariants[0]->price; |
167 | } | 168 | } |
168 | 169 | ||
169 | /** | 170 | /** |
@@ -179,6 +180,26 @@ class Product extends \yii\db\ActiveRecord | @@ -179,6 +180,26 @@ class Product extends \yii\db\ActiveRecord | ||
179 | return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); | 180 | return $this->hasMany(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); |
180 | } | 181 | } |
181 | 182 | ||
183 | + /* | ||
184 | + * Get variants grouped by type | ||
185 | + */ | ||
186 | + public function getEnabledVariantsGrouped() | ||
187 | + { | ||
188 | + $variants = []; | ||
189 | + foreach ($this->enabledVariants as $variant) { | ||
190 | + $variants[$variant->product_variant_type_id][] = $variant; | ||
191 | + } | ||
192 | + if (empty($variants)) { | ||
193 | + return []; | ||
194 | + } | ||
195 | + $variants_type = []; | ||
196 | + foreach(ProductVariantType::find()->where(['product_variant_type_id' => array_keys($variants)])->all() as $variant_type) { | ||
197 | + $variant_type->_variants = $variants[$variant_type->product_variant_type_id]; | ||
198 | + $variants_type[] = $variant_type; | ||
199 | + } | ||
200 | + return $variants_type; | ||
201 | + } | ||
202 | + | ||
182 | public function setVariants($variants) { | 203 | public function setVariants($variants) { |
183 | $this->_variants = $variants; | 204 | $this->_variants = $variants; |
184 | } | 205 | } |
@@ -206,7 +227,8 @@ class Product extends \yii\db\ActiveRecord | @@ -206,7 +227,8 @@ class Product extends \yii\db\ActiveRecord | ||
206 | } | 227 | } |
207 | 228 | ||
208 | public function getOptions() { | 229 | public function getOptions() { |
209 | - return $this->getRelations('product_option'); | 230 | + return $this->hasMany(TaxOption::className(), ['tax_option_id' => 'option_id'])->viaTable('product_option', ['product_id' => 'product_id']); |
231 | +// return $this->getRelations('product_option'); | ||
210 | } | 232 | } |
211 | 233 | ||
212 | public function getStocks() { | 234 | public function getStocks() { |
@@ -347,4 +369,18 @@ class Product extends \yii\db\ActiveRecord | @@ -347,4 +369,18 @@ class Product extends \yii\db\ActiveRecord | ||
347 | } | 369 | } |
348 | return $op; | 370 | return $op; |
349 | } | 371 | } |
372 | + | ||
373 | + public function getProperties() { | ||
374 | + $groups = $options = []; | ||
375 | + foreach ($this->options as $option) { | ||
376 | + $options[$option->tax_group_id][] = $option; | ||
377 | + } | ||
378 | + foreach (TaxGroup::find()->where(['tax_group_id' => array_keys($options)])->all() as $group) { | ||
379 | + if (!empty($options[$group->tax_group_id])) { | ||
380 | + $group->_options = $options[$group->tax_group_id]; | ||
381 | + $groups[] = $group; | ||
382 | + } | ||
383 | + } | ||
384 | + return $groups; | ||
385 | + } | ||
350 | } | 386 | } |
common/modules/product/models/ProductVariant.php
@@ -169,14 +169,6 @@ class ProductVariant extends \yii\db\ActiveRecord | @@ -169,14 +169,6 @@ class ProductVariant extends \yii\db\ActiveRecord | ||
169 | $this->stocks = (array) $stocks; | 169 | $this->stocks = (array) $stocks; |
170 | } | 170 | } |
171 | 171 | ||
172 | - /*public function getStocks() { | ||
173 | - return $this->hasMany(Stock::className(), ['stock_id' => 'stock_id'])->viaTable(ProductStock::tableName(), ['product_variant_id' => 'product_variant_id']); | ||
174 | - } | ||
175 | - | ||
176 | - public function getStocksIds() { | ||
177 | - return ArrayHelper::getColumn($this->hasMany(Stock::className(), ['stock_id' => 'stock_id'])->viaTable(ProductStock::tableName(), ['product_variant_id' => 'product_variant_id'])->all(), 'stock_id'); | ||
178 | - }*/ | ||
179 | - | ||
180 | public function afterSave($insert, $changedAttributes) | 172 | public function afterSave($insert, $changedAttributes) |
181 | { | 173 | { |
182 | if (!empty($this->stocks)) { | 174 | if (!empty($this->stocks)) { |
common/modules/product/models/ProductVariantType.php
@@ -12,6 +12,8 @@ use Yii; | @@ -12,6 +12,8 @@ use Yii; | ||
12 | */ | 12 | */ |
13 | class ProductVariantType extends \yii\db\ActiveRecord | 13 | class ProductVariantType extends \yii\db\ActiveRecord |
14 | { | 14 | { |
15 | + public $_variants = []; | ||
16 | + | ||
15 | /** | 17 | /** |
16 | * @inheritdoc | 18 | * @inheritdoc |
17 | */ | 19 | */ |
@@ -40,4 +42,8 @@ class ProductVariantType extends \yii\db\ActiveRecord | @@ -40,4 +42,8 @@ class ProductVariantType extends \yii\db\ActiveRecord | ||
40 | 'name' => 'Name', | 42 | 'name' => 'Name', |
41 | ]; | 43 | ]; |
42 | } | 44 | } |
45 | + | ||
46 | + public function getId() { | ||
47 | + return $this->product_variant_type_id; | ||
48 | + } | ||
43 | } | 49 | } |
common/modules/product/models/import.php
@@ -2,6 +2,7 @@ | @@ -2,6 +2,7 @@ | ||
2 | 2 | ||
3 | namespace common\modules\product\models; | 3 | namespace common\modules\product\models; |
4 | 4 | ||
5 | +use common\modules\product\helpers\ProductHelper; | ||
5 | use common\modules\product\models\Category; | 6 | use common\modules\product\models\Category; |
6 | use common\modules\product\models\CategoryName; | 7 | use common\modules\product\models\CategoryName; |
7 | use common\modules\product\models\ProductImage; | 8 | use common\modules\product\models\ProductImage; |
@@ -64,6 +65,8 @@ class Import extends Model { | @@ -64,6 +65,8 @@ class Import extends Model { | ||
64 | 65 | ||
65 | $j = 0; | 66 | $j = 0; |
66 | 67 | ||
68 | + $is_utf = (preg_match('//u', file_get_contents(Yii::getAlias('@uploadDir') .'/'. Yii::getAlias('@uploadFileProducts'), null, null, null, 1000000))); | ||
69 | + | ||
67 | while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE) | 70 | while (($data = fgetcsv ($handle, 10000, ";")) !== FALSE) |
68 | { | 71 | { |
69 | $j++; | 72 | $j++; |
@@ -73,8 +76,9 @@ class Import extends Model { | @@ -73,8 +76,9 @@ class Import extends Model { | ||
73 | 76 | ||
74 | foreach ($data as &$value) | 77 | foreach ($data as &$value) |
75 | { | 78 | { |
76 | - //$value = mb_convert_encoding ($value, "UTF-8", mb_detect_encoding ($value)); | ||
77 | - $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value); | 79 | + if (!$is_utf) { |
80 | + $value = iconv ('windows-1251', "UTF-8//TRANSLIT//IGNORE", $value); | ||
81 | + } | ||
78 | $value = trim ($value); | 82 | $value = trim ($value); |
79 | } | 83 | } |
80 | 84 | ||
@@ -277,7 +281,7 @@ class Import extends Model { | @@ -277,7 +281,7 @@ class Import extends Model { | ||
277 | if (!$filter) { | 281 | if (!$filter) { |
278 | continue; | 282 | continue; |
279 | } | 283 | } |
280 | - if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => 20])->one()) === null ) { | 284 | + if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_TARGET])->one()) === null ) { |
281 | // Create option | 285 | // Create option |
282 | $option = new TaxOption(); | 286 | $option = new TaxOption(); |
283 | $option->tax_group_id = 20; | 287 | $option->tax_group_id = 20; |
@@ -302,7 +306,7 @@ class Import extends Model { | @@ -302,7 +306,7 @@ class Import extends Model { | ||
302 | if (!$filter) { | 306 | if (!$filter) { |
303 | continue; | 307 | continue; |
304 | } | 308 | } |
305 | - if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => 21])->one()) === null ) { | 309 | + if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_YEAR])->one()) === null ) { |
306 | // Create option | 310 | // Create option |
307 | $option = new TaxOption(); | 311 | $option = new TaxOption(); |
308 | $option->tax_group_id = 21; | 312 | $option->tax_group_id = 21; |
@@ -327,7 +331,7 @@ class Import extends Model { | @@ -327,7 +331,7 @@ class Import extends Model { | ||
327 | if (!$filter) { | 331 | if (!$filter) { |
328 | continue; | 332 | continue; |
329 | } | 333 | } |
330 | - if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => 22])->one()) === null ) { | 334 | + if ( ($value = TaxValueString::find()->innerJoinWith('taxOption')->andFilterWhere(['ilike', 'value', $filter])->andFilterWhere(['tax_option.tax_group_id' => ProductHelper::PRODUCT_TAX_GROUP_ID_SEX])->one()) === null ) { |
331 | // Create option | 335 | // Create option |
332 | $option = new TaxOption(); | 336 | $option = new TaxOption(); |
333 | $option->tax_group_id = 22; | 337 | $option->tax_group_id = 22; |
common/modules/product/widgets/views/product_smart.php
@@ -8,9 +8,9 @@ use yii\helpers\Url; | @@ -8,9 +8,9 @@ use yii\helpers\Url; | ||
8 | <a href="<?= Url::to([ | 8 | <a href="<?= Url::to([ |
9 | 'catalog/product', | 9 | 'catalog/product', |
10 | 'product' => $product, | 10 | 'product' => $product, |
11 | - '#' => 'm' .$product->enabledVariant->product_variant_id]) | 11 | + '#' => 'm' .$product->enabledVariants[0]->product_variant_id]) |
12 | ?>"> | 12 | ?>"> |
13 | - <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariant->imageUrl, 'list')?> | 13 | + <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariants[0]->imageUrl, 'list')?> |
14 | </a> | 14 | </a> |
15 | </div> | 15 | </div> |
16 | <?php if(!empty($product->is_top) || !empty($product->is_new) || !empty($product->akciya)) :?> | 16 | <?php if(!empty($product->is_top) || !empty($product->is_new) || !empty($product->akciya)) :?> |
@@ -34,17 +34,17 @@ use yii\helpers\Url; | @@ -34,17 +34,17 @@ use yii\helpers\Url; | ||
34 | 34 | ||
35 | <div class="cost-block"> | 35 | <div class="cost-block"> |
36 | <p class="cost"> | 36 | <p class="cost"> |
37 | - <?php if ($product->enabledVariant->price_old != 0 && $product->enabledVariant->price_old != $product->enabledVariant->price) :?> | ||
38 | - <strike><span id="old_cost"><?= $product->enabledVariant->price_old ?></span> грн.</strike> | 37 | + <?php if ($product->enabledVariants[0]->price_old != 0 && $product->enabledVariants[0]->price_old != $product->enabledVariants[0]->price) :?> |
38 | + <strike><span id="old_cost"><?= $product->enabledVariants[0]->price_old ?></span> грн.</strike> | ||
39 | <?php endif?> | 39 | <?php endif?> |
40 | - <?= $product->enabledVariant->price?> <span>грн.</span></p> | 40 | + <?= $product->enabledVariants[0]->price?> <span>грн.</span></p> |
41 | </div> | 41 | </div> |
42 | </div> | 42 | </div> |
43 | 43 | ||
44 | <a href="<?= Url::to([ | 44 | <a href="<?= Url::to([ |
45 | 'catalog/product', | 45 | 'catalog/product', |
46 | 'product' => $product, | 46 | 'product' => $product, |
47 | - '#' => 'm' .$product->enabledVariant->product_variant_id]) | 47 | + '#' => 'm' .$product->enabledVariants[0]->product_variant_id]) |
48 | ?>" class="link_buy">Купить</a> | 48 | ?>" class="link_buy">Купить</a> |
49 | 49 | ||
50 | <div class="mycarousel"> | 50 | <div class="mycarousel"> |
@@ -55,7 +55,7 @@ use yii\helpers\Url; | @@ -55,7 +55,7 @@ use yii\helpers\Url; | ||
55 | 'catalog/product', | 55 | 'catalog/product', |
56 | 'product' => $product, | 56 | 'product' => $product, |
57 | '#' => 'm' . $variant->product_variant_id]) ?>"> | 57 | '#' => 'm' . $variant->product_variant_id]) ?>"> |
58 | - <?= \common\components\artboximage\ArtboxImageHelper::getImage($variant->imageUrl, 'product_variant')?> | 58 | + <?= \common\components\artboximage\ArtboxImageHelper::getImage((!empty($variant->image) && !empty($variant->image->imageUrl) ? $variant->image->imageUrl : '/images/no_photo.png'), 'product_variant')?> |
59 | </a> | 59 | </a> |
60 | </li> | 60 | </li> |
61 | <?php endforeach; ?> | 61 | <?php endforeach; ?> |
frontend/controllers/CatalogController.php
@@ -163,25 +163,11 @@ class CatalogController extends \yii\web\Controller | @@ -163,25 +163,11 @@ class CatalogController extends \yii\web\Controller | ||
163 | throw new HttpException(404, 'Товар не найден'); | 163 | throw new HttpException(404, 'Товар не найден'); |
164 | } | 164 | } |
165 | 165 | ||
166 | - $groups = []; | ||
167 | - foreach($product->category->getTaxGroups()->all() as $_group) { | ||
168 | - $groups[$_group->tax_group_id] = $_group; | ||
169 | - } | ||
170 | - foreach ($product->options as $option) { | ||
171 | - $groups[$option->tax_group_id]->_options[] = $option; | ||
172 | - } | ||
173 | - foreach($groups as $i => $group) { | ||
174 | - if (empty($group->_options)) | ||
175 | - unset($groups[$i]); | ||
176 | - } | ||
177 | - $category = $product->category; | ||
178 | - | ||
179 | ProductHelper::addLastProsucts($product->product_id); | 166 | ProductHelper::addLastProsucts($product->product_id); |
180 | 167 | ||
181 | return $this->render('product', [ | 168 | return $this->render('product', [ |
182 | 'product' => $product, | 169 | 'product' => $product, |
183 | - 'category' => $category, | ||
184 | - 'properties' => $groups, | 170 | + 'category' => $product->category, |
185 | ]); | 171 | ]); |
186 | } | 172 | } |
187 | 173 |
frontend/views/catalog/product.php
@@ -13,7 +13,7 @@ $this->title = $product->fullname; | @@ -13,7 +13,7 @@ $this->title = $product->fullname; | ||
13 | //} | 13 | //} |
14 | $this->params['breadcrumbs'][] = ['label' => 'Каталог', 'url' => ['catalog/category']]; | 14 | $this->params['breadcrumbs'][] = ['label' => 'Каталог', 'url' => ['catalog/category']]; |
15 | $this->params['breadcrumbs'][] = ['label' => $product->category->categoryName->value, 'url' => ['catalog/category', 'category' => $product->category]]; | 15 | $this->params['breadcrumbs'][] = ['label' => $product->category->categoryName->value, 'url' => ['catalog/category', 'category' => $product->category]]; |
16 | -$this->params['breadcrumbs'][] = $product->fullname .' #'. $product->enabledVariant->sku; | 16 | +$this->params['breadcrumbs'][] = $product->fullname .' #'. $product->enabledVariants[0]->sku; |
17 | 17 | ||
18 | $this->registerJs (' | 18 | $this->registerJs (' |
19 | 19 | ||
@@ -94,9 +94,10 @@ $this->registerJs (" | @@ -94,9 +94,10 @@ $this->registerJs (" | ||
94 | <div class="loyout"> | 94 | <div class="loyout"> |
95 | <div class="productLeftBar"> | 95 | <div class="productLeftBar"> |
96 | <h1><?= $product->fullname ?></h1> | 96 | <h1><?= $product->fullname ?></h1> |
97 | - <div class="begin">Цветовые решения</div> | 97 | + <?php foreach($product->enabledVariantsGrouped as $variantGroup) :?> |
98 | + <div class="begin"><?= $variantGroup->name2?></div> | ||
98 | <ul class="product_mod"> | 99 | <ul class="product_mod"> |
99 | - <?php foreach ($product->enabledVariants as $variant): ?> | 100 | + <?php foreach ($variantGroup->_variants as $variant): ?> |
100 | <li> | 101 | <li> |
101 | <a id='m<?= $variant->product_variant_id ?>' href="#<?=$variant->product_variant_id ?>" | 102 | <a id='m<?= $variant->product_variant_id ?>' href="#<?=$variant->product_variant_id ?>" |
102 | data-cost="<?= $variant->price ?>" | 103 | data-cost="<?= $variant->price ?>" |
@@ -111,6 +112,7 @@ $this->registerJs (" | @@ -111,6 +112,7 @@ $this->registerJs (" | ||
111 | <?php endforeach; ?> | 112 | <?php endforeach; ?> |
112 | </ul> | 113 | </ul> |
113 | <div class="both"></div> | 114 | <div class="both"></div> |
115 | + <?php endforeach; ?> | ||
114 | 116 | ||
115 | <div class="cost_box product_read_"> | 117 | <div class="cost_box product_read_"> |
116 | <div class='params'>код: <span id='art'></span><br/> цвет: <span id='color'></span></div> | 118 | <div class='params'>код: <span id='art'></span><br/> цвет: <span id='color'></span></div> |
@@ -142,7 +144,7 @@ $this->registerJs (" | @@ -142,7 +144,7 @@ $this->registerJs (" | ||
142 | <li><a href="#">Характеристики</a> | 144 | <li><a href="#">Характеристики</a> |
143 | <div class="info"> | 145 | <div class="info"> |
144 | <p>Бренд: <?= $product->brand->name ?></p> | 146 | <p>Бренд: <?= $product->brand->name ?></p> |
145 | - <?php foreach ($properties as $group): ?> | 147 | + <?php foreach ($product->properties as $group): ?> |
146 | <p><?= $group->name ?> <?php foreach($group->_options as $option) :?> <?= $option->ValueRenderHTML?><?php endforeach?></p> | 148 | <p><?= $group->name ?> <?php foreach($group->_options as $option) :?> <?= $option->ValueRenderHTML?><?php endforeach?></p> |
147 | <?php endforeach; ?> | 149 | <?php endforeach; ?> |
148 | </div> | 150 | </div> |
@@ -165,7 +167,7 @@ $this->registerJs (" | @@ -165,7 +167,7 @@ $this->registerJs (" | ||
165 | <div class="content"> | 167 | <div class="content"> |
166 | <div class="pic"> | 168 | <div class="pic"> |
167 | <center> | 169 | <center> |
168 | - <a href="#" rel="shadowbox[gal]" id="picoriginal"><?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariant->imageUrl, 'product_view',['id'=>'pic'])?></a> | 170 | + <a href="#" rel="shadowbox[gal]" id="picoriginal"><?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariants[0]->imageUrl, 'product_view',['id'=>'pic'])?></a> |
169 | </center> | 171 | </center> |
170 | </div> | 172 | </div> |
171 | <ul class="product_colors"> | 173 | <ul class="product_colors"> |
frontend/views/catalog/product_item.php
@@ -5,8 +5,8 @@ use yii\helpers\Url; | @@ -5,8 +5,8 @@ use yii\helpers\Url; | ||
5 | <li class="item"> | 5 | <li class="item"> |
6 | <div class="boxitem"> | 6 | <div class="boxitem"> |
7 | <div class="pixbox"> | 7 | <div class="pixbox"> |
8 | - <a href="<?= Url::to(['catalog/product', 'product' => $product,'#' => 'm' .$product->enabledVariant->product_variant_id]) ?>"> | ||
9 | - <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariant->imageUrl, 'list')?> | 8 | + <a href="<?= Url::to(['catalog/product', 'product' => $product,'#' => 'm' .$product->enabledVariants[0]->product_variant_id]) ?>"> |
9 | + <?= \common\components\artboximage\ArtboxImageHelper::getImage($product->enabledVariants[0]->imageUrl, 'list')?> | ||
10 | </a> | 10 | </a> |
11 | </div> | 11 | </div> |
12 | <?php if(!empty($product->is_top) || !empty($product->is_new) || !empty($product->akciya)) :?> | 12 | <?php if(!empty($product->is_top) || !empty($product->is_new) || !empty($product->akciya)) :?> |
@@ -25,7 +25,7 @@ use yii\helpers\Url; | @@ -25,7 +25,7 @@ use yii\helpers\Url; | ||
25 | <a href="<?= Url::to([ | 25 | <a href="<?= Url::to([ |
26 | 'catalog/product', | 26 | 'catalog/product', |
27 | 'product' => $product, | 27 | 'product' => $product, |
28 | - '#' => 'm' .$product->enabledVariant->product_variant_id]) | 28 | + '#' => 'm' .$product->enabledVariants[0]->product_variant_id]) |
29 | ?>" | 29 | ?>" |
30 | class="name"><?= $product->fullname ?> | 30 | class="name"><?= $product->fullname ?> |
31 | </a> | 31 | </a> |
@@ -35,12 +35,12 @@ use yii\helpers\Url; | @@ -35,12 +35,12 @@ use yii\helpers\Url; | ||
35 | echo '<div class="cost-block">'; | 35 | echo '<div class="cost-block">'; |
36 | echo '<p class="cost">'; | 36 | echo '<p class="cost">'; |
37 | // есть скидка | 37 | // есть скидка |
38 | - if ($product->enabledVariant->price_old != 0 && $product->enabledVariant->price_old != $product->enabledVariant->price) | 38 | + if ($product->enabledVariants[0]->price_old != 0 && $product->enabledVariants[0]->price_old != $product->enabledVariants[0]->price) |
39 | { | 39 | { |
40 | - echo '<strike><span id=\'old_cost\'>'.$product->enabledVariant->price_old.'</span> грн.</strike> '; | 40 | + echo '<strike><span id=\'old_cost\'>'.$product->enabledVariants[0]->price_old.'</span> грн.</strike> '; |
41 | } | 41 | } |
42 | 42 | ||
43 | - echo $product->enabledVariant->price.' <span>грн.</span></p>'; | 43 | + echo $product->enabledVariants[0]->price.' <span>грн.</span></p>'; |
44 | 44 | ||
45 | echo '</div>'; | 45 | echo '</div>'; |
46 | 46 | ||
@@ -49,7 +49,7 @@ use yii\helpers\Url; | @@ -49,7 +49,7 @@ use yii\helpers\Url; | ||
49 | <a href="<?= Url::to([ | 49 | <a href="<?= Url::to([ |
50 | 'catalog/product', | 50 | 'catalog/product', |
51 | 'product' => $product, | 51 | 'product' => $product, |
52 | - '#' => 'm' .$product->enabledVariant->product_variant_id]) | 52 | + '#' => 'm' .$product->enabledVariants[0]->product_variant_id]) |
53 | ?>" class="link_buy">Купить</a> | 53 | ?>" class="link_buy">Купить</a> |
54 | 54 | ||
55 | <div class="mycarousel"> | 55 | <div class="mycarousel"> |
frontend/widgets/Rubrics.php
@@ -32,7 +32,7 @@ class Rubrics extends Widget { | @@ -32,7 +32,7 @@ class Rubrics extends Widget { | ||
32 | $items = []; | 32 | $items = []; |
33 | 33 | ||
34 | if (empty($this->categories)) { | 34 | if (empty($this->categories)) { |
35 | - $this->categories = Category::find ()->orderBy('category_id', SORT_ASC)->all(); | 35 | + $this->categories = Category::find()->orderBy('category_id', SORT_ASC)->all(); |
36 | } | 36 | } |
37 | foreach ($this->categories as $category) { | 37 | foreach ($this->categories as $category) { |
38 | if (!empty($this->includes) && !in_array($category->category_id, $this->includes)) { | 38 | if (!empty($this->includes) && !in_array($category->category_id, $this->includes)) { |