Basket.php
3.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?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);
        }
        
        public function add(int $product_variant_id, int $count)
        {
            $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);
        }
    
        public function set(int $product_variant_id, int $count)
        {
            $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);
        }
        
        public function getData(): array
        {
            return $this->session->get('basket');
        }
        
        public function getItem(int $product_variant_id) {
            $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);
        }
        
        public function getSum(): float
        {
            $data = $this->getData();
            $sum = 0;
            foreach($data as $item) {
                $sum += $item[ 'price' ] * $item[ 'count' ];
            }
            return $sum;
        }
        
        public function getCount(): int {
            $data = $this->getData();
            return count($data);
        }
        
        public function findModel(int $product_variant_id): ProductVariant
        {
            $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();
        }
        
    } 
