Pārlūkot izejas kodu

Adding shopping basket

Richard Knight 6 gadi atpakaļ
vecāks
revīzija
099e8f5815

+ 82 - 5
src/SquarepayExtension.php

@@ -11,7 +11,7 @@ use Silex\Application;
 use Silex\ControllerCollection;
 
 use Symfony\Component\HttpFoundation\Request;
-use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\RedirectResponse;
 
 /**
  * Squarepay extension class.
@@ -46,7 +46,12 @@ class SquarepayExtension extends SimpleExtension
 		});
 
 		$app['twig.runtime.square'] = $app->share(function ($app) {
-			return new Twig\SquareTwigRuntime($app['square.apiClient'], $app['twig'], $this->getConfig());
+			return new Twig\SquareTwigRuntime(
+				$app['square.apiClient'],
+				$app['twig'],
+				$this->getConfig(),
+				$app['session']->get('basket')
+			);
 		});
 
 		$app['twig.runtimes'] = $app->extend(
@@ -62,6 +67,10 @@ class SquarepayExtension extends SimpleExtension
 
 	protected function registerFrontendRoutes(ControllerCollection $collection)
 	{
+        $collection->post ('/basket/add',    [$this, 'basketAdd']);
+        $collection->post ('/basket/remove', [$this, 'basketRemove']);
+        $collection->post ('/basket/update', [$this, 'basketUpdate']);
+        $collection->match('/basket/clear',  [$this, 'basketClear']);
 		$collection->match('/process-square', [$this, 'processSquarePaymentResponse']);
 	}
 	
@@ -94,13 +103,81 @@ class SquarepayExtension extends SimpleExtension
 	
 	protected function registerTwigFunctions() {
         $getCatalog = [Twig\SquareTwigRuntime::class, 'getCatalog'];
-        $cardform = [Twig\SquareTwigRuntime::class, 'displayCCForm'];
+        $getBasket 	= [Twig\SquareTwigRuntime::class, 'getBasket'];
+        $cardform 	= [Twig\SquareTwigRuntime::class, 'displayCCForm'];
 		return [
-			'getcatalog' => [ $getCatalog ],
-			'cardform' => [ $cardform, ['is_safe' => ['html']] ]
+			'getcatalog' 	=> [ $getCatalog ],
+			'getbasket'		=> [ $getBasket, ['is_safe' => ['html']] ],
+			'cardform' 		=> [ $cardform,  ['is_safe' => ['html']] ]
 		];
 	}
 
+	// -----------------------------------------------------------------------------------------------------------------
+	// BASKET
+
+	public function basketAdd(Application $app, Request $request)
+	{
+        $basket	= $app['session']->get('basket');
+		$sku	= $request->request->get('sku');
+		$name	= $request->request->get('name');
+		$price	= $request->request->get('price');
+		$key	= substr(md5($sku), 0, 10);
+		if (isset($basket[$key])) {
+			$basket[$key]['quantity']++;
+			$basket[$key]['total'] = $basket[$key]['quantity'] * $basket[$key]['price'];
+		} else {
+			$basket[$key] = [
+				'sku'		=> $sku,
+				'name'		=> $name,
+				'price'		=> $price,
+				'quantity'	=> 1,
+				'total'		=> $price
+			];
+		}
+        $app['session']->set('basket', $basket);
+        return new RedirectResponse('/basket');
+	}
+
+	public function basketUpdate(Application $app, Request $request)
+	{
+		$basket	= $app['session']->get('basket');
+		$sku	= $request->request->get('sku');
+		$action	= $request->request->get('action');
+		$key	= substr(md5($sku), 0, 10);
+		if (isset($basket[$key])) {
+			if ($action === '+') {
+				$basket[$key]['quantity']++;
+			} else {
+				$basket[$key]['quantity']--;
+			}
+			$basket[$key]['total'] = $basket[$key]['quantity'] * $basket[$key]['price'];
+			if ($basket[$key]['quantity'] === 0) {
+				unset($basket[$key]);
+			} 
+		}
+        $app['session']->set('basket', $basket);
+        return new RedirectResponse('/basket');
+	}
+
+	public function basketRemove(Application $app, Request $request)
+	{
+        $basket	= $app['session']->get('basket');
+		$sku	= $request->request->get('sku');
+		$key	= substr(md5($sku), 0, 10);
+		unset($basket[$key]);
+        $app['session']->set('basket', $basket);
+        return new RedirectResponse('/basket');
+	}
+
+	public function basketClear(Application $app)
+	{
+        $app['session']->remove('basket');
+        return new RedirectResponse('/basket');
+	}
+
+	// -----------------------------------------------------------------------------------------------------------------
+	// SQUARE PAYMENT PROCESSING
+
 	public function processSquarePaymentResponse() {
 		// TODO
 	}

+ 10 - 1
src/Twig/SquareTwigRuntime.php

@@ -14,11 +14,12 @@ class SquareTwigRuntime
 {
     private $apiClient;
 
-	public function __construct($apiClient, $twig, $config)
+	public function __construct($apiClient, $twig, $config, $basket)
 	{
 		$this->apiClient = $apiClient;
 		$this->twig = $twig;
 		$this->config = $config;
+		$this->basket = $basket;
 	}
 
 	public function getCatalog()
@@ -39,6 +40,14 @@ class SquareTwigRuntime
 		return $response;
 	}
 	
+	public function getBasket()
+	{
+		return [
+			'basket' => $this->basket,
+			'total'  => array_sum(array_column($this->basket, 'total'))
+		];
+	}
+	
 	public function displayCCForm() {
 		$context = $this->config + [
 			'testmode' => true

+ 4 - 1
templates/frontend/cardentryform.twig

@@ -27,5 +27,8 @@ var locationId = '{{ testmode ? sq_sandbox_location_id : sq_location_id }}';
 		<label>Postcode</label>
 		<div id="sq-postal-code"></div>
 	</div>
-	<button class="cc-pay" onclick="requestCardNonce(event)">PAY NOW</button>
+	<div class="cc-row">
+		<label></label>
+		<a class="ecom-button" onclick="requestCardNonce(event)">Complete Order</a>
+	</div>
 </div>