Commit 4e03534e0ddbd9768c916a86056810c545175629
1 parent
4ec0b3c5
add similar products
Showing
4 changed files
with
303 additions
and
129 deletions
Show diff stats
helpers/ProductHelper.php
... | ... | @@ -4,6 +4,7 @@ |
4 | 4 | |
5 | 5 | use artweb\artbox\ecommerce\models\Category; |
6 | 6 | use artweb\artbox\ecommerce\models\Product; |
7 | + use artweb\artbox\ecommerce\models\ProductVariant; | |
7 | 8 | use yii\base\InvalidConfigException; |
8 | 9 | use yii\base\InvalidParamException; |
9 | 10 | use yii\base\Object; |
... | ... | @@ -179,6 +180,23 @@ |
179 | 180 | $product->id, |
180 | 181 | ] |
181 | 182 | ); |
183 | + | |
184 | + | |
185 | + $query->andWhere([ | |
186 | + '>=', | |
187 | + ProductVariant::tableName() . '.price', | |
188 | + ($product->variant->price * 0.8), | |
189 | + ]); | |
190 | + | |
191 | + | |
192 | + $query->andWhere([ | |
193 | + '<=', | |
194 | + ProductVariant::tableName() . '.price', | |
195 | + ($product->variant->price * 1.2), | |
196 | + ]); | |
197 | + | |
198 | + | |
199 | + | |
182 | 200 | $query->groupBy('product.id'); |
183 | 201 | $query->limit($count); |
184 | 202 | return $query; | ... | ... |
widgets/similarProducts.php
... | ... | @@ -22,8 +22,9 @@ |
22 | 22 | |
23 | 23 | public function run() |
24 | 24 | { |
25 | - $products = ProductHelper::getSimilarProducts($this->product, $this->count); | |
26 | - | |
25 | + $products = ProductHelper::getSimilarProducts($this->product, $this->count)->all(); | |
26 | + | |
27 | + | |
27 | 28 | if (!$this->title) { |
28 | 29 | $this->title = Yii::t('product', 'Similar products'); |
29 | 30 | } | ... | ... |
widgets/views/product_smart.php
1 | 1 | <?php |
2 | - /** | |
3 | - * @var $product artweb\artbox\ecommerce\models\Product | |
4 | - */ | |
5 | - use artweb\artbox\components\artboximage\ArtboxImageHelper; | |
6 | - use yii\helpers\Html; | |
7 | - use yii\helpers\Url; | |
2 | +/** | |
3 | + * @var $model Product | |
4 | + */ | |
5 | +use artweb\artbox\components\artboximage\ArtboxImageHelper; | |
6 | +use artweb\artbox\ecommerce\models\Product; | |
7 | +use yii\bootstrap\Html; | |
8 | +use yii\helpers\ArrayHelper; | |
8 | 9 | |
9 | -?> | |
10 | -<div class="catalog_item"> | |
11 | - <div class="wrapper"> | |
12 | - <div class="item_container"> | |
13 | - <input class="prodInfo" type="hidden" value="[]"> | |
14 | - <div class="title"> | |
15 | - <?= Html::a( | |
16 | - $product->lang->title, | |
17 | - Url::to( | |
18 | - [ | |
19 | - 'catalog/product', | |
20 | - 'product' => $product->lang->alias, | |
21 | - ] | |
22 | - ), | |
23 | - [ 'class' => 'btn-product-details' ] | |
24 | - ) ?> | |
25 | - </div> | |
26 | - <div class="img"> | |
27 | - <a class="btn-product-details" href="<?= Url::to( | |
10 | + | |
11 | + | |
12 | +if($this->beginCache('_item_list'.$model->id,[ | |
13 | + 'variations' => [\Yii::$app->language], | |
14 | + 'id' => $model->id, | |
15 | + 'duration' => 3600 *24 | |
16 | +])){ | |
17 | + | |
18 | + | |
19 | + $fullname = $model->fullName; | |
20 | + if(!empty($model->enabledVariants)) { | |
21 | + $variant = $model->enabledVariants[ 0 ]; | |
22 | + } else { | |
23 | + $variant = $model->variant; | |
24 | + } | |
25 | + $imageMap = ArrayHelper::map($model->enabledVariants, 'sku', 'images', 'lang.title'); | |
26 | + $firstImage = [ | |
27 | + 'sku' => $variant->sku, | |
28 | + 'image' => '', | |
29 | + ]; | |
30 | + | |
31 | + $firstIteration = true; | |
32 | + foreach ($imageMap as $key => $item) { | |
33 | + $imageMap[ $key ] = array_filter($item); | |
34 | + foreach ($imageMap[ $key ] as $subKey => $subValue) { | |
35 | + foreach ($subValue as $subSubValue) { | |
36 | + if (!empty( $subSubValue )) { | |
37 | + $imageMap[ $key ][ $subKey ] = $subSubValue->imageUrl; | |
38 | + if ($firstIteration) { | |
39 | + $firstImage = [ | |
40 | + 'sku' => $subKey, | |
41 | + 'image' => $subSubValue->imageUrl, | |
42 | + ]; | |
43 | + } | |
44 | + $firstIteration = false; | |
45 | + break; | |
46 | + } | |
47 | + } | |
48 | + } | |
49 | + } | |
50 | + ?> | |
51 | + <div class="item_catalog"> | |
52 | + <div class="bg-status"> | |
53 | + <?php | |
54 | + if ($model->is_discount) { | |
55 | + echo Html::tag( | |
56 | + 'div', | |
57 | + Html::tag('span', \Yii::t('app', 'ะฐะบัะธั')), | |
58 | + [ | |
59 | + 'class' => 'sale_bg', | |
60 | + ] | |
61 | + ); | |
62 | + } | |
63 | + if ($model->is_top) { | |
64 | + echo Html::tag( | |
65 | + 'div', | |
66 | + Html::tag('span', \Yii::t('app', 'top')), | |
67 | + [ | |
68 | + 'class' => 'top_bg', | |
69 | + ] | |
70 | + ); | |
71 | + } | |
72 | + if ($model->is_new) { | |
73 | + echo Html::tag( | |
74 | + 'div', | |
75 | + Html::tag('span', \Yii::t('app', 'new')), | |
76 | + [ | |
77 | + 'class' => 'new_bg', | |
78 | + ] | |
79 | + ); | |
80 | + } | |
81 | + ?> | |
82 | + </div> | |
83 | + <div class="img style"> | |
84 | + <?php | |
85 | + echo Html::a( | |
86 | + ArtboxImageHelper::getImage( | |
87 | + $firstImage[ 'image' ], | |
88 | + 'category_item', | |
89 | + [ | |
90 | + 'alt' => $fullname, | |
91 | + 'title' => $fullname, | |
92 | + ], | |
93 | + 90, | |
94 | + true | |
95 | + ), | |
96 | + [ | |
97 | + 'catalog/product', | |
98 | + 'product' => $model->lang->alias, | |
99 | + 'variant' => $firstImage[ 'sku' ], | |
100 | + ], | |
101 | + [ | |
102 | + 'data-pjax' => 0, | |
103 | + 'title' => $fullname, | |
104 | + ] | |
105 | + ); | |
106 | + ?> | |
107 | + </div> | |
108 | + <?php | |
109 | + echo Html::a( | |
110 | + yii\helpers\StringHelper::truncate($fullname, 41), | |
111 | + [ | |
112 | + 'catalog/product', | |
113 | + 'product' => $model->lang->alias, | |
114 | + 'variant' => $variant->sku, | |
115 | + ], | |
116 | + [ | |
117 | + 'class' => 'style title_cat', | |
118 | + 'data-pjax' => 0, | |
119 | + 'title' => $model->lang->title, | |
120 | + ] | |
121 | + ); | |
122 | + ?> | |
123 | + <p class="style category_cat"> | |
124 | + <?php | |
125 | + echo !empty($model->brand) ?$model->brand->lang->title:''; | |
126 | + ?> | |
127 | + </p> | |
128 | + <div class="style price_cat"> | |
129 | + <?php | |
130 | + if (!empty( $variant->price_old )) { | |
131 | + ?> | |
132 | + <p> | |
133 | + <span class="price_cat-sale"><?php echo $variant->price_old; ?> <?= \Yii::t('app', 'hrn') ?></span> | |
134 | + <?php | |
135 | + echo $variant->price; | |
136 | + ?> | |
137 | + <span> ะณัะฝ.</span> | |
138 | + </p> | |
139 | + <div class="price_cat-sale_"> | |
140 | + -<?php echo round(100 - ( $variant->price * 100 / $variant->price_old )); ?> % | |
141 | + </div> | |
142 | + <?php | |
143 | + } else { | |
144 | + ?> | |
145 | + <p> | |
146 | + <?php | |
147 | + echo $variant->price; | |
148 | + ?> | |
149 | + <span> <?= \Yii::t('app', 'hrn') ?></span> | |
150 | + </p> | |
151 | + <?php | |
152 | + } | |
153 | + ?> | |
154 | + </div> | |
155 | + <div class="style buttons_cat-wr"> | |
156 | + <div class="buttons_cat"> | |
157 | + <?php | |
158 | + | |
159 | + echo Html::a( | |
160 | + \Yii::t('app', 'ะะพะดัะพะฑะฝะตะต'), | |
28 | 161 | [ |
29 | 162 | 'catalog/product', |
30 | - 'product' => $product->lang->alias, | |
163 | + 'product' => $model->lang->alias, | |
164 | + 'variant' => $variant->sku, | |
165 | + ], | |
166 | + [ | |
167 | + 'class' => 'btn_view_cat', | |
168 | + 'data-pjax' => 0, | |
31 | 169 | ] |
32 | - ) ?>"> | |
33 | - <?= ArtboxImageHelper::getImage( | |
34 | - $product->enabledVariants[ 0 ]->imageUrl, | |
35 | - 'list', | |
36 | - [ | |
37 | - 'alt' => $product->category->lang->title . ' ' . $product->fullname, | |
38 | - 'title' => $product->category->lang->title . ' ' . $product->fullname, | |
39 | - 'class' => 'selected', | |
40 | - ] | |
41 | - ) ?> | |
170 | + ); | |
171 | + ?> | |
172 | + <a class="btn_buy_cat<?php echo( $variant->stock ? '' : ' disabled' ); ?>" href="#" data-variant="<?php echo $variant->id; ?>"> | |
173 | + <?php | |
174 | + if ($variant->stock) { | |
175 | + ?> | |
176 | + <p><?= \Yii::t('app', 'buy') ?></p> | |
177 | + <?= \Yii::t('app', 'span_buy') ?> | |
178 | + <?php | |
179 | + } else { | |
180 | + echo \Yii::t('app', 'ะะตั ะฒ ะฝะฐะปะธัะธะธ'); | |
181 | + } | |
182 | + ?> | |
42 | 183 | </a> |
43 | - <div class="info_icons"> | |
44 | - <a href="#" class="btn buy_button" data-toggle="modal" data-target="#buyForm" data-id="<?= $product->variant->id; ?>" lang="145">ะัะฟะธัั</a> | |
45 | - <ul class="ul wishlike_block hidden"> | |
46 | - <li class="compare hidden"> | |
47 | - <a onclick="add2compare(); return false;" class="compare compare_text_link_3631483" href="#">ะ ััะฐะฒะฝะตะฝะธั</a> | |
48 | - <span class="icon"></span> | |
49 | - </li> | |
50 | - <li class="like hidden"> | |
51 | - <a class="like like_text_link_3631483" href="#">ะ ะธะทะฑัะฐะฝะฝะพะต</a><span class="icon"></span> | |
52 | - </li> | |
53 | - </ul> | |
54 | - </div> | |
55 | 184 | </div> |
56 | - <div class="price"> | |
57 | - <div class="dlexfduinxipi"> | |
58 | - ะฆะตะฝะฐ: | |
59 | - <span class="main"> | |
60 | - <?= $product->variant->price ?> | |
61 | - <span class="currency">ะณัะฝ</span> | |
62 | - </span> | |
63 | - </div> | |
64 | - </div> | |
65 | - <div class="additional_info params"> | |
66 | - <div class="block_title">ะัะพะฑะตะฝะฝะพััะธ</div> | |
67 | - <div class="descr"> | |
68 | - <div class="info"> | |
69 | - <ul class="sv"> | |
70 | - | |
71 | - <li><span>ะัะตะฝะด:</span> <?= $product->brand->lang->title ?></li> | |
72 | - | |
73 | - <?php foreach ($product->getProperties() as $group): ?> | |
74 | - <li> | |
75 | - <span><?= $group->lang->title ?> <?php foreach ( $group->customOptions as $option ) : ?> </span><?= $option->lang->value ?><?php endforeach ?> | |
76 | - </li> | |
77 | - <?php endforeach; ?> | |
78 | - | |
79 | - | |
80 | - </ul> | |
81 | - </div> | |
82 | - <div class="clearfix"></div> | |
83 | - </div> | |
84 | - <div class="price" style="display: none;"> | |
85 | - <div class="dlexfduinxipi"> | |
86 | - ะฆะตะฝะฐ: | |
87 | - <span class="main"> | |
185 | + </div> | |
186 | + </div> | |
187 | + <div class="additional_wr"> | |
188 | + <div class="additional_bg"> | |
189 | + <div class="addit_wr"> | |
190 | + <div class="addit_bl"><?php | |
191 | + echo Html::a( | |
192 | + '', | |
193 | + [ | |
194 | + 'catalog/product', | |
195 | + 'product' => $model->lang->alias, | |
196 | + 'variant' => $variant->sku, | |
197 | + '#' => 'video', | |
198 | + ], | |
199 | + [ | |
200 | + 'class' => 'videos_btn' . ( empty( $model->videos ) ? ' disabled' : '' ), | |
201 | + ] | |
202 | + ) | |
203 | + ?></div> | |
204 | + <div class="addit_bl"> | |
205 | + <div class="slider_cat-wr"> | |
206 | + <ul style="top:0" class="<?php | |
207 | + if (count($imageMap) > 3) { | |
208 | + echo "jcarousel jcarousel-skin-tango"; | |
209 | + } else { | |
210 | + echo "not-carousel"; | |
211 | + } | |
212 | + ?>"> | |
88 | 213 | <?php |
89 | - | |
90 | - echo '<div class="cost-block" itemprop="offers" itemscope itemtype="http://schema.org/Offer">'; | |
91 | - | |
92 | - // ะตััั ัะบะธะดะบะฐ | |
93 | - echo '<p class="cost">'; | |
94 | - if ($product->enabledVariants[ 0 ]->price_old != 0 && $product->enabledVariants[ 0 ]->price_old != $product->enabledVariants[ 0 ]->price) { | |
95 | - echo '<strike><span id=\'old_cost\' itemprop="price">' . $product->enabledVariants[ 0 ]->price_old . '</span> ะณัะฝ.</strike> '; | |
96 | - echo $product->enabledVariants[ 0 ]->price . ' <span>ะณัะฝ.</span></p>'; | |
97 | - } else { | |
98 | - echo '<span itemprop="price">' . $product->enabledVariants[ 0 ]->price . ' </span><span>ะณัะฝ.</span></p>'; | |
214 | + foreach ($imageMap as $item) { | |
215 | + if (!empty( $item )) { | |
216 | + echo Html::tag( | |
217 | + 'li', | |
218 | + Html::a( | |
219 | + ArtboxImageHelper::getImage( | |
220 | + '/storage/white.jpg', | |
221 | + 'category_thumb', | |
222 | + [ | |
223 | + 'alt' => $model->lang->title, | |
224 | + 'title' => $model->lang->title, | |
225 | + 'class' => 'artbox-lazy-event', | |
226 | + 'data-original' => ArtboxImageHelper::getImageSrc(current($item), 'category_thumb', null, 90), | |
227 | + ], | |
228 | + 10 | |
229 | + ), | |
230 | + [ | |
231 | + 'catalog/product', | |
232 | + 'product' => $model->lang->alias, | |
233 | + 'variant' => key($item), | |
234 | + ], | |
235 | + [ | |
236 | + 'data-pjax' => 0, | |
237 | + ] | |
238 | + ) | |
239 | + ); | |
99 | 240 | } |
100 | - echo '<meta itemprop="priceCurrency" content = "UAH">'; | |
101 | - echo '</div>'; | |
102 | - | |
241 | + } | |
103 | 242 | ?> |
104 | - </span> | |
243 | + </ul> | |
244 | + </div> | |
245 | + </div> | |
246 | + <div class="addit_bl"> | |
247 | + <div class="style addit_buttons"> | |
248 | + <?php | |
249 | + /* | |
250 | + ?> | |
251 | + <div><a class="btn_aside" href="#">ะพัะปะพะถะธัั</a></div> | |
252 | + <div><a class="btn_compare" href="#">ััะฐะฒะฝะธัั</a></div> | |
253 | + */ | |
254 | + ?> | |
105 | 255 | </div> |
106 | 256 | </div> |
107 | 257 | </div> |
108 | - <div class="opacity_bg"></div> | |
109 | 258 | </div> |
110 | 259 | </div> |
111 | -</div> | |
112 | 260 | \ No newline at end of file |
261 | + <?php $this->endCache(); }?> | |
113 | 262 | \ No newline at end of file | ... | ... |
widgets/views/products_block.php
1 | 1 | <?php |
2 | - use artweb\artbox\ecommerce\models\Product; | |
3 | - use yii\web\View; | |
4 | - | |
5 | - /** | |
6 | - * @var Product[] $products | |
7 | - */ | |
8 | -?> | |
9 | -<?php if(!empty( $products )) { ?> | |
10 | - <div class="_prd_spec-wr"> | |
11 | - <div class="special-products products<?= ( !empty( $class ) ? ' ' . $class : '' ) ?>"> | |
12 | - <span style="text-align: center; | |
13 | - text-transform: uppercase; | |
14 | - font-size: 20px; display: block; | |
15 | - -webkit-margin-before: 1em; | |
16 | - -webkit-margin-after: 1em; | |
17 | - -webkit-margin-start: 0; | |
18 | - -webkit-margin-end: 0; | |
19 | - font-weight: bold;"><?= $title ?></span> | |
20 | - <div id="<?= $class ?>"> | |
21 | - <?php foreach($products as $product) : ?> | |
22 | - <?= $this->render('product_smart', [ 'product' => $product ]); ?> | |
23 | - <?php endforeach ?> | |
2 | +if (!empty($products)) { | |
3 | + ?> | |
4 | + <div class="style slider-wr"> | |
5 | + <div class="container"> | |
6 | + <div class="row"> | |
7 | + <div class="col-xs-12" style="padding: 0;"> | |
8 | + <div class="style title_slider"> | |
9 | + <span><?= \Yii::t('app', $title) ?></span> | |
10 | + <div class="customNavigation"> | |
11 | + <div class="prev_btn"></div> | |
12 | + <div class="next_btn"></div> | |
13 | + </div> | |
14 | + </div> | |
15 | + <div class="style slider_"> | |
16 | + <div class="owl-carousel"> | |
17 | + <?php | |
18 | + foreach ($products as $item) { | |
19 | + echo \yii\helpers\Html::tag( | |
20 | + 'div', | |
21 | + $this->render( | |
22 | + 'product_smart', | |
23 | + [ | |
24 | + 'model' => $item, | |
25 | + ] | |
26 | + ), | |
27 | + [ | |
28 | + 'class' => 'catalog-wr', | |
29 | + ] | |
30 | + ); | |
31 | + } | |
32 | + ?> | |
33 | + </div> | |
34 | + </div> | |
35 | + </div> | |
24 | 36 | </div> |
25 | - <div class="both"></div> | |
26 | 37 | </div> |
27 | 38 | </div> |
28 | - <?php $js = "$('#$class').owlCarousel({ | |
29 | -navigation:true, | |
30 | -navigationText: [] | |
31 | -}) | |
32 | -"; | |
33 | - $this->registerJs($js, View::POS_READY); | |
34 | - ?> | |
35 | -<?php } ?> | |
36 | 39 | \ No newline at end of file |
40 | + <?php | |
41 | +} | |
42 | +?> | |
37 | 43 | \ No newline at end of file | ... | ... |