Корзина пуста
diff --git a/common/config/main.php b/common/config/main.php index 1003a10..4b8d4b5 100755 --- a/common/config/main.php +++ b/common/config/main.php @@ -157,6 +157,9 @@ return [ ], ] ], + 'basket' => [ + 'class' => 'common\models\Basket', + ], ], 'modules' => [ diff --git a/common/models/Basket.php b/common/models/Basket.php new file mode 100644 index 0000000..20848c1 --- /dev/null +++ b/common/models/Basket.php @@ -0,0 +1,129 @@ +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(); + } + + public function getModal(): string + { + $output = ''; + $data = $this->getData(); + $models = $this->findModels(array_keys($this->getData())); + if(!empty( $models )) { + $output = \Yii::$app->view->renderFile('@frontend/views/basket/modal_items.php', [ + 'models' => $models, + 'basket' => $this, + ]); + } + return $output; + } + } \ No newline at end of file diff --git a/common/modules/product/controllers/ManageController.php b/common/modules/product/controllers/ManageController.php index 1c04be5..a799a6b 100755 --- a/common/modules/product/controllers/ManageController.php +++ b/common/modules/product/controllers/ManageController.php @@ -80,7 +80,7 @@ class ManageController extends Controller public function actionCreate() { $model = new Product(); - + if ($model->load(Yii::$app->request->post())) { $model->imagesUpload = UploadedFile::getInstances($model, 'imagesUpload'); diff --git a/frontend/assets/AppAsset.php b/frontend/assets/AppAsset.php index b9f42f4..a02356f 100755 --- a/frontend/assets/AppAsset.php +++ b/frontend/assets/AppAsset.php @@ -23,7 +23,9 @@ class AppAsset extends AssetBundle ]; public $js = [ 'js/js_head.js', - 'js/js_footer.js' + //'js/js_footer.js', + '/js/artbox_basket.js', + 'js/script.js', ]; public $depends = [ 'yii\web\JqueryAsset', diff --git a/frontend/controllers/BasketController.php b/frontend/controllers/BasketController.php new file mode 100755 index 0000000..fa79a46 --- /dev/null +++ b/frontend/controllers/BasketController.php @@ -0,0 +1,59 @@ +response; + $response->format = Response::FORMAT_JSON; + /** + * @var Basket $basket + */ + $basket = \Yii::$app->basket; + $result = [ + 'basket' => $basket->getData(), + ]; + return $result; + } + public function actionAdd(int $product_variant_id, int $count) { + $response = \Yii::$app->response; + $response->format = Response::FORMAT_JSON; + /** + * @var Basket $basket + */ + $basket = \Yii::$app->basket; + $basket->add($product_variant_id, $count); + $result = [ + 'basket' => $basket->getData(), + 'modal' => $basket->getModal(), + ]; + return $result; + } + public function actionSet(int $product_variant_id, int $count) { + $response = \Yii::$app->response; + $response->format = Response::FORMAT_JSON; + /** + * @var Basket $basket + */ + $basket = \Yii::$app->basket; + $basket->set($product_variant_id, $count); + $result = [ + 'basket' => $basket->getData(), + 'modal' => $basket->getModal(), + ]; + return $result; + } + public function actionTest() { + /** + * @var Basket $basket + */ + $basket = \Yii::$app->basket; + $modal = $basket->getModal(); + return $modal; + } +} diff --git a/frontend/controllers/CatalogController.php b/frontend/controllers/CatalogController.php index f80b514..afe354c 100755 --- a/frontend/controllers/CatalogController.php +++ b/frontend/controllers/CatalogController.php @@ -125,6 +125,7 @@ class CatalogController extends \yii\web\Controller */ $query = $productProvider->query; $query->with([ + 'variant', 'comments', 'averageRating', ]); diff --git a/frontend/views/basket/modal_items.php b/frontend/views/basket/modal_items.php new file mode 100644 index 0000000..a32e3dc --- /dev/null +++ b/frontend/views/basket/modal_items.php @@ -0,0 +1,96 @@ + +