Blame view

common/models/Basket.php 3.87 KB
d8c1a2e0   Yarik   Big commit artbox
1
2
3
4
5
6
7
8
9
10
11
12
13
  <?php
      
      namespace common\models;
      
      use common\modules\product\models\ProductVariant;
      use yii\base\Component;
      use yii\web\NotFoundHttpException;
      
      class Basket extends Component
      {
          
          public $session;
          
d55d2fe0   Yarik   Multilanguage
14
          public function __construct(array $config = [])
d8c1a2e0   Yarik   Big commit artbox
15
16
17
          {
              $this->session = \Yii::$app->session;
              if(!$this->session->has('basket')) {
d55d2fe0   Yarik   Multilanguage
18
                  $this->session->set('basket', []);
d8c1a2e0   Yarik   Big commit artbox
19
20
21
22
              }
              parent::__construct($config);
          }
          
cc658b4c   Yarik   Big commit
23
          public function add(int $product_variant_id)
d8c1a2e0   Yarik   Big commit artbox
24
25
26
          {
              $data = $this->getData();
              if(array_key_exists($product_variant_id, $data)) {
cc658b4c   Yarik   Big commit
27
                  $data[ $product_variant_id ][ 'count' ] = 1;
d55d2fe0   Yarik   Multilanguage
28
29
                  if($data[ $product_variant_id ][ 'count' ] <= 0) {
                      unset( $data[ $product_variant_id ] );
d8c1a2e0   Yarik   Big commit artbox
30
31
                  }
              } else {
cc658b4c   Yarik   Big commit
32
33
34
35
36
                  if($this->findModel($product_variant_id)) {
                      $data[ $product_variant_id ] = [
                          'count' => 1,
                      ];
                  }
d8c1a2e0   Yarik   Big commit artbox
37
38
39
              }
              $this->setData($data);
          }
d55d2fe0   Yarik   Multilanguage
40
          
cc658b4c   Yarik   Big commit
41
          private function set(int $product_variant_id, int $count)
d8c1a2e0   Yarik   Big commit artbox
42
43
44
45
          {
              $data = $this->getData();
              if(array_key_exists($product_variant_id, $data)) {
                  $data[ $product_variant_id ][ 'count' ] = $count;
d55d2fe0   Yarik   Multilanguage
46
47
                  if($data[ $product_variant_id ][ 'count' ] <= 0) {
                      unset( $data[ $product_variant_id ] );
d8c1a2e0   Yarik   Big commit artbox
48
                  }
cc658b4c   Yarik   Big commit
49
50
51
52
53
54
              } elseif($count > 0) {
                  if($this->findModel($product_variant_id)) {
                      $data[ $product_variant_id ] = [
                          'count' => $count,
                      ];
                  }
d8c1a2e0   Yarik   Big commit artbox
55
56
57
58
              }
              $this->setData($data);
          }
          
d55d2fe0   Yarik   Multilanguage
59
60
          public function delete(int $product_variant_id)
          {
cc658b4c   Yarik   Big commit
61
62
63
              $this->set($product_variant_id, 0);
          }
          
d8c1a2e0   Yarik   Big commit artbox
64
65
66
67
68
          public function getData(): array
          {
              return $this->session->get('basket');
          }
          
d55d2fe0   Yarik   Multilanguage
69
70
          public function getItem(int $product_variant_id)
          {
d8c1a2e0   Yarik   Big commit artbox
71
              $data = $this->getData();
d55d2fe0   Yarik   Multilanguage
72
73
              if(!empty( $data[ $product_variant_id ] )) {
                  return $data[ $product_variant_id ];
d8c1a2e0   Yarik   Big commit artbox
74
75
76
77
78
79
80
81
82
83
              } else {
                  return false;
              }
          }
          
          public function setData(array $data)
          {
              $this->session->set('basket', $data);
          }
          
d55d2fe0   Yarik   Multilanguage
84
85
          public function getCount(): int
          {
d8c1a2e0   Yarik   Big commit artbox
86
87
88
89
90
91
              $data = $this->getData();
              return count($data);
          }
          
          public function findModel(int $product_variant_id): ProductVariant
          {
cc658b4c   Yarik   Big commit
92
93
94
              /**
               * @var ProductVariant $model
               */
d8c1a2e0   Yarik   Big commit artbox
95
              $model = ProductVariant::find()
d55d2fe0   Yarik   Multilanguage
96
97
                                     ->where([ 'product_variant.product_variant_id' => $product_variant_id ])
                                     ->joinWith('lang', true, 'INNER JOIN')
d8c1a2e0   Yarik   Big commit artbox
98
99
                                     ->one();
              if(empty( $model )) {
d55d2fe0   Yarik   Multilanguage
100
                  throw new NotFoundHttpException(\Yii::t('app', 'Product not found'));
d8c1a2e0   Yarik   Big commit artbox
101
102
103
104
105
106
107
108
              } else {
                  return $model;
              }
          }
          
          public function findModels(array $product_variant_ids)
          {
              return ProductVariant::find()
d55d2fe0   Yarik   Multilanguage
109
110
                                   ->where([ 'product_variant.product_variant_id' => $product_variant_ids ])
                                   ->joinWith('lang', true, 'INNER JOIN')
d8c1a2e0   Yarik   Big commit artbox
111
112
113
114
115
116
117
                                   ->with([
                                       'product',
                                       'image',
                                   ])
                                   ->all();
          }
          
cc658b4c   Yarik   Big commit
118
119
120
121
122
          public function clear()
          {
              $this->setData([]);
          }
          
d8c1a2e0   Yarik   Big commit artbox
123
      }