Blame view

common/models/Basket.php 5.75 KB
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
      }