d8c1a2e0
Yarik
Big commit artbox
|
1
2
3
4
5
6
7
8
|
<?php
namespace common\models;
use common\modules\product\models\ProductVariant;
use yii\base\Component;
use yii\web\NotFoundHttpException;
|
c70f24ea
Yarik
For Leha commit.
|
9
10
11
12
13
|
/**
* Class Basket to work with basket
*
* @package common\models
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
14
15
|
class Basket extends Component
{
|
c70f24ea
Yarik
For Leha commit.
|
16
17
18
19
20
|
/**
* Session object
*
* @var \yii\web\Session
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
21
22
|
public $session;
|
c70f24ea
Yarik
For Leha commit.
|
23
24
25
26
27
28
|
/**
* Basket constructor.
* Check for basket variable in session and set it to empty array if not exist.
*
* @param array $config
*/
|
d55d2fe0
Yarik
Multilanguage
|
29
|
public function __construct(array $config = [])
|
d8c1a2e0
Yarik
Big commit artbox
|
30
31
|
{
$this->session = \Yii::$app->session;
|
c70f24ea
Yarik
For Leha commit.
|
32
|
if (!$this->session->has('basket')) {
|
d55d2fe0
Yarik
Multilanguage
|
33
|
$this->session->set('basket', []);
|
d8c1a2e0
Yarik
Big commit artbox
|
34
35
36
37
|
}
parent::__construct($config);
}
|
c70f24ea
Yarik
For Leha commit.
|
38
39
40
41
42
|
/**
* Increment product variant with $product_variant_id count by 1
*
* @param int $product_variant_id
*/
|
cc658b4c
Yarik
Big commit
|
43
|
public function add(int $product_variant_id)
|
d8c1a2e0
Yarik
Big commit artbox
|
44
45
|
{
$data = $this->getData();
|
c70f24ea
Yarik
For Leha commit.
|
46
47
48
49
50
|
if (array_key_exists($product_variant_id, $data)) {
if ($data[ $product_variant_id ][ 'count' ] <= 0) {
$data[ $product_variant_id ] = 1;
} else {
$data[ $product_variant_id ][ 'count' ] += 1;
|
d8c1a2e0
Yarik
Big commit artbox
|
51
52
|
}
} else {
|
c70f24ea
Yarik
For Leha commit.
|
53
|
if ($this->findModel($product_variant_id)) {
|
cc658b4c
Yarik
Big commit
|
54
55
56
57
|
$data[ $product_variant_id ] = [
'count' => 1,
];
}
|
d8c1a2e0
Yarik
Big commit artbox
|
58
59
60
|
}
$this->setData($data);
}
|
d55d2fe0
Yarik
Multilanguage
|
61
|
|
c70f24ea
Yarik
For Leha commit.
|
62
63
64
65
66
67
|
/**
* Set product variant with $product_variant_id to $count
*
* @param int $product_variant_id
* @param int $count
*/
|
cc658b4c
Yarik
Big commit
|
68
|
private function set(int $product_variant_id, int $count)
|
d8c1a2e0
Yarik
Big commit artbox
|
69
70
|
{
$data = $this->getData();
|
c70f24ea
Yarik
For Leha commit.
|
71
|
if (array_key_exists($product_variant_id, $data)) {
|
d8c1a2e0
Yarik
Big commit artbox
|
72
|
$data[ $product_variant_id ][ 'count' ] = $count;
|
c70f24ea
Yarik
For Leha commit.
|
73
|
if ($data[ $product_variant_id ][ 'count' ] <= 0) {
|
d55d2fe0
Yarik
Multilanguage
|
74
|
unset( $data[ $product_variant_id ] );
|
d8c1a2e0
Yarik
Big commit artbox
|
75
|
}
|
c70f24ea
Yarik
For Leha commit.
|
76
77
|
} elseif ($count > 0) {
if ($this->findModel($product_variant_id)) {
|
cc658b4c
Yarik
Big commit
|
78
79
80
81
|
$data[ $product_variant_id ] = [
'count' => $count,
];
}
|
d8c1a2e0
Yarik
Big commit artbox
|
82
83
84
85
|
}
$this->setData($data);
}
|
c70f24ea
Yarik
For Leha commit.
|
86
87
88
89
90
|
/**
* Delete product variant with $product_variant_id from basket
*
* @param int $product_variant_id
*/
|
d55d2fe0
Yarik
Multilanguage
|
91
92
|
public function delete(int $product_variant_id)
{
|
cc658b4c
Yarik
Big commit
|
93
94
95
|
$this->set($product_variant_id, 0);
}
|
c70f24ea
Yarik
For Leha commit.
|
96
97
98
99
100
|
/**
* Get basket data
*
* @return array
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
101
102
103
104
105
|
public function getData(): array
{
return $this->session->get('basket');
}
|
c70f24ea
Yarik
For Leha commit.
|
106
107
108
109
110
111
112
|
/**
* Get basket item with $product_variant_id. Returns false if item not in basket.
*
* @param int $product_variant_id
*
* @return bool|array
*/
|
d55d2fe0
Yarik
Multilanguage
|
113
114
|
public function getItem(int $product_variant_id)
{
|
d8c1a2e0
Yarik
Big commit artbox
|
115
|
$data = $this->getData();
|
c70f24ea
Yarik
For Leha commit.
|
116
|
if (!empty( $data[ $product_variant_id ] )) {
|
d55d2fe0
Yarik
Multilanguage
|
117
|
return $data[ $product_variant_id ];
|
d8c1a2e0
Yarik
Big commit artbox
|
118
119
120
121
122
|
} else {
return false;
}
}
|
c70f24ea
Yarik
For Leha commit.
|
123
124
125
126
127
|
/**
* Set basket data
*
* @param array $data
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
128
129
130
131
132
|
public function setData(array $data)
{
$this->session->set('basket', $data);
}
|
c70f24ea
Yarik
For Leha commit.
|
133
134
135
136
137
|
/**
* Get count of product variants in basket
*
* @return int
*/
|
d55d2fe0
Yarik
Multilanguage
|
138
139
|
public function getCount(): int
{
|
d8c1a2e0
Yarik
Big commit artbox
|
140
141
142
143
|
$data = $this->getData();
return count($data);
}
|
c70f24ea
Yarik
For Leha commit.
|
144
145
146
147
148
149
150
151
|
/**
* Find Product Variant by $product_variant_id
*
* @param int $product_variant_id
*
* @return \common\modules\product\models\ProductVariant
* @throws \yii\web\NotFoundHttpException
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
152
153
|
public function findModel(int $product_variant_id): ProductVariant
{
|
cc658b4c
Yarik
Big commit
|
154
155
156
|
/**
* @var ProductVariant $model
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
157
|
$model = ProductVariant::find()
|
4428da8c
Yarik
Almost all databa...
|
158
|
->where([ 'product_variant.id' => $product_variant_id ])
|
d55d2fe0
Yarik
Multilanguage
|
159
|
->joinWith('lang', true, 'INNER JOIN')
|
d8c1a2e0
Yarik
Big commit artbox
|
160
|
->one();
|
c70f24ea
Yarik
For Leha commit.
|
161
|
if (empty( $model )) {
|
d55d2fe0
Yarik
Multilanguage
|
162
|
throw new NotFoundHttpException(\Yii::t('app', 'Product not found'));
|
d8c1a2e0
Yarik
Big commit artbox
|
163
164
165
166
167
|
} else {
return $model;
}
}
|
c70f24ea
Yarik
For Leha commit.
|
168
169
170
171
172
173
174
|
/**
* Find all Product Variants filtered by $product_variant_ids
*
* @param array $product_variant_ids
*
* @return ProductVariant[]
*/
|
d8c1a2e0
Yarik
Big commit artbox
|
175
176
177
|
public function findModels(array $product_variant_ids)
{
return ProductVariant::find()
|
4428da8c
Yarik
Almost all databa...
|
178
|
->where([ 'product_variant.id' => $product_variant_ids ])
|
d55d2fe0
Yarik
Multilanguage
|
179
|
->joinWith('lang', true, 'INNER JOIN')
|
c70f24ea
Yarik
For Leha commit.
|
180
181
182
183
184
185
|
->with(
[
'product',
'image',
]
)
|
d8c1a2e0
Yarik
Big commit artbox
|
186
187
188
|
->all();
}
|
c70f24ea
Yarik
For Leha commit.
|
189
190
191
|
/**
* Clear basket
*/
|
cc658b4c
Yarik
Big commit
|
192
193
194
195
196
|
public function clear()
{
$this->setData([]);
}
|
c70f24ea
Yarik
For Leha commit.
|
197
198
|
}
|