Blame view

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