Commit e9f291a5e732fbe370433e83f9584ad442c2b80c
1 parent
2e9ea16e
Similar products widget
Showing
6 changed files
with
77 additions
and
0 deletions
Show diff stats
common/modules/product/helpers/ProductHelper.php
| @@ -99,4 +99,39 @@ class ProductHelper extends Object { | @@ -99,4 +99,39 @@ class ProductHelper extends Object { | ||
| 99 | } | 99 | } |
| 100 | return Product::find()->joinWith('variants')->where($data)->andWhere(['!=', ProductVariant::tableName() .'.stock', 0])->limit($count)/*->orderBy($sort)*/->all(); | 100 | return Product::find()->joinWith('variants')->where($data)->andWhere(['!=', ProductVariant::tableName() .'.stock', 0])->limit($count)/*->orderBy($sort)*/->all(); |
| 101 | } | 101 | } |
| 102 | + | ||
| 103 | + public static function getSimilarProducts($product, $count = 10) { | ||
| 104 | + if (!is_object($product)) { | ||
| 105 | + $product = Product::findOne($product); | ||
| 106 | + } | ||
| 107 | + | ||
| 108 | + if (!$product->properties) { | ||
| 109 | + return []; | ||
| 110 | + } | ||
| 111 | + $query = Product::find() | ||
| 112 | + ->select('product.product_id') | ||
| 113 | + ->innerJoinWith('variant') | ||
| 114 | + ->where(['!=', 'product_variant.stock', 0]); | ||
| 115 | +// $query->andWhere(['>=', 'product_variant.price', $product->enabledVariant->price * 0.7]); | ||
| 116 | +// $query->andWhere(['<=', 'product_variant.price', $product->enabledVariant->price * 1.3]); | ||
| 117 | + foreach($product->properties as $group) { | ||
| 118 | + $where = []; | ||
| 119 | + foreach ($group->_options as $option) { | ||
| 120 | + $where[] = $option->tax_option_id; | ||
| 121 | + } | ||
| 122 | + if (!$where) { | ||
| 123 | + continue; | ||
| 124 | + } | ||
| 125 | + $query->innerJoin('product_option to'. $group->tax_group_id, 'to'. $group->tax_group_id .'.product_id = product.product_id'); | ||
| 126 | + $query->andWhere(['to'. $group->tax_group_id .'.option_id' => $where]); | ||
| 127 | + } | ||
| 128 | + $query->andWhere(['!=', 'product.product_id', $product->product_id]); | ||
| 129 | + $query->groupBy('product.product_id'); | ||
| 130 | + $query->limit($count); | ||
| 131 | + $products = $query->asArray()->all(); | ||
| 132 | + foreach ($products as &$_product) { | ||
| 133 | + $_product = Product::findOne($_product['product_id']); | ||
| 134 | + } | ||
| 135 | + return $products; | ||
| 136 | + } | ||
| 102 | } | 137 | } |
| 103 | \ No newline at end of file | 138 | \ No newline at end of file |
common/modules/product/models/Product.php
| @@ -27,6 +27,9 @@ use yii\web\UploadedFile; | @@ -27,6 +27,9 @@ use yii\web\UploadedFile; | ||
| 27 | * @property boolean $is_top | 27 | * @property boolean $is_top |
| 28 | * @property boolean $is_new | 28 | * @property boolean $is_new |
| 29 | * @property boolean $akciya | 29 | * @property boolean $akciya |
| 30 | + * @property array $properties | ||
| 31 | + * @property ProductVariant $enabledVariant | ||
| 32 | + * @property array $enabledVariants | ||
| 30 | */ | 33 | */ |
| 31 | class Product extends \yii\db\ActiveRecord | 34 | class Product extends \yii\db\ActiveRecord |
| 32 | { | 35 | { |
| @@ -159,6 +162,7 @@ class Product extends \yii\db\ActiveRecord | @@ -159,6 +162,7 @@ class Product extends \yii\db\ActiveRecord | ||
| 159 | { | 162 | { |
| 160 | return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); | 163 | return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); |
| 161 | } | 164 | } |
| 165 | + | ||
| 162 | public function getVariantPrice() { | 166 | public function getVariantPrice() { |
| 163 | return $this->variant->price; | 167 | return $this->variant->price; |
| 164 | } | 168 | } |
| 1 | +<?php | ||
| 2 | + | ||
| 3 | +namespace common\modules\product\widgets; | ||
| 4 | + | ||
| 5 | +use common\modules\product\helpers\ProductHelper; | ||
| 6 | +use common\modules\product\models\Category; | ||
| 7 | +use yii\base\Widget; | ||
| 8 | +use Yii; | ||
| 9 | + | ||
| 10 | +class similarProducts extends Widget { | ||
| 11 | + public $count = 10; | ||
| 12 | + | ||
| 13 | + public $title; | ||
| 14 | + | ||
| 15 | + public $product; | ||
| 16 | + | ||
| 17 | + public function init() | ||
| 18 | + { | ||
| 19 | + parent::init(); // TODO: Change the autogenerated stub | ||
| 20 | + } | ||
| 21 | + | ||
| 22 | + public function run() { | ||
| 23 | + $products = ProductHelper::getSimilarProducts($this->product, $this->count); | ||
| 24 | + | ||
| 25 | + if (!$this->title) { | ||
| 26 | + $this->title = Yii::t('product', 'Similar products'); | ||
| 27 | + } | ||
| 28 | + | ||
| 29 | + return $this->render('products_block', [ | ||
| 30 | + 'title' => $this->title, | ||
| 31 | + 'class' => 'similar-products', | ||
| 32 | + 'products' => $products, | ||
| 33 | + ]); | ||
| 34 | + } | ||
| 35 | +} | ||
| 0 | \ No newline at end of file | 36 | \ No newline at end of file |
common/translation/ru/product.php
| @@ -11,6 +11,7 @@ return [ | @@ -11,6 +11,7 @@ return [ | ||
| 11 | 'Promo products' => 'Акционные товары', | 11 | 'Promo products' => 'Акционные товары', |
| 12 | 'New products' => 'Новинки', | 12 | 'New products' => 'Новинки', |
| 13 | 'Top products' => 'Популярные', | 13 | 'Top products' => 'Популярные', |
| 14 | + 'Similar products' => 'Похожие товары', | ||
| 14 | 'Brands' => 'Бренды', | 15 | 'Brands' => 'Бренды', |
| 15 | 'Brand' => 'Бренд', | 16 | 'Brand' => 'Бренд', |
| 16 | 'Categories' => 'Категории', | 17 | 'Categories' => 'Категории', |
composer.json
| @@ -35,6 +35,7 @@ | @@ -35,6 +35,7 @@ | ||
| 35 | "unclead/yii2-multiple-input": "~1.0", | 35 | "unclead/yii2-multiple-input": "~1.0", |
| 36 | "codeception/codeception":"*", | 36 | "codeception/codeception":"*", |
| 37 | "phpmailer/phpmailer": "^5.2", | 37 | "phpmailer/phpmailer": "^5.2", |
| 38 | + "league/oauth2-client": "^1.3", | ||
| 38 | "kartik-v/yii2-grid": "@dev", | 39 | "kartik-v/yii2-grid": "@dev", |
| 39 | "kartik-v/yii2-mpdf": "@dev", | 40 | "kartik-v/yii2-mpdf": "@dev", |
| 40 | "kartik-v/yii2-widget-fileinput": "@dev", | 41 | "kartik-v/yii2-widget-fileinput": "@dev", |
frontend/views/catalog/product.php
| @@ -184,6 +184,7 @@ $this->registerJs (" | @@ -184,6 +184,7 @@ $this->registerJs (" | ||
| 184 | </div> | 184 | </div> |
| 185 | <div class="both"></div> | 185 | <div class="both"></div> |
| 186 | 186 | ||
| 187 | + <?= \common\modules\product\widgets\similarProducts::widget(['product' => $product])?> | ||
| 187 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'promo'])?> | 188 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'promo'])?> |
| 188 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'new'])?> | 189 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'new'])?> |
| 189 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'top'])?> | 190 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'top'])?> |