From: Stephen Cameron Date: Wed, 14 Aug 2019 15:50:46 +0000 (+0200) Subject: Cart and quote functionality. WIP #2769 @6 X-Git-Url: http://git.cubedesigners.com/?a=commitdiff_plain;h=999488068ffe781941d9ce84771cb02b4131614b;p=pmi.git Cart and quote functionality. WIP #2769 @6 --- diff --git a/app/Http/Controllers/AjaxController.php b/app/Http/Controllers/AjaxController.php index ab07625..e9a2161 100644 --- a/app/Http/Controllers/AjaxController.php +++ b/app/Http/Controllers/AjaxController.php @@ -14,10 +14,8 @@ use Illuminate\Support\Facades\Validator; class AjaxController extends CubistFrontController { - public function mailform(Request $request) - { - $response = []; - + // Shared validation logic for dynamic CMS forms + protected function _validate_form(Request $request) { $data = $request->all(); /** @var PageData $page */ $page = Page::find($data['page'])->getPageData(); @@ -46,6 +44,14 @@ class AjaxController extends CubistFrontController $validator->validate(); $validatedData = $validator->validated(); + + return $validatedData; + } + + public function mailform(Request $request) + { + $validatedData = $this->_validate_form($request); + $contents = []; foreach ($labels as $key => $label) { if (isset($validatedData[$key])) { @@ -131,6 +137,17 @@ class AjaxController extends CubistFrontController return Product::getCartData(); } + public function request_quote(Request $request) { + + // Array of product IDs => quantity + $cartData = (array) json_decode($request->input('cart_data')); + + // Validated form fields + $validatedData = $this->_validate_form($request); + + // Todo: save this data to db using quotes model, then send a notification e-mail with link to new record in the backend + } + // Subscribe to newsletter via MailChimp API public function newsletter(Request $request) { diff --git a/public/images/icon-cart.svg b/public/images/icon-cart.svg index ae494fe..8700209 100644 --- a/public/images/icon-cart.svg +++ b/public/images/icon-cart.svg @@ -1,11 +1 @@ - - - - - - - - - - - + diff --git a/resources/js/app.js b/resources/js/app.js index b9759ab..d396607 100644 --- a/resources/js/app.js +++ b/resources/js/app.js @@ -66,6 +66,10 @@ const app = new Vue({ cartItemCount() { // Todo: See if this should count just number of items or make a sum of all quantities? What is more useful? The sum of quantities can be found using map/reduce functions but this needs to be adapted for the object structure using Object.keys as the source. return Object.keys(this.items).length; + }, + + cartData() { + return JSON.stringify(this.items.reduce((obj, item) => Object.assign(obj, { [item.id]: item.quantity }), {})); } }, diff --git a/resources/js/components/CartItem.vue b/resources/js/components/CartItem.vue index 09753f5..ed3ec7c 100644 --- a/resources/js/components/CartItem.vue +++ b/resources/js/components/CartItem.vue @@ -1,6 +1,6 @@