<?php
namespace Plugin\Synplgbase;
use Eccube\Event\TemplateEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Eccube\Entity\Block;
use Eccube\Repository\BlockRepository;
use Plugin\Synplgbase\Repository\ConfigRepository;
use Eccube\Util\CacheUtil;
use Symfony\Component\HttpFoundation\Request;
use Eccube\Event\EccubeEvents;
use Eccube\Event\EventArgs;
use Symfony\Component\Validator\Constraints\DateTime;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Repository\BaseInfoRepository;
use Eccube\Repository\PluginRepository;
use Plugin\Synplgbase\Entity\PointHistory;
use Plugin\Synplgbase\Repository\PointHistoryRepository;
use Eccube\Repository\CustomerRepository;
use Symfony\Component\Workflow\Event\Event as WorkflowEvent;
use Eccube\Entity\ProductClass;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Routing\Route;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Exception\RouteNotFoundException;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Routing\Generator\UrlGenerator;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Eccube\Repository\PageRepository;
use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Twig\Environment;
use Eccube\Request\Context;
use Eccube\Entity\Master\DeviceType;
use SunCat\MobileDetectBundle\DeviceDetector\MobileDetector;
use Eccube\Entity\Layout;
use Eccube\Entity\PageLayout;
use Eccube\Repository\LayoutRepository;
use Eccube\Repository\PageLayoutRepository;
use Eccube\Common\Constant;
use Eccube\Entity\Customer;
use Eccube\Service\OrderHelper;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Eccube\Repository\Master\SexRepository;
use Eccube\Service\MailService;
use Eccube\Entity\Master\CustomerStatus;
use Plugin\Synplgbase\Entity\CsvType;
use Plugin\Synplgbase\Repository\CsvTypeRepository;
use Eccube\Entity\Delivery;
use Plugin\Synplgbase\Entity\DeliveryFeeAdvance;
use Plugin\Synplgbase\Repository\DeliveryFeeAdvanceRepository;
use Symfony\Component\Form\FormFactoryInterface;
use Eccube\Form\Type\Admin\DeliveryType;
use Symfony\Component\Form\Forms;
class Event implements EventSubscriberInterface
{
/**
* @var PageRepository
*/
protected $pageRepository;
/**
* @var BlockRepository
*/
protected $blockRepository;
/**
* @var ConfigRepository
*/
protected $configRepository;
/**
* @var CacheUtil
*/
protected $cacheUtil;
/**
* @var AuthorizationChecker
*/
protected $authorizationChecker;
/**
* @var EntityManagerInterface
*/
protected $entityManagerInterface;
/**
* @var EccubeConfig
*/
protected $eccubeConfig;
/**
* @var BaseInfoRepository
*/
protected $baseInfoRepository;
/**
* @var PluginRepository
*/
protected $pluginRepository;
/**
* @var PointHistory
*/
protected $pointHistory;
/**
* @var PointHistoryRepository
*/
protected $pointHistoryRepository;
/**
* @var CustomerRepository
*/
protected $customerRepository;
/**
* @var RouterInterface
*/
protected $routerInterface;
/**f
* @var UrlMatcherInterface
*/
protected $urlMatcherInterface;
/**
* @var ContainerInterface
*/
protected $containerInterface ;
/**
* @var Environment
*/
protected $twig;
/**
* @var Context
*/
protected $requestContext;
/**
* @var MobileDetector
*/
private $mobileDetector;
/**
* @var PageLayoutRepository
*/
protected $pageLayoutRepository;
/**
* @var LayoutRepository
*/
private $layoutRepository;
/**
* @var SessionInterface
*/
protected $session;
/**
* @var SexRepository
*/
protected $sexRepository;
/**
* @var MailService
*/
protected $mailService;
/**
* @var CsvTypeRepository
*/
protected $csvTypeRepository;
/**
* @var DeliveryFeeAdvanceRepository
*/
protected $deliveryFeeAdvanceRepository;
/**
* @var FormFactoryInterface
*/
protected $formFactory;
/**
* Event constructor.
*
* @param PageRepository $pageRepository
* @param BlockRepository $blockRepository
* @param ConfigRepository $configRepository
* @param CacheUtil $cacheUtil
* @param AuthorizationChecker $authorizationChecker
* @param EntityManagerInterface $entityManagerInterface
* @param EccubeConfig $eccubeConfig
* @param BaseInfoRepository $baseInfoRepository
* @param PluginRepository $pluginRepository
* @param PointHistory $pointHistory
* @param PointHistoryRepository $pointHistoryRepository
* @param CustomerRepository $customerRepository
* @param RouterInterface $routerInterface
* @param UrlMatcherInterface|RequestMatcherInterface $urlMatcher The URL or Request matcher
* @param ContainerInterface $containerInterface
* @param Environment $twig
* @param Context $context
* @param MobileDetector $mobileDetector
* @param PageLayoutRepository $pageLayoutRepository
* @param LayoutRepository $layoutRepository
* @param SessionInterface $session
* @param SexRepository $sexRepository
* @param MailService $mailService
* @param CsvTypeRepository $csvTypeRepository
* @param DeliveryFeeAdvanceRepository $deliveryFeeAdvanceRepository
* @param FormFactoryInterface $formFactory
*
* @throws \InvalidArgumentException
*/
public function __construct(
PageRepository $pageRepository,
BlockRepository $blockRepository,
ConfigRepository $configRepository,
CacheUtil $cacheUtil,
AuthorizationChecker $authorizationChecker,
EntityManagerInterface $entityManagerInterface,
EccubeConfig $eccubeConfig,
BaseInfoRepository $baseInfoRepository,
PluginRepository $pluginRepository,
PointHistory $pointHistory,
PointHistoryRepository $pointHistoryRepository,
CustomerRepository $customerRepository,
RouterInterface $routerInterface,
UrlMatcherInterface $urlMatcherInterface,
ContainerInterface $containerInterface,
Environment $twig,
Context $context,
MobileDetector $mobileDetector,
PageLayoutRepository $pageLayoutRepository,
LayoutRepository $layoutRepository,
SessionInterface $session,
SexRepository $sexRepository,
MailService $mailService,
CsvTypeRepository $csvTypeRepository,
DeliveryFeeAdvanceRepository $deliveryFeeAdvanceRepository,
FormFactoryInterface $formFactory)
{
$this->pageRepository = $pageRepository;
$this->blockRepository = $blockRepository;
$this->configRepository = $configRepository;
$this->cacheUtil = $cacheUtil;
$this->authorizationChecker = $authorizationChecker;
$this->entityManagerInterface = $entityManagerInterface;
$this->eccubeConfig = $eccubeConfig;
$this->BaseInfo = $baseInfoRepository->get();
$this->PluginRepository = $pluginRepository;
$this->pointHistory = $pointHistory;
$this->pointHistoryRepository = $pointHistoryRepository;
$this->customerRepository = $customerRepository;
$this->routerInterface = $routerInterface;
$this->urlMatcherInterface = $urlMatcherInterface;
$this->containerInterface = $containerInterface;
$this->twig = $twig;
$this->requestContext = $context;
$this->mobileDetector = $mobileDetector;
$this->pageLayoutRepository = $pageLayoutRepository;
$this->layoutRepository = $layoutRepository;
$this->session = $session;
$this->sexRepository = $sexRepository;
$this->mailService = $mailService;
$this->csvTypeRepository = $csvTypeRepository;
$this->deliveryFeeAdvanceRepository = $deliveryFeeAdvanceRepository;
$this->formFactory = $formFactory;
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'OnKernelRequest',
KernelEvents::RESPONSE => 'OnKernelResponse',
KernelEvents::CONTROLLER => 'onKernelController',
'@admin/default_frame.twig' => 'LoadAdminDefaultFrameTwig',
'@admin/Setting/Shop/shop_master.twig' => 'LoadAdminSettingShopShopMasterTwig',
'@admin/Setting/Shop/payment_edit.twig' => 'LoadAdminSettingShopPaymentEditTwig',
'@admin/Setting/Shop/delivery_edit.twig' => 'LoadAdminSettingShopDeliveryEditTwig',
'@admin/Product/index.twig' => 'LoadAdminProductIndexTwig',
'@admin/Product/product.twig' => 'LoadAdminProductProductTwig',
'@admin/Product/product_class.twig' => 'LoadAdminProductProductClassTwig',
'@admin/Product/category.twig' => 'LoadAdminProductCategoryTwig',
'@Synplgbase/admin/Customer/index.twig' => 'LoadAdminCustomerIndexTwig',//注意!!プラグイン用のtwigを使ってる
'@admin/Customer/edit.twig' => 'LoadAdminCustomerEditTwig',
'@admin/Order/index.twig' => 'LoadAdminOrderIndexTwig',
'@admin/Order/edit.twig' => 'LoadAdminOrderEditTwig',
'default_frame.twig' => 'LoadADefaultFrameTwig',
'@DataMigration4/admin/config.twig' => 'ClearCache',
EccubeEvents::FRONT_PRODUCT_DETAIL_INITIALIZE => 'FrontProductDetailInitialize',
EccubeEvents::FRONT_ENTRY_INDEX_COMPLETE => 'FrontEntryIndexComplete',
EccubeEvents::FRONT_SHOPPING_NONMEMBER_COMPLETE => 'FrontShoppingNonmemberComplete',
EccubeEvents::FRONT_SHOPPING_COMPLETE_INITIALIZE => 'FrontShoppingCompleteInitialize',
EccubeEvents::ADMIN_CUSTOMER_INDEX_SEARCH => 'AdminCustomerIndexSearch',
EccubeEvents::ADMIN_CUSTOMER_EDIT_INDEX_INITIALIZE => 'AdminCustomerEditIndexInitialize',
EccubeEvents::ADMIN_PRODUCT_INDEX_SEARCH => 'AdminProductIndexSearch',
EccubeEvents::ADMIN_PRODUCT_CATEGORY_DELETE_COMPLETE => 'AdminProductCategoryDeleteComplete',
EccubeEvents::ADMIN_ORDER_INDEX_SEARCH => 'AdminOrderIndexSearch',
EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_INITIALIZE => 'AdminSettingShopDeliveryEditInitialize',
EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_EDIT_COMPLETE => 'AdminSettingShopDeliveryEditComplete',
EccubeEvents::ADMIN_SETTING_SHOP_DELIVERY_DELETE_COMPLETE => 'AdminSettingShopDeliveryDeleteComplete',
'workflow.order.transition.ship' => 'WorkflowOrderTransitionShip',
'workflow.order.transition.cancel' => 'WorkflowOrderTransitionCancel',
'workflow.order.transition.back_to_in_progress' => 'WorkflowOrderTransitionBackToInProgress',
'workflow.order.transition.return' => 'WorkflowOrderTransitionReturn',
'workflow.order.transition.cancel_return' => 'WorkflowOrderTransitionCancelReturn',
];
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminDefaultFrameTwig(TemplateEvent $event)
{
$twig = '@Synplgbase/admin/default_frame_snippet_open_detailsearch.twig';
$event->addAsset($twig);
$twig = '@Synplgbase/admin/default_frame_snippet_header.twig';
$event->addAsset($twig);
$Config = $this->configRepository->get();
$parameters = $event->getParameters();
$parameters['admin_header'] = $Config->getAdminHeader();
$event->setParameters($parameters);
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminSettingShopShopMasterTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
if($Config->getDeliveryAdvanceFreeOn()){
$twig = '@Synplgbase/admin/Setting/Shop/shop_master_snippet_delivery_advance_free_amount.twig';
$event->addSnippet($twig);
}
if($Config->getFirstPointOn()){
$twig = '@Synplgbase/admin/Setting/Shop/shop_master_snippet_first_point.twig';
$event->addSnippet($twig);
}
if($Config->getWelcomePointOn()){
$twig = '@Synplgbase/admin/Setting/Shop/shop_master_snippet_welcome_point.twig';
$event->addSnippet($twig);
}
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminSettingShopPaymentEditTwig(TemplateEvent $event){
$twig = '@Synplgbase/admin/Setting/Shop/payment_edit_snippet_memo.twig';
$event->addSnippet($twig);
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminSettingShopDeliveryEditTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
if($Config->getDeliveryAdvanceOn()){
$twig = '@Synplgbase/admin/Setting/Shop/delivery_edit_snippet_advance.twig';
$event->addSnippet($twig);
}
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminProductIndexTwig(TemplateEvent $event){
$parameters = $event->getParameters();
$parameters['CsvDownloadMenuData'] = $this->csvTypeRepository->findBy(['parent_id'=>CsvType::CSV_TYPE_PRODUCT],['sort_no' => 'ASC']);
$event->setParameters($parameters);
$Config = $this->configRepository->get();
$twig = '@Synplgbase/admin/Product/index_snippet_search_items.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Product/index_snippet_category.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Product/index_snippet_add_orderby.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Product/index_snippet_csv.twig';
$event->addSnippet($twig);
if($Config->getProductCustomerPriceOn()){
$twig = '@Synplgbase/admin/Product/index_snippet_price03.twig';
$event->addSnippet($twig);
}
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminProductProductTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
//会員価格
if($Config->getProductCustomerPriceOn()){
$twig = '@Synplgbase/admin/Product/product_snippet_price03.twig';
$event->addSnippet($twig);
}
//期間限定公開チェック
if($Config->getProductPublishDateOn()){
$twig = '@Synplgbase/admin/Product/product_snippet_publish_date.twig';
$event->addSnippet($twig);
}
//会員限定公開チェック
if($Config->getProductCustomerOnlyOn()){
$twig = '@Synplgbase/admin/Product/product_snippet_customer_only.twig';
$event->addSnippet($twig);
}
//会員価格
if($Config->getDeliveryAdvanceOn()){
$twig = '@Synplgbase/admin/Product/product_snippet_delivery_advance_value.twig';
$event->addSnippet($twig);
}
//メタタグ追加
$twig = '@Synplgbase/admin/Product/product_snippet_meta.twig';
$event->addSnippet($twig);
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminProductProductClassTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
//会員価格
if($Config->getProductCustomerPriceOn()){
$twig = '@Synplgbase/admin/Product/product_class_snippet_price03.twig';
$event->addSnippet($twig);
}
//配送設定拡張による新項目
if($Config->getDeliveryAdvanceOn()){
$twig = '@Synplgbase/admin/Product/product_class_snippet_delivery_advance_value.twig';
$event->addSnippet($twig);
}
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminProductCategoryTwig(TemplateEvent $event){
$twig = '@Synplgbase/admin/Product/category_snippet_remove_action_edit.twig';
$event->addSnippet($twig);
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminCustomerIndexTwig(TemplateEvent $event){
$parameters = $event->getParameters();
$parameters['CsvDownloadMenuData'] = $this->csvTypeRepository->findBy(['parent_id'=>CsvType::CSV_TYPE_CUSTOMER],['sort_no' => 'ASC']);
$event->setParameters($parameters);
$twig = '@Synplgbase/admin/Customer/index_snippet_add_orderby.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Customer/index_snippet_csv.twig';
$event->addSnippet($twig);
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminCustomerEditTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
if($Config->getFaxNumberOn()){
$twig = '@Synplgbase/admin/Customer/edit_snippet_fax.twig';
$event->addSnippet($twig);
}
if($this->BaseInfo['option_point']){
$twig = '@Synplgbase/admin/Customer/edit_snippet_point_history.twig';
$event->addSnippet($twig);
$parameters = $event->getParameters();
$Customer=$parameters['Customer'];
$customer_id=$Customer->getId();
$parameters['PointHistory'] = $this->pointHistoryRepository->getList($customer_id);
$event->setParameters($parameters);
}
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminOrderIndexTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
$parameters = $event->getParameters();
$parameters['CsvDownloadMenuData'] = $this->csvTypeRepository->findBy(['parent_id'=>[CsvType::CSV_TYPE_ORDER,CsvType::CSV_TYPE_SHIPPING]],['sort_no' => 'ASC']);
$event->setParameters($parameters);
$twig = '@Synplgbase/admin/Order/index_snippet_search_items.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Order/index_snippet_mail_button.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Order/index_snippet_deliv.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Order/index_snippet_add_orderby.twig';
$event->addSnippet($twig);
$twig = '@Synplgbase/admin/Order/index_snippet_csv.twig';
$event->addSnippet($twig);
}
/**
* @param TemplateEvent $event
*/
public function LoadAdminOrderEditTwig(TemplateEvent $event){
$Config = $this->configRepository->get();
if($Config->getOrderSexOn()){
$twig = '@Synplgbase/admin/Order/edit_snippet_sex.twig';
$event->addSnippet($twig);
}
if($Config->getOrderBirthOn()){
$twig = '@Synplgbase/admin/Order/edit_snippet_birth.twig';
$event->addSnippet($twig);
}
if($Config->getFaxNumberOn()){
$twig = '@Synplgbase/admin/Order/edit_snippet_fax.twig';
$event->addSnippet($twig);
}
$twig = '@Synplgbase/admin/Order/edit_snippet_mail_template_name.twig';
$event->addSnippet($twig);
}
/**
* @param TemplateEvent $event
*/
public function LoadADefaultFrameTwig(TemplateEvent $event){
$twig = '@Synplgbase/default/default_frame_snippet_header.twig';
$event->addAsset($twig);
$Config = $this->configRepository->get();
$parameters = $event->getParameters();
$parameters['front_header'] = $Config->getFrontHeader();
$event->setParameters($parameters);
}
/**
* @param TemplateEvent $event
*/
public function ClearCache(TemplateEvent $event)
{
// キャッシュの削除
$this->cacheUtil->clearTwigCache();
$this->cacheUtil->clearDoctrineCache();
}
/**
* @param EventArgs $eventArgs
*/
public function FrontProductDetailInitialize(EventArgs $eventArgs)
{
$Config = $this->configRepository->get();
$Product = $eventArgs->getArgument('Product');
//期間限定公開チェック
if($Config->getProductPublishDateOn()){
$check=false;
$currentDateTime = new \DateTime("now");
$publish_date_start=$Product->getPublishDateStart();
$publish_date_end=$Product->getPublishDateEnd();
if(($publish_date_start && $publish_date_start > $currentDateTime) || ($publish_date_end && $publish_date_end < $currentDateTime)){
throw new NotFoundHttpException();
}
}
//会員限定公開チェック
if($Config->getProductCustomerOnlyOn()){
if($Product->getCustomerOnly()&&!$this->authorizationChecker->isGranted('IS_AUTHENTICATED_FULLY')){
throw new NotFoundHttpException();
}
}
}
/**
* @param EventArgs $eventArgs
*/
public function FrontEntryIndexComplete(EventArgs $eventArgs){
$Config = $this->configRepository->get();
//会員登録時付与ポイント
if($this->BaseInfo['option_point']&&$this->BaseInfo['welcome_point']&&$Config->getWelcomePointOn()){
$Customer = $eventArgs->getArgument('Customer');
$point = $this->BaseInfo['welcome_point'];
$Customer->setPoint($point);
$this->entityManagerInterface->persist($Customer);
$this->entityManagerInterface->flush();
$this->savePointLog($Customer->getId(), '会員登録で'.$point.'pt追加されました。');
}
}
/**
* @param EventArgs $eventArgs
*/
public function FrontShoppingCompleteInitialize(EventArgs $eventArgs){
$Config = $this->configRepository->get();
$Order = $eventArgs->getArgument('Order');
//初回購入時付与ポイント
if($this->BaseInfo['option_point']&&$this->BaseInfo['first_point']&&$Config->getFirstPointOn()){
$Customer = $Order->getCustomer();
if(!empty($Customer)){
if($Customer->getBuyTimes()<=1){
$point = $Customer->getPoint();
$point += $this->BaseInfo['first_point'];
$Customer->setPoint($point);
$this->entityManagerInterface->persist($Customer);
$this->entityManagerInterface->flush();
$this->savePointLog($Customer->getId(), '受注ID:'.$Order->getId().' 初回購入で'.$this->BaseInfo['first_point'].'pt追加されました。');
}
}
}
}
/**
* @param EventArgs $eventArgs
*/
public function FrontShoppingNonmemberComplete(EventArgs $eventArgs){
$Config = $this->configRepository->get();
if(!$Config->getOrderSexOn()&&!$Config->getOrderBirthOn()){
return false;
}
$form = $eventArgs->getArgument('form');
$data = $form->getData();
$Customer = new Customer();
$Customer
->setName01($data['name01'])
->setName02($data['name02'])
->setKana01($data['kana01'])
->setKana02($data['kana02'])
->setCompanyName($data['company_name'])
->setEmail($data['email'])
->setPhonenumber($data['phone_number'])
->setPostalcode($data['postal_code'])
->setPref($data['pref'])
->setAddr01($data['addr01'])
->setAddr02($data['addr02']);
if($Config->getOrderSexOn()){
$Customer->setSex($data['sex']);
}
if($Config->getOrderBirthOn()){
$Customer->setBirth($data['birth']);
}
$this->session->set(OrderHelper::SESSION_NON_MEMBER, $Customer);
}
/**
* @param EventArgs $eventArgs
*/
public function AdminCustomerIndexSearch(EventArgs $eventArgs){
$form = $eventArgs->getArgument('form');
if ($form->isValid()){
$searchData = $form->getData();
$ignores = ['multi','customer_status','orderby','dora'];
$this->checkDetailSearchAndOpenSearchBox($searchData,$ignores);
}
}
/**
* @param EventArgs $eventArgs
*/
public function AdminCustomerEditIndexInitialize(EventArgs $eventArgs){
$builder = $eventArgs->getArgument('builder');
$Customer = $eventArgs->getArgument('Customer');
$request = $eventArgs->getRequest();
$Config = $this->configRepository->get();
$old_point=$Customer->getPoint();
$oldStatusId=$Customer->getStatus()->getId();
$form = $builder->getForm();
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()){
//所持ポイント変更のログへの書き込み
$new_point = $Customer->getPoint();
if($Customer->getId()&&$old_point!=$new_point){
$this->savePointLog($Customer->getId(), '管理画面>会員登録画で所持ポイントが'.$old_point.'ptから'.$new_point.'ptに変更されました。');
}
//退会時の自動メール
if($Config->getCustomerWithdrawingAutomailOn()){
$newStatusId = $Customer->getStatus()->getId();
if ($oldStatusId != $newStatusId && $newStatusId == CustomerStatus::WITHDRAWING) {
$this->mailService->sendCustomerWithdrawMail($Customer, $Customer->getEmail());
}
}
}
}
/**
* @param EventArgs $eventArgs
*/
public function AdminProductIndexSearch(EventArgs $eventArgs){
$searchData = $eventArgs->getArgument('searchData');
$ignores = ['id','status','orderby','dora'];
$this->checkDetailSearchAndOpenSearchBox($searchData,$ignores);
}
/**
* @param EventArgs $eventArgs
*/
public function AdminProductCategoryDeleteComplete(EventArgs $eventArgs){
$TargetCategory = $eventArgs->getArgument('TargetCategory');
$deleteImages = $TargetCategory->getCategoryImage();
// 画像ファイルの削除(commit後に削除させる)
foreach ($deleteImages as $deleteImage) {
try {
$fs = new Filesystem();
$fs->remove($this->eccubeConfig['eccube_save_image_dir'].'/'.$deleteImage);
} catch (\Exception $e) {
// エラーが発生しても無視する
}
}
}
/**
* @param EventArgs $eventArgs
*/
public function AdminOrderIndexSearch(EventArgs $eventArgs){
$searchData = $eventArgs->getArgument('searchData');
$ignores = ['multi','status','orderby','dora'];
$this->checkDetailSearchAndOpenSearchBox($searchData,$ignores);
}
/**
* @param EventArgs $eventArgs
*/
public function AdminSettingShopDeliveryEditInitialize(EventArgs $eventArgs){
$builder = $eventArgs->getArgument('builder');
$Prefs = $eventArgs->getArgument('Prefs');
$Delivery = $eventArgs->getArgument('Delivery');
$Config = $this->configRepository->get();
$request = $eventArgs->getRequest();
//配送方法拡張機能(編集画面)
if($Config->getDeliveryAdvanceOn()){
$arrColumnValues = [];
if ($request->getMethod() === 'POST'){//エラーでページがリロードされた時のため
$arrTemp=$request->get('delivery_advance');
if(!empty($arrTemp)){
foreach ($Prefs as $Pref) {
foreach($arrTemp[$Pref->getId()] as $key=>$value){
$DeliveryFeeAdvance = new DeliveryFeeAdvance();
$DeliveryFeeAdvance
->setPref($Pref)
->setDelivery($Delivery)
->setExtra($key)
->setFee($value);
$arrDeliveryFeeAdvances[]=$DeliveryFeeAdvance;
}
}
}
}
else{//初回の編集ページアクセス
$arrDeliveryFeeAdvances = $this->deliveryFeeAdvanceRepository->findBy(['Delivery'=>$Delivery]);
}
if(isset($arrDeliveryFeeAdvances)&&$arrDeliveryFeeAdvances){
foreach($arrDeliveryFeeAdvances as $DeliveryFeeAdvance){
$arrColumnValues[$DeliveryFeeAdvance->getExtra()]=$DeliveryFeeAdvance->getExtra();
}
$this->twig->addGlobal('arrDeliveryFeeAdvances',$arrDeliveryFeeAdvances);
$this->twig->addGlobal('arrColumnValues',$arrColumnValues);
}
}
}
/**
* @param EventArgs $eventArgs
*/
public function AdminSettingShopDeliveryEditComplete(EventArgs $eventArgs){
$Config = $this->configRepository->get();
//配送方法拡張機能(編集画面データ保存)
if($Config->getDeliveryAdvanceOn()){
$request = $eventArgs->getRequest();
$Prefs = $eventArgs->getArgument('Prefs');
$form = $eventArgs->getArgument('form');
$Delivery = $eventArgs->getArgument('Delivery');
$DeliveryData = $form->getData();
if ($request->getMethod() === 'POST'){
//古いデータを全削除してから。。
$this->AdminSettingShopDeliveryDeleteComplete($eventArgs);
//新しいデータを入れ込む
$arrTemp=$request->get('delivery_advance');
if(!empty($arrTemp)){
foreach ($Prefs as $Pref) {
foreach($arrTemp[$Pref->getId()] as $key=>$value){
$DeliveryFeeAdvance = new DeliveryFeeAdvance();
$DeliveryFeeAdvance
->setPref($Pref)
->setDelivery($Delivery)
->setExtra($key)
->setFee(str_replace(',','',$value));
$DeliveryData->addDeliveryFeeAdvance($DeliveryFeeAdvance);
$this->entityManagerInterface->persist($DeliveryData);
}
}
$this->entityManagerInterface->flush();
}
}
}
}
/**
* @param EventArgs $eventArgs
*/
public function AdminSettingShopDeliveryDeleteComplete(EventArgs $eventArgs){
$Config = $this->configRepository->get();
if($Config->getDeliveryAdvanceOn()){
$Delivery = $eventArgs->getArgument('Delivery');
$arrDeliveryFeeAdvances = $this->deliveryFeeAdvanceRepository->findBy(['Delivery'=>$Delivery]);
foreach($arrDeliveryFeeAdvances as $DeliveryFeeAdvance){
$this->entityManagerInterface->remove($DeliveryFeeAdvance);
}
$this->entityManagerInterface->flush();
}
}
/**
* @param WorkflowEvent $workflowEvent
*/
public function WorkflowOrderTransitionShip(WorkflowEvent $workflowEvent){
$Order = $workflowEvent->getSubject()->getOrder();
$Customer = $Order->getCustomer();
if ($Customer&&$this->BaseInfo['option_point']) {
$this->savePointLog($Customer->getId(), '受注ID:'.$Order->getId().' 対応状況を「発送済み」に変更で'.$Order->getAddPoint().'pt追加されました。');
}
}
/**
* @param WorkflowEvent $workflowEvent
*/
public function WorkflowOrderTransitionCancel(WorkflowEvent $workflowEvent){
$Order = $workflowEvent->getSubject()->getOrder();
$Customer = $Order->getCustomer();
if ($Customer&&$this->BaseInfo['option_point']) {
$this->savePointLog($Customer->getId(), '受注ID:'.$Order->getId().' 対応状況を「キャンセル」に変更で'.$Order->getUsePoint().'pt戻されました。');
}
}
/**
* @param WorkflowEvent $workflowEvent
*/
public function WorkflowOrderTransitionBackToInProgress(WorkflowEvent $workflowEvent){
$Order = $workflowEvent->getSubject()->getOrder();
$Customer = $Order->getCustomer();
if ($Customer&&$this->BaseInfo['option_point']) {
$this->savePointLog($Customer->getId(), '受注ID:'.$Order->getId().' 対応状況を「キャンセル」から「決済処理中」に変更で'.$Order->getUsePoint().'pt引かれました。');
}
}
/**
* @param WorkflowEvent $workflowEvent
*/
public function WorkflowOrderTransitionReturn(WorkflowEvent $workflowEvent){
$Order = $workflowEvent->getSubject()->getOrder();
$Customer = $Order->getCustomer();
if ($Customer&&$this->BaseInfo['option_point']) {
$this->savePointLog($Customer->getId(), '受注ID:'.$Order->getId().' 対応状況を「発送済み」から「返品」に変更で、使用ポイント('.$Order->getUsePoint().'pt)が戻されて、追加ポイント('.$Order->getAddPoint().'pt)が引かれました。');
}
}
/**
* @param WorkflowEvent $workflowEvent
*/
public function WorkflowOrderTransitionCancelReturn(WorkflowEvent $workflowEvent){
$Order = $workflowEvent->getSubject()->getOrder();
$Customer = $Order->getCustomer();
if ($Customer&&$this->BaseInfo['option_point']) {
$this->savePointLog($Customer->getId(), '受注ID:'.$Order->getId().' 対応状況を「返品」から「発送済み」に変更で、使用ポイント('.$Order->getUsePoint().'pt)が引かれて、追加ポイント('.$Order->getAddPoint().'pt)が戻されました。');
}
}
/**
* @param GetResponseEvent $event
*/
public function OnKernelRequest(GetResponseEvent $event){
$Synplgbase = $this->configRepository->get();
$path = $event->getRequest()->getPathInfo();
if($Synplgbase->getTopRedirectOn()&&$path=='/'){
header("Location: ".$Synplgbase->getTopRedirectUrl());
exit;
}
// トップページに/index.phpでアクセスした場合、index.phpを削除
if(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH)=='/index.php'){
header("Location: http".((isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS'])?'s':NULL)."://".$_SERVER['HTTP_HOST'].($_SERVER['QUERY_STRING']?'?':NULL).$_SERVER['QUERY_STRING']);
exit;
}
// www.の削除
if (!empty($_SERVER['HTTP_HOST'])&&substr($_SERVER['HTTP_HOST'],0,4)=='www.') {
header("Location: http".((isset($_SERVER['HTTPS'])&&$_SERVER['HTTPS'])?'s':NULL)."://".substr($_SERVER['HTTP_HOST'],4).$_SERVER['REQUEST_URI']);
exit;
}
// Synplabase Version 3.0.2 まで LoadADefaultFrameTwigでやってたグローバル変数、Synplgbaseの作成をVer 3.0.3からここに変更。管理画面やメールのtwigでも使えるようにするため
$this->twig->addGlobal('Synplgbase',$Synplgbase);
}
/**
* @param FilterResponseEvent $event
*/
public function OnKernelResponse(FilterResponseEvent $event){
//商品詳細ページ閲覧履歴への書き込み
$this->writeProductViewHistory($event);
}
/**
* @param FilterControllerEvent $event
*/
public function onKernelController(FilterControllerEvent $event){
}
private function savePointLog($customer_id, $text)
{
if(!$this->BaseInfo['option_point']||!$customer_id||!$text) return;
$customerRepository=$this->customerRepository->find($customer_id);
if(!$customerRepository) return;
$point=$customerRepository->getPoint();
$this->pointHistory->setCustomerId($customer_id);
$this->pointHistory->setText($text);
$this->pointHistory->setDate(new \DateTime());
$this->pointHistory->setPoint($point);
$this->entityManagerInterface->persist($this->pointHistory);
$this->entityManagerInterface->flush();
}
public function readProductViewHistory(){
//ページ各所で使用するのでpublicにしておく(このファイルのwriteProductViewHistoryと、Plugin/Synplgbase/Twig/Extension/ProductExtension.phpで使用)
$name='ProductViewHistory';
global $request;
$cookie = $request->cookies->get($name);
return json_decode($cookie, true)??[];
}
private function writeProductViewHistory($event){
if ($event->getRequest()->get('_route') !== 'product_detail') {
return;
}
if ($product_id = $event->getRequest()->get('id')) {
$name='ProductViewHistory';
$arrProductIds=$this->readProductViewHistory();
if (($key=array_search($product_id, $arrProductIds))!==false){
unset($arrProductIds[$key]);
}
$arrProductIds[]=$product_id;
$products=json_encode(array_unique($arrProductIds));
// Cookie作成・更新
$response = $event->getResponse();
$response->headers->setCookie(new Cookie($name,$products));
$event->setResponse($response);
}
}
private function checkDetailSearchAndOpenSearchBox($searchData, $ignores){
//global variable, searchDetailを作成するだけで、javascriptの処理はResource/template/admin/default_frame_snipped_open_detailsearch.twigで行われる
foreach($searchData as $key=>$value){
if(!in_array($key,$ignores)){
if ($value instanceof \Doctrine\Common\Collections\ArrayCollection){
if(!$value->isEmpty()){
$this->twig->addGlobal('searchDetail',true);
break;
}
}
elseif(!empty($value)){
$this->twig->addGlobal('searchDetail',true);
break;
}
}
}
}
}