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 | 99 | } | 
| 100 | 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 | 138 | \ No newline at end of file | ... | ... | 
common/modules/product/models/Product.php
| ... | ... | @@ -27,6 +27,9 @@ use yii\web\UploadedFile; | 
| 27 | 27 | * @property boolean $is_top | 
| 28 | 28 | * @property boolean $is_new | 
| 29 | 29 | * @property boolean $akciya | 
| 30 | + * @property array $properties | |
| 31 | + * @property ProductVariant $enabledVariant | |
| 32 | + * @property array $enabledVariants | |
| 30 | 33 | */ | 
| 31 | 34 | class Product extends \yii\db\ActiveRecord | 
| 32 | 35 | { | 
| ... | ... | @@ -159,6 +162,7 @@ class Product extends \yii\db\ActiveRecord | 
| 159 | 162 | { | 
| 160 | 163 | return $this->hasOne(ProductVariant::className(), ['product_id' => 'product_id'])->andOnCondition(['!=', ProductVariant::tableName() .'.stock', 0]); | 
| 161 | 164 | } | 
| 165 | + | |
| 162 | 166 | public function getVariantPrice() { | 
| 163 | 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 | 36 | \ No newline at end of file | ... | ... | 
common/translation/ru/product.php
composer.json
| ... | ... | @@ -35,6 +35,7 @@ | 
| 35 | 35 | "unclead/yii2-multiple-input": "~1.0", | 
| 36 | 36 | "codeception/codeception":"*", | 
| 37 | 37 | "phpmailer/phpmailer": "^5.2", | 
| 38 | + "league/oauth2-client": "^1.3", | |
| 38 | 39 | "kartik-v/yii2-grid": "@dev", | 
| 39 | 40 | "kartik-v/yii2-mpdf": "@dev", | 
| 40 | 41 | "kartik-v/yii2-widget-fileinput": "@dev", | ... | ... | 
frontend/views/catalog/product.php
| ... | ... | @@ -184,6 +184,7 @@ $this->registerJs (" | 
| 184 | 184 | </div> | 
| 185 | 185 | <div class="both"></div> | 
| 186 | 186 | |
| 187 | + <?= \common\modules\product\widgets\similarProducts::widget(['product' => $product])?> | |
| 187 | 188 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'promo'])?> | 
| 188 | 189 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'new'])?> | 
| 189 | 190 | <?= \common\modules\product\widgets\specialProducts::widget(['type' => 'top'])?> | ... | ... | 
