<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Plugin\Karte;
use Eccube\Entity\Cart;
use Eccube\Entity\Customer;
use Eccube\Entity\Order;
use Eccube\Entity\OrderItem;
use Eccube\Entity\Page;
use Eccube\Entity\ProductCategory;
use Eccube\Event\TemplateEvent;
use Plugin\Karte\Repository\KarteConfigRepository;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Twig\Environment;
class KarteEvent implements EventSubscriberInterface
{
/**
* @var KarteConfigRepository
*/
protected $karteConfigRepository;
/**
* @var Environment
*/
protected $twig;
/**
* @var ContainerInterface
*/
protected $container;
/**
* @param ContainerInterface $container
* @param KarteConfigRepository $karteConfigRepository
* @param Environment $twig
*/
public function __construct(ContainerInterface $container,
KarteConfigRepository $karteConfigRepository,
Environment $twig)
{
$this->karteConfigRepository = $karteConfigRepository;
$this->twig = $twig;
$this->container = $container;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'default_frame.twig' => 'head',
];
}
/**
* @param TemplateEvent $event
*/
public function head(TemplateEvent $event)
{
$source = $this->twig->getLoader()
->getSourceContext('@Karte/tag/head.twig')
->getCode();
/** @var Page $page */
$page = $event->getParameter('Page');
$userAge = null;
/** @var Customer $user */
$user = $this->getUser();
if ($user && $user->getBirth()) {
$userAge = $user->getBirth()->diff(new \DateTime())->y;
}
$event->setParameter('PlgKarteConfig', $this->karteConfigRepository->get());
$event->setParameter('PlgKarteUserAge', $userAge);
$data = $event->getSource();
switch ($page->getUrl()) {
case 'cart':
/** @var Cart[] $Carts */
$Carts = $event->getParameter('Carts');
$productCategory = [];
$PlgKarteTotalPrice = 0;
$PlgKarteTotalQuantity = 0;
foreach ($Carts as $cart) {
$PlgKarteTotalQuantity += $cart->getTotalQuantity();
foreach ($cart->getItems() as $item) {
$PlgKarteTotalPrice += $item->getProductClass()->getPrice02() * $item->getQuantity();
if (!array_key_exists($item->getProductClass()->getProduct()->getId(), $productCategory)) {
/** @var []ProductCategory $pcs */
$pcs = $item->getProductClass()->getProduct()->getProductCategories();
foreach ($pcs as $pc) {
$productCategory[$pc->getProductId()] = $pc->getCategory()->getName();
break;
}
}
}
}
$event->setParameter('PlgKarteProductCategory', $productCategory);
$event->setParameter('PlgKarteTotalPrice', $PlgKarteTotalPrice);
$event->setParameter('PlgKarteTotalQuantity', $PlgKarteTotalQuantity);
break;
case 'shopping_complete':
$productCategory = [];
$revenue = 0;
$shipping = 0;
/** @var Order $Order */
$Order = $event->getParameter('Order');
$revenueTotal = 0;
/** @var OrderItem $item */
foreach ($Order->getItems() as $item) {
if ($item->isProduct()) {
$revenue += $item->getQuantity() * $item->getPrice();
$revenueTotal += $item->getTotalPrice();
if (!array_key_exists($item->getProduct()->getId(), $productCategory)) {
/** @var []ProductCategory $pcs */
$pcs = $item->getProduct()->getProductCategories();
foreach ($pcs as $pc) {
$productCategory[$pc->getProductId()] = $pc->getCategory()->getName();
break;
}
}
} else if ($item->isDeliveryFee()) {
$shipping = $item->getTotalPrice();
}
}
$event->setParameter('PlgKarteProductCategory', $productCategory);
$event->setParameter('PlgKarteRevenue', $revenue);
$event->setParameter('PlgKarteShipping', $shipping);
$event->setParameter('PlgKarteTax', $revenueTotal - $revenue);
break;
}
$event->setSource(str_replace('</head>', $source . "\n</head>", $data));
}
protected function getUser()
{
if (!$this->container->has('security.token_storage')) {
throw new \LogicException('The SecurityBundle is not registered in your application. Try running "composer require symfony/security-bundle".');
}
if (null === $token = $this->container->get('security.token_storage')->getToken()) {
return null;
}
if (!\is_object($user = $token->getUser())) {
// e.g. anonymous authentication
return null;
}
return $user;
}
}