app/Plugin/ProductOption/ProductOptionEvent.php line 549

Open in your IDE?
  1. <?php
  2. /*
  3. * Plugin Name : ProductOption
  4. *
  5. * Copyright (C) BraTech Co., Ltd. All Rights Reserved.
  6. * http://www.bratech.co.jp/
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Plugin\ProductOption;
  12. use Doctrine\ORM\EntityManagerInterface;
  13. use Eccube\Entity\Shipping;
  14. use Eccube\Entity\OrderItem;
  15. use Eccube\Entity\Master\OrderItemType;
  16. use Eccube\Event\EccubeEvents;
  17. use Eccube\Event\TemplateEvent;
  18. use Eccube\Event\EventArgs;
  19. use Eccube\Form\Type\ShippingMultipleType;
  20. use Eccube\Repository\BaseInfoRepository;
  21. use Eccube\Repository\TaxRuleRepository;
  22. use Eccube\Repository\Master\OrderItemTypeRepository;
  23. use Eccube\Service\TaxRuleService;
  24. use Plugin\ProductOption\Entity\Option;
  25. use Plugin\ProductOption\Entity\OptionCategory;
  26. use Plugin\ProductOption\Entity\ProductOption;
  27. use Plugin\ProductOption\Entity\OrderItemOption;
  28. use Plugin\ProductOption\Entity\OrderItemOptionCategory;
  29. use Plugin\ProductOption\Repository\OptionRepository;
  30. use Plugin\ProductOption\Repository\OptionCategoryRepository;
  31. use Plugin\ProductOption\Repository\ProductOptionRepository;
  32. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  33. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  34. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  35. use Symfony\Component\DependencyInjection\ContainerInterface;
  36. class ProductOptionEvent implements EventSubscriberInterface
  37. {
  38.     private $container;
  39.     private $entityManager;
  40.     private $BaseInfo;
  41.     private $orderItemTypeRepository;
  42.     private $optionRepository;
  43.     private $optionCategoryRepository;
  44.     private $productOptionRepository;
  45.     private $tokenStorage;
  46.     private $taxRuleService;
  47.     private $taxRuleRepository;
  48.     public function __construct(
  49.             ContainerInterface $container,
  50.             EntityManagerInterface $entityManager,
  51.             BaseInfoRepository $baseInfoRepository,
  52.             OrderItemTypeRepository $orderItemTypeRepository,
  53.             OptionRepository $optionRepository,
  54.             OptionCategoryRepository $optionCategoryRepository,
  55.             ProductOptionRepository $productOptionRepository,
  56.             TokenStorageInterface $tokenStorage,
  57.             TaxRuleService $taxRuleService,
  58.             TaxRuleRepository $taxRuleRepository
  59.             )
  60.     {
  61.         $this->container $container;
  62.         $this->entityManager $entityManager;
  63.         $this->BaseInfo $baseInfoRepository->get();
  64.         $this->orderItemTypeRepository $orderItemTypeRepository;
  65.         $this->optionRepository $optionRepository;
  66.         $this->optionCategoryRepository $optionCategoryRepository;
  67.         $this->productOptionRepository $productOptionRepository;
  68.         $this->tokenStorage $tokenStorage;
  69.         $this->taxRuleService $taxRuleService;
  70.         $this->taxRuleRepository $taxRuleRepository;
  71.     }
  72.     /**
  73.      * @return array
  74.      */
  75.     public static function getSubscribedEvents()
  76.     {
  77.         return [
  78.             '@admin/Product/index.twig' => 'onTemplateAdminProduct',
  79.             '@admin/Product/product.twig' => 'onTemplateAdminProductEdit',
  80.             EccubeEvents::ADMIN_PRODUCT_COPY_COMPLETE => 'hookAdminProductCopyComplete',
  81.             EccubeEvents::ADMIN_PRODUCT_CSV_EXPORT => 'hookAdminProductCsvExport',
  82.             '@admin/Order/edit.twig' => 'onTemplateAdminOrderEdit',
  83.             '@admin/Order/shipping.twig' => 'onTemplateAdminOrderEdit',
  84.             '@admin/Order/search_product.twig' => 'onTemplateAdminOrderSearchProduct',
  85.             EccubeEvents::ADMIN_ORDER_CSV_EXPORT_ORDER => 'hookAdminOrderCsvExport',
  86.             'Product/list.twig' => 'onTemplateProductList',
  87.             'Product/detail.twig' => 'onTemplateProductDetail',
  88.             'Cart/index.twig' => 'onTemplateCart',
  89.             'Shopping/index.twig' => 'onTempleteShoppingIndex',
  90.             'Shopping/confirm.twig' => 'onTempleteShoppingIndex',
  91.             'Shopping/shipping_multiple.twig' => 'onTempleteShoppingShippingMultiple',
  92.             EccubeEvents::FRONT_SHOPPING_SHIPPING_MULTIPLE_INITIALIZE => 'onHookShoppingShippingMultipleInitialize',
  93.             EccubeEvents::FRONT_SHOPPING_SHIPPING_MULTIPLE_COMPLETE => 'onHookShoppingShippingMultipleComplete',
  94.             'Mypage/index.twig' => 'onTemplateMypageIndex',
  95.             'Mypage/history.twig' => 'onTemplateMypageHistory',
  96.             'csvimportproductext.admin.product.csv.import.product.descriptions' => 'hookAdminProductCsvImportProductDescriptions',
  97.             'csvimportproductext.admin.product.csv.import.product.check'=> 'hookAdminProductCsvImportProductCheck',
  98.             'csvimportproductext.admin.product.csv.import.product.process' => 'hookAdminProductCsvImportProductProcess',
  99.         ];
  100.     }
  101.     public function onTemplateAdminProduct(TemplateEvent $event)
  102.     {
  103.         $twig '@ProductOption/admin/Product/product_list.twig';
  104.         $event->addSnippet($twig);
  105.         $js '@ProductOption/admin/Product/product_list.js';
  106.         $event->addAsset($js);
  107.     }
  108.     public function onTemplateAdminProductEdit(TemplateEvent $event)
  109.     {
  110.         $source $event->getSource();
  111.         if(preg_match("/\<\/div\>[\n|\r\n|\r]\s*\{\%\sif\sid\sis\snot\snull\s\%\}[\n|\r\n|\r]/",$source$result)){
  112.             $search $result[0];
  113.             $replace_parts trim($search'</div>');
  114.             $replace "</div>{{ include('@ProductOption/admin/Product/product_edit.twig') }}" $replace_parts;
  115.             $source str_replace($search$replace$source);
  116.         }
  117.         $event->setSource($source);
  118.         $parameters $event->getParameters();
  119.         $arrType[Option::SELECT_TYPE] = trans("productoption.option.type.select");
  120.         $arrType[Option::RADIO_TYPE] = trans("productoption.option.type.radio");
  121.         $arrType[Option::CHECKBOX_TYPE] = trans("productoption.option.type.checkbox");
  122.         $arrType[Option::TEXT_TYPE] = trans("productoption.option.type.text");
  123.         $arrType[Option::TEXTAREA_TYPE] = trans("productoption.option.type.textarea");
  124.         $arrType[Option::DATE_TYPE] = trans("productoption.option.type.date");
  125.         $arrType[Option::NUMBER_TYPE] = trans("productoption.option.type.number");
  126.         $parameters['arrType'] = $arrType;
  127.         $event->setParameters($parameters);
  128.     }
  129.     public function hookAdminProductCopyComplete(EventArgs $event)
  130.     {
  131.         $Product $event->getArgument('Product');
  132.         $CopyProduct $event->getArgument('CopyProduct');
  133.         foreach ($Product->getProductOptions() as $oldProductOption) {
  134.             $newProductOption = new ProductOption();
  135.             $newProductOption->setProduct($CopyProduct);
  136.             $newProductOption->setOption($oldProductOption->getOption());
  137.             $newProductOption->setSortNo($oldProductOption->getSortNo());
  138.             $this->productOptionRepository->save($newProductOption);
  139.         }
  140.     }
  141.     public function hookAdminProductCsvExport(EventArgs $event)
  142.     {
  143.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  144.         if ($ExportCsvRow->isDataNull()) {
  145.             $csvService $event->getArgument('csvService');
  146.             $ProductClass $event->getArgument('ProductClass');
  147.             $Product $ProductClass->getProduct();
  148.             $Csv $event->getArgument('Csv');
  149.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  150.             if($csvEntityName == 'Plugin\ProductOption\Entity\ProductOption'){
  151.                 $array = [];
  152.                 foreach($Product->getProductOptions() as $ProductOption){
  153.                     if($Csv->getFieldName() == 'product_option_id'){
  154.                         $array[] = $ProductOption->getOption()->getId();
  155.                     }elseif($Csv->getFieldName() == 'product_option_name'){
  156.                         $array[] = $ProductOption->getOption()->getBackendName();
  157.                     }
  158.                 }
  159.                 $ExportCsvRow->setData(implode(','$array));
  160.             }
  161.         }
  162.     }
  163.     public function onTemplateAdminOrderEdit(TemplateEvent $event)
  164.     {
  165.         $source $event->getSource();
  166.         $parameters $event->getParameters();
  167.         if(preg_match("/\@admin\/Order\/order\_item\_prototype\.twig/",$source$result)){
  168.             $search $result[0];
  169.             $replace "@ProductOption/admin/Order/order_item_prototype.twig";
  170.             $source str_replace($search$replace$source);
  171.         }
  172.         if(preg_match("/\{\{\sOrderItem\.product\_name\s\}\}/",$source$result)){
  173.             $search $result[0];
  174.             $replace $search "{{ include('@ProductOption/admin/Order/orderitem_option.twig') }}";
  175.             $source str_replace($search$replace$source);
  176.         }
  177.         if(preg_match("/\{\{\s*form\_widget\(orderItemForm\.product\_name,\s*\{\s*'type'\:\s*'hidden'\s*\}\)\s*\}\}/",$source$result)){
  178.             $search $result[0];
  179.             $replace $search "{{ form_widget(orderItemForm.option_serial, { 'type': 'hidden' }) }}";
  180.             $source str_replace($search$replace$source);
  181.         }
  182.         $event->setSource($source);
  183.     }
  184.     public function onTemplateAdminOrderSearchProduct(TemplateEvent $event)
  185.     {
  186.         $source $event->getSource();
  187.         if(preg_match("/\<\/script\>/",$source$result)){
  188.             $search $result[0];
  189.             $replace $search "{{ include('@ProductOption/admin/Order/search_product_js.twig') }}";
  190.             $source str_replace($search$replace$source);
  191.         }
  192.         if(preg_match("/fnAddOrderItem/",$source$result)){
  193.             $search $result[0];
  194.             $replace "fnAddOrderItemOption";
  195.             $source str_replace($search$replace$source);
  196.         }
  197.         if(preg_match("/\{\{\s\'admin\.product\.product\_class\_\_short\'\|trans\s\}\}/",$source$result)){
  198.             $search $result[0];
  199.             $replace $search "/{{ 'productoption.admin.common.option'|trans }}";
  200.             $source str_replace($search$replace$source);
  201.         }
  202.         if(preg_match("/\<\/td\>[\n|\r\n|\r]\s*\<td class=\"align\-middle pr\-3 text\-right\"\>/",$source$result)){
  203.             $search $result[0];
  204.             $snippet file_get_contents($this->container->getParameter('plugin_realdir'). '/ProductOption/Resource/template/admin/Order/search_product_option.twig');
  205.             $replace $snippet $search;
  206.             $source str_replace($search$replace$source);
  207.         }elseif(preg_match("/\<\/td\>[\n|\r\n|\r]\s*\{\%\sif\sProduct\.stock_find\s\%\}/",$source$result)){
  208.             $search $result[0];
  209.             $snippet file_get_contents($this->container->getParameter('plugin_realdir'). '/ProductOption/Resource/template/admin/Order/search_product_option.twig');
  210.             $replace $snippet $search;
  211.             $source str_replace($search$replace$source);
  212.         }
  213.         $event->setSource($source);
  214.         $parameters $event->getParameters();
  215.         $Products $parameters['Products'];
  216.         $optionParameters $this->getOptionParameters($Products);
  217.         $parameters array_merge($parameters$optionParameters);
  218.         $event->setParameters($parameters);
  219.     }
  220.     public function hookAdminOrderCsvExport(EventArgs $event)
  221.     {
  222.         $ExportCsvRow $event->getArgument('ExportCsvRow');
  223.         if ($ExportCsvRow->isDataNull()) {
  224.             $csvService $event->getArgument('csvService');
  225.             $OrderItem $event->getArgument('OrderItem');
  226.             $Csv $event->getArgument('Csv');
  227.             $csvEntityName str_replace('\\\\''\\'$Csv->getEntityName());
  228.             if($csvEntityName == 'Plugin\ProductOption\Entity\OrderItemOption'){
  229.                 $data null;
  230.                 $arrData = [];
  231.                 $OrderItemOptions $OrderItem->getOrderItemOptions();
  232.                 if(!is_null($Csv->getReferenceFieldName())){
  233.                     $optionId $Csv->getReferenceFieldName();
  234.                     foreach($OrderItemOptions as $OrderItemOption){
  235.                         if($optionId == $OrderItemOption->getOptionId()){
  236.                             foreach($OrderItemOption->getOrderItemOptionCategories() as $OrderItemOptionCategory){
  237.                                 $arrData[] = $OrderItemOptionCategory->getValue();
  238.                             }
  239.                         }
  240.                     }
  241.                     if(count($arrData) > 0)$data implode(',',$arrData);
  242.                 }else{
  243.                     foreach($OrderItemOptions as $OrderItemOption){
  244.                         $text $OrderItemOption->getLabel(). ':';
  245.                         foreach($OrderItemOption->getOrderItemOptionCategories() as $OrderItemOptionCategory){
  246.                             $text .= $OrderItemOptionCategory->getValue() .',';
  247.                         }
  248.                         $arrData[] = rtrim($text,',');
  249.                     }
  250.                     if(count($arrData) > 0)$data implode(',',$arrData);
  251.                 }
  252.                 $ExportCsvRow->setData($data);
  253.             }
  254.         }
  255.     }
  256.     public function onTemplateProductList(TemplateEvent $event)
  257.     {
  258.         $parameters $event->getParameters();
  259.         $Products $parameters['pagination'];
  260.         $source $event->getSource();
  261.         // カート追加のフォームが存在しない場合は処理を行わない
  262.         if(!preg_match('/url\(\'product_add_cart\'/',$source$result)){
  263.             return;
  264.         }
  265.         $optionParameters $this->getOptionParameters($Products);
  266.         $parameters array_merge($parameters$optionParameters);
  267.         $parameters['ProductOptions'] = $this->productOptionRepository->findAll();
  268.         $event->setParameters($parameters);
  269.         $twig 'Product/option_css.twig';
  270.         $event->addAsset($twig);
  271.         $twig '@ProductOption/default/Product/option_js.twig';
  272.         $event->addSnippet($twig);
  273.         $twig '@ProductOption/default/Product/list_js.twig';
  274.         $event->addSnippet($twig);
  275.         if(!preg_match('/include\(\s*\'Product\/option\.twig/',$source$result)){
  276.             if(preg_match("/\<div\sclass\=\"ec\-numberInput\"\>/",$source$result)){
  277.                 $search $result[0];
  278.                 $replace "{{ include('Product/option.twig') }}" $search;
  279.                 $source str_replace($search$replace$source);
  280.             }
  281.         }
  282.         if(!preg_match('/include\(\s*\'Product\/option\_description\.twig/',$source$result)){
  283.             if(preg_match("/\<div\sclass\=\"ec\-modal\"\>/",$source$result)){
  284.                 $search $result[0];
  285.                 $replace "{{ include('Product/option_description.twig') }}" $search;
  286.                 $source str_replace($search$replace$source);
  287.             }
  288.         }
  289.         $event->setSource($source);
  290.     }
  291.     public function onTemplateProductDetail(TemplateEvent $event)
  292.     {
  293.         $parameters $event->getParameters();
  294.         $Product $parameters['Product'];
  295.         $Products = [$Product];
  296.         $optionParameters $this->getOptionParameters($Products);
  297.         $parameters array_merge($parameters$optionParameters);
  298.         $parameters['ProductOptions'] = $Product->getProductOptions();
  299.         $event->setParameters($parameters);
  300.         $twig 'Product/option_css.twig';
  301.         $event->addAsset($twig);
  302.         $twig '@ProductOption/default/Product/option_js.twig';
  303.         $event->addSnippet($twig);
  304.         $twig '@ProductOption/default/Product/detail_js.twig';
  305.         $event->addSnippet($twig);
  306.         $source $event->getSource();
  307.         if(!preg_match('/include\(\s*\'Product\/option\.twig/',$source$result)){
  308.             if(preg_match("/\<div\sclass\=\"ec\-numberInput\"\>/",$source$result)){
  309.                 $search $result[0];
  310.                 $replace "{{ include('Product/option.twig') }}" $search;
  311.                 $source str_replace($search$replace$source);
  312.             }
  313.         }
  314.         if(!preg_match('/include\(\s*\'Product\/option\_description\.twig/',$source$result)){
  315.             if(preg_match("/\<div\sclass\=\"ec\-modal\"\>/",$source$result)){
  316.                 $search $result[0];
  317.                 $replace "{{ include('Product/option_description.twig') }}" $search;
  318.                 $source str_replace($search$replace$source);
  319.             }
  320.         }
  321.         $event->setSource($source);
  322.     }
  323.     private function getOptionParameters($Products)
  324.     {
  325.         $basicPointRate $this->BaseInfo->getBasicPointRate();
  326.         $taxRules = [];
  327.         $optionPrices = [];
  328.         $optionPoints = [];
  329.         $optionMultiples = [];
  330.         $optionDefaults = [];
  331.         $default_class_id = [];
  332.         foreach($Products as $Product){
  333.             foreach($Product->getProductClasses() as $ProductClass){
  334.                 if(!isset($default_class_id[$Product->getId()]))$default_class_id[$Product->getId()] = $ProductClass->getId();
  335.                 $pointRate $ProductClass->getPointRate();
  336.                 $TaxRule $this->taxRuleRepository->getByRule($Product$ProductClass);
  337.                 $taxRules[$ProductClass->getId()]['tax_rate'] = $TaxRule->getTaxRate();
  338.                 $taxRules[$ProductClass->getId()]['tax_rule'] = $TaxRule->getRoundingType()->getId();
  339.             }
  340.             if(is_null($pointRate)){
  341.                 $pointRate $basicPointRate;
  342.             }
  343.             foreach($Product->getProductOptions() as $ProductOption){
  344.                 $Option $ProductOption->getOption();
  345.                 if($Option->getType() == Option::CHECKBOX_TYPE || $Option->getType() == Option::RADIO_TYPE || $Option->getType() == Option::SELECT_TYPE){
  346.                     foreach($Option->getOptionCategories() as $OptionCategory){
  347.                         $optionDefaults[$Product->getId()][$Option->getId()][$OptionCategory->getId()] = $OptionCategory->getDisableFlg();
  348.                         $price $OptionCategory->getValue();
  349.                         if(is_null($price))$price 0;
  350.                         $optionPrices[$Product->getId()][$Option->getId()][$OptionCategory->getId()] = $price;
  351.                         $optionPoints[$Product->getId()][$Option->getId()][$OptionCategory->getId()] = round($price * ($pointRate 100));
  352.                     }
  353.                 }else{
  354.                     $OptionCategories $Option->getOptionCategories();
  355.                     $price 0;
  356.                     if(count($OptionCategories) > 0){
  357.                         $OptionCategory $OptionCategories[0];
  358.                         $price $OptionCategory->getValue();
  359.                         if(is_null($price))$price 0;
  360.                     }
  361.                     if($Option->getType() == Option::NUMBER_TYPE){
  362.                         $flg false;
  363.                         if(isset($OptionCategory) && $OptionCategory->getMultipleFlg())$flg true;
  364.                         $optionMultiples[$Product->getId()][$Option->getId()] = $flg;
  365.                     }
  366.                     $optionPrices[$Product->getId()][$Option->getId()][0] = $price;
  367.                     $optionPoints[$Product->getId()][$Option->getId()][0] = round($price * ($pointRate 100));
  368.                     if(isset($OptionCategory))unset($OptionCategory);
  369.                 }
  370.             }
  371.         }
  372.         $parameters['optionPrices'] = $optionPrices;
  373.         $parameters['optionPoints'] = $optionPoints;
  374.         $parameters['optionMultiples'] = $optionMultiples;
  375.         $parameters['optionDefaults'] = $optionDefaults;
  376.         $parameters['taxRules'] = $taxRules;
  377.         $parameters['default_class_id'] = $default_class_id;
  378.         return $parameters;
  379.     }
  380.     public function onTemplateCart(TemplateEvent $event)
  381.     {
  382.         $source $event->getSource();
  383.         if(preg_match("/url\('cart\_handle\_item'\s*,\s*\{'operation'\s*:\s*'down'\s*,\s*'productClassId'\s*:\s*ProductClass\.id/",$source$result)){
  384.             $search $result[0];
  385.             $snipet "url('productoption_cart_handle_item', {'operation': 'down', 'cartItemId': CartItem.id";
  386.             $replace $snipet;
  387.             $source str_replace($search$replace$source);
  388.         }
  389.         if(preg_match("/url\('cart\_handle\_item'\s*,\s*\{'operation'\s*:\s*'up'\s*,\s*'productClassId'\s*:\s*ProductClass\.id/",$source$result)){
  390.             $search $result[0];
  391.             $snipet "url('productoption_cart_handle_item', {'operation': 'up', 'cartItemId': CartItem.id";
  392.             $replace $snipet;
  393.             $source str_replace($search$replace$source);
  394.         }
  395.         if(preg_match("/url\('cart\_handle\_item',\s\{'operation'\:\s'remove',\s'productClassId'\:\sProductClass\.id/",$source$result)){
  396.             $search $result[0];
  397.             $snipet "url('productoption_cart_handle_item', {'operation': 'remove', 'cartItemId': CartItem.id";
  398.             $replace $snipet;
  399.             $source str_replace($search$replace$source);
  400.         }
  401.         if(preg_match("/\<\/div\>[\n|\r\n\\r]\s*<div\sclass\=\"ec\-cartRow\_\_unitPrice\"\>/",$source$result)){
  402.             $search $result[0];
  403.             $replace "{{ include('@ProductOption/default/Cart/cart_option.twig') }}" $search;
  404.             $source str_replace($search$replace$source);
  405.         }
  406.         $event->setSource($source);
  407.         $parameters $event->getParameters();
  408.         $Carts $parameters['Carts'];
  409.         $isDeliveryFree $parameters['is_delivery_free'];
  410.         foreach($Carts as $Cart){
  411.             foreach($Cart->getCartItems() as $CartItem){
  412.                 $flg $CartItem->getDeliveryFreeFlg();
  413.                 if($flg == OptionCategory::ON){
  414.                     if(!$isDeliveryFree[$Cart->getCartKey()]){
  415.                         $isDeliveryFree[$Cart->getCartKey()] = true;
  416.                     }
  417.                 }
  418.             }
  419.         }
  420.         $parameters['is_delivery_free'] = $isDeliveryFree;
  421.         $event->setParameters($parameters);
  422.     }
  423.     public function onTempleteShoppingIndex(TemplateEvent $event)
  424.     {
  425.         $source $event->getSource();
  426.         if(preg_match("/\<p\>\{\{\sorderItem\.priceIncTax\|price\s\}\}/",$source$result)){
  427.             $search $result[0];
  428.             $replace "{{ include('@ProductOption/default/Shopping/orderitem_option.twig') }}" $search;
  429.             $source str_replace($search$replace$source);
  430.         }
  431.         $event->setSource($source);
  432.     }
  433.     public function onTempleteShoppingShippingMultiple(TemplateEvent $event)
  434.     {
  435.         $source $event->getSource();
  436.         if(preg_match("/\{\%\sif\sorderItem\.productClass\.id\s\=\=\skey\s\%\}/",$source$result)){
  437.             $search $result[0];
  438.             $replace "{% if orderItem.productClass.id ~ '_' ~ orderItem.option_serial == key %}";
  439.             $source str_replace($search$replace$source);
  440.         }
  441.         if(preg_match("/\<div\sclass\=\"ec\-AddAddress\_\_itemtPrice\"\>/",$source$result)){
  442.             $search $result[0];
  443.             $replace $search "{{ include('@ProductOption/default/Shopping/shipping_multiple_option.twig') }}";
  444.             $source str_replace($search$replace$source);
  445.         }
  446.         $event->setSource($source);
  447.         $parameters $event->getParameters();
  448.         $OrderItems $parameters['OrderItems'];
  449.         $OrderItemsForFormBuilder = [];
  450.         $ItemQuantitiesByOption = [];
  451.         $tmpIds = [];
  452.         $Order $OrderItems[0]->getOrder();
  453.         foreach($Order->getProductOrderItems() as $OrderItem){
  454.             $quantity $OrderItem->getQuantity();
  455.             $itemId $OrderItem->getProductClass()->getId();
  456.             $serial $OrderItem->getOptionSerial();
  457.             $key $itemId .'_'$serial;
  458.             if (!in_array($key$tmpIds)) {
  459.                 $OrderItemsForFormBuilder[] = $OrderItem;
  460.                 $tmpIds[] = $key;
  461.                 $ItemQuantitiesByOption[$key] = $quantity;
  462.             }else{
  463.                 $ItemQuantitiesByOption[$key] += $quantity;
  464.             }
  465.         }
  466.         $parameters['OrderItems'] = $OrderItemsForFormBuilder;
  467.         $parameters['compItemQuantities'] = $ItemQuantitiesByOption;
  468.         $event->setParameters($parameters);
  469.     }
  470.     public function onHookShoppingShippingMultipleInitialize(EventArgs $event)
  471.     {
  472.         $builder $event->getArgument('builder');
  473.         $Order $event->getArgument('Order');
  474.         $OrderItemsForFormBuilder = [];
  475.         $tmpIds = [];
  476.         foreach($Order->getProductOrderItems() as $OrderItem){
  477.             $itemId $OrderItem->getProductClass()->getId();
  478.             $serial $OrderItem->getOptionSerial();
  479.             $key $itemId .'_'$serial;
  480.             if (!in_array($key$tmpIds)) {
  481.                 $OrderItemsForFormBuilder[] = $OrderItem;
  482.                 $tmpIds[] = $key;
  483.             }
  484.         }
  485.         $builder->remove('shipping_multiple');
  486.         $builder
  487.             ->add('shipping_multiple'CollectionType::class, [
  488.                 'entry_type' => ShippingMultipleType::class,
  489.                 'data' => $OrderItemsForFormBuilder,
  490.                 'allow_add' => true,
  491.                 'allow_delete' => true,
  492.             ]);
  493.     }
  494.     public function onHookShoppingShippingMultipleComplete(EventArgs $event)
  495.     {
  496.         $form $event->getArgument('form');
  497.         $Order $event->getArgument('Order');
  498.         if ($form->isSubmitted() && $form->isValid()) {
  499.             $data $form['shipping_multiple'];
  500.             // フォームの入力から、送り先ごとに商品の数量を集計する
  501.             $arrOrderItemTemp = [];
  502.             foreach ($data as $multiples) {
  503.                 $OrderItem $multiples->getData();
  504.                 foreach ($multiples as $items) {
  505.                     foreach ($items as $item) {
  506.                         $CustomerAddress $item['customer_address']->getData();
  507.                         $customerAddressName $CustomerAddress->getShippingMultipleDefaultName();
  508.                         $itemId $OrderItem->getProductClass()->getId() . '_' $OrderItem->getOptionSerial();
  509.                         $quantity $item['quantity']->getData();
  510.                         if (isset($arrOrderItemTemp[$customerAddressName]) && array_key_exists($itemId$arrOrderItemTemp[$customerAddressName])) {
  511.                             $arrOrderItemTemp[$customerAddressName][$itemId] = $arrOrderItemTemp[$customerAddressName][$itemId] + $quantity;
  512.                         } else {
  513.                             $arrOrderItemTemp[$customerAddressName][$itemId] = $quantity;
  514.                         }
  515.                     }
  516.                 }
  517.             }
  518.             // -- ここから先がお届け先を再生成する処理 --
  519.             // お届け先情報をすべて削除
  520.             /** @var Shipping $Shipping */
  521.             foreach ($Order->getShippings() as $Shipping) {
  522.                 foreach ($Shipping->getOrderItems() as $OrderItem) {
  523.                     $Shipping->removeOrderItem($OrderItem);
  524.                     $Order->removeOrderItem($OrderItem);
  525.                     $this->entityManager->remove($OrderItem);
  526.                 }
  527.                 $Order->removeShipping($Shipping);
  528.                 $this->entityManager->remove($Shipping);
  529.             }
  530.             // お届け先のリストを作成する
  531.             $ShippingList = [];
  532.             foreach ($data as $multiples) {
  533.                 $OrderItem $multiples->getData();
  534.                 $ProductClass $OrderItem->getProductClass();
  535.                 $Delivery $OrderItem->getShipping()->getDelivery();
  536.                 $saleTypeId $ProductClass->getSaleType()->getId();
  537.                 foreach ($multiples as $items) {
  538.                     foreach ($items as $item) {
  539.                         $CustomerAddress $item['customer_address']->getData();
  540.                         $customerAddressName $CustomerAddress->getShippingMultipleDefaultName();
  541.                         if (isset($ShippingList[$customerAddressName][$saleTypeId])) {
  542.                             continue;
  543.                         }
  544.                         $Shipping = new Shipping();
  545.                         $Shipping
  546.                             ->setOrder($Order)
  547.                             ->setFromCustomerAddress($CustomerAddress)
  548.                             ->setDelivery($Delivery);
  549.                         $Order->addShipping($Shipping);
  550.                         $ShippingList[$customerAddressName][$saleTypeId] = $Shipping;
  551.                     }
  552.                 }
  553.             }
  554.             // お届け先のリストを保存
  555.             foreach ($ShippingList as $ShippingListByAddress) {
  556.                 foreach ($ShippingListByAddress as $Shipping) {
  557.                     $this->entityManager->persist($Shipping);
  558.                 }
  559.             }
  560.             $ProductOrderType $this->orderItemTypeRepository->find(OrderItemType::PRODUCT);
  561.             // お届け先に、配送商品の情報(OrderItem)を関連付ける
  562.             foreach ($data as $multiples) {
  563.                 /** @var OrderItem $OrderItem */
  564.                 $OrderItem $multiples->getData();
  565.                 $ProductClass $OrderItem->getProductClass();
  566.                 $Product $OrderItem->getProduct();
  567.                 $saleTypeId $ProductClass->getSaleType()->getId();
  568.                 $itemId $OrderItem->getProductClass()->getId() . '_' $OrderItem->getOptionSerial();
  569.                 $optionSerial $OrderItem->getOptionSerial();
  570.                 $OrderItemOptions $OrderItem->getOrderItemOptions();
  571.                 $optionPrice $OrderItem->getOptionPrice();
  572.                 $optionTax $OrderItem->getOptionTax();
  573.                 foreach ($multiples as $items) {
  574.                     foreach ($items as $item) {
  575.                         $CustomerAddress $item['customer_address']->getData();
  576.                         $customerAddressName $CustomerAddress->getShippingMultipleDefaultName();
  577.                         // お届け先から商品の数量を取得
  578.                         $quantity 0;
  579.                         if (isset($arrOrderItemTemp[$customerAddressName]) && array_key_exists($itemId$arrOrderItemTemp[$customerAddressName])) {
  580.                             $quantity $arrOrderItemTemp[$customerAddressName][$itemId];
  581.                             unset($arrOrderItemTemp[$customerAddressName][$itemId]);
  582.                         } else {
  583.                             // この配送先には送る商品がないのでスキップ(通常ありえない)
  584.                             continue;
  585.                         }
  586.                         // 関連付けるお届け先のインスタンスを取得
  587.                         $Shipping $ShippingList[$customerAddressName][$saleTypeId];
  588.                         // インスタンスを生成して保存
  589.                         $OrderItem = new OrderItem();
  590.                         $OrderItem->setShipping($Shipping)
  591.                             ->setOrder($Order)
  592.                             ->setProductClass($ProductClass)
  593.                             ->setProduct($Product)
  594.                             ->setProductName($Product->getName())
  595.                             ->setProductCode($ProductClass->getCode())
  596.                             ->setPrice($ProductClass->getPrice02())
  597.                             ->setQuantity($quantity)
  598.                             ->setOrderItemType($ProductOrderType)
  599.                             ->setOptionSerial($optionSerial);
  600.                         $ClassCategory1 $ProductClass->getClassCategory1();
  601.                         if (!is_null($ClassCategory1)) {
  602.                             $OrderItem->setClasscategoryName1($ClassCategory1->getName());
  603.                             $OrderItem->setClassName1($ClassCategory1->getClassName()->getName());
  604.                         }
  605.                         $ClassCategory2 $ProductClass->getClassCategory2();
  606.                         if (!is_null($ClassCategory2)) {
  607.                             $OrderItem->setClasscategoryName2($ClassCategory2->getName());
  608.                             $OrderItem->setClassName2($ClassCategory2->getClassName()->getName());
  609.                         }
  610.                         foreach($OrderItemOptions as $OrderItemOption){
  611.                             $newOrderItemOption = new OrderItemOption();
  612.                             $newOrderItemOption->setOptionId($OrderItemOption->getOptionId())
  613.                                                ->setOrderItem($OrderItem)
  614.                                                ->setLabel($OrderItemOption->getLabel())
  615.                                                ->setSortNo($OrderItemOption->getSortNo());
  616.                             foreach($OrderItemOption->getOrderItemOptionCategories() as $OrderItemOptionCategory){
  617.                                 $newOrderItemOptionCategory = new OrderItemOptionCategory();
  618.                                 $newOrderItemOptionCategory->setOptionCategoryId($OrderItemOptionCategory->getOptionCategoryId())
  619.                                                            ->setOrderItemOption($newOrderItemOption)
  620.                                                            ->setValue($OrderItemOptionCategory->getValue())
  621.                                                            ->setPrice($OrderItemOptionCategory->getPrice())
  622.                                                            ->setTax($OrderItemOptionCategory->getTax())
  623.                                                            ->setDeliveryFreeFlg($OrderItemOptionCategory->getDeliveryFreeFlg())
  624.                                                            ->setSortNo($OrderItemOptionCategory->getSortNo());
  625.                                 $newOrderItemOption->addOrderItemOptionCategory($newOrderItemOptionCategory);
  626.                             }
  627.                             $OrderItem->addOrderItemOption($newOrderItemOption);
  628.                         }
  629.                         $OrderItem->setPrice($OrderItem->getPrice() + $optionPrice);
  630.                         $OrderItem->setTax($OrderItem->getTax() + $optionTax);
  631.                         $OrderItem->setOptionSetFlg(true);
  632.                         $Shipping->addOrderItem($OrderItem);
  633.                         $Order->addOrderItem($OrderItem);
  634.                         $this->entityManager->persist($OrderItem);
  635.                     }
  636.                 }
  637.             }
  638.             $this->entityManager->flush();
  639.         }
  640.     }
  641.     public function onTemplateMypageIndex(TemplateEvent $event)
  642.     {
  643.         $source $event->getSource();
  644.         if(preg_match("/Order\.MergedProductOrderItems/",$source$result)){
  645.             $search $result[0];
  646.             $replace "Order.MergedProductOptionOrderItems";
  647.             $source str_replace($search$replace$source);
  648.         }
  649.         if(preg_match("/\<p\sclass\=\"ec\-historyRole\_\_detailPrice\"\>/",$source$result)){
  650.             $search $result[0];
  651.             $replace $search "{{ include('@ProductOption/default/Mypage/orderitem_option.twig') }}";
  652.             $source str_replace($search$replace$source);
  653.         }
  654.         $event->setSource($source);
  655.     }
  656.     public function onTemplateMypageHistory(TemplateEvent $event)
  657.     {
  658.         $parameters $event->getParameters();
  659.         $Order $parameters['Order'];
  660.         foreach($Order->getProductOrderItems() as $OrderItem){
  661.             $ProductClass $OrderItem->getProductClass();
  662.             $current_price 0;
  663.             foreach($OrderItem->getOrderItemOptions() as $OrderItemOption){
  664.                 foreach($OrderItemOption->getOrderItemOptionCategories() as $OrderItemOptionCategory){
  665.                     $optionCategoryId $OrderItemOptionCategory->getOptionCategoryId();
  666.                     if($optionCategoryId 0){
  667.                         $OptionCategory $this->optionCategoryRepository->find($optionCategoryId);
  668.                         if(!is_null($OptionCategory)){
  669.                             $option_price $OptionCategory->getValue();
  670.                             if($OptionCategory->getOption()->getType() == Option::NUMBER_TYPE && $OptionCategory->getMultipleFlg()){
  671.                                 $option_price *= $OrderItemOptionCategory->getValue();
  672.                             }
  673.                             $current_price += $option_price;
  674.                         }
  675.                     }
  676.                 }
  677.             }
  678.             $OrderItem->setCurrentPrice($current_price);
  679.             $OrderItem->setCurrentTax($this->taxRuleService->getTax($OrderItem->getCurrentPrice(),$ProductClass->getProduct(),$ProductClass));
  680.         }
  681.         $event->setParameters($parameters);
  682.         $source $event->getSource();
  683.         if(preg_match("/=\s*orderItem\.productClass\.price02IncTax|=\s*orderItem\.productClass\.customer\_rank\_priceIncTax/",$source$result)){
  684.             $search $result[0];
  685.             $replace $search "+ orderItem.CurrentPriceIncTax";
  686.             $source str_replace($search$replace$source);
  687.         }
  688.         if(preg_match("/\{\{\s*orderItem\.productClass\.price02IncTax\|price\s*\}\}/",$source$result)){
  689.             $search $result[0];
  690.             $replace "{% set currentPriceIncTax = orderItem.productClass.price02IncTax+orderItem.CurrentPriceIncTax %}{{ currentPriceIncTax|price }}";
  691.             $source str_replace($search$replace$source);
  692.         }
  693.         if(preg_match("/\{\{\s*orderItem\.productClass\.customer_rank_priceIncTax\|price\s*\}\}/",$source$result)){
  694.             $search $result[0];
  695.             $replace "{% set currentPriceIncTax = orderItem.productClass.customer_rank_priceIncTax+orderItem.CurrentPriceIncTax %}{{ currentPriceIncTax|price }}";
  696.             $source str_replace($search$replace$source);
  697.         }
  698.         if(preg_match("/\<p\>\{\{\sorderItem\.price\_inc\_tax\|price\s\}\}/",$source$result)){
  699.             $search $result[0];
  700.             $replace "{{ include('@ProductOption/default/Shopping/orderitem_option.twig') }}" $search;
  701.             $source str_replace($search$replace$source);
  702.         }
  703.         $event->setSource($source);
  704.     }
  705.     public function hookAdminProductCsvImportProductDescriptions(EventArgs $event)
  706.     {
  707.         $header $event->getArgument('header');
  708.         $key $event->getArgument('key');
  709.         if($key == trans('productoption.csv.product.label.id')){
  710.             $header['description'] = trans('productoption.admin.product.product_csv.product_assign_description');
  711.             $header['required'] = false;
  712.         }
  713.         $event->setArgument('header',$header);
  714.     }
  715.     public function hookAdminProductCsvImportProductCheck(EventArgs $event)
  716.     {
  717.         $row $event->getArgument('row');
  718.         $data $event->getArgument('data');
  719.         $errors $event->getArgument('errors');
  720.         if(isset($row[trans('productoption.csv.product.label.id')])){
  721.             if($row[trans('productoption.csv.product.label.id')] !== '' && preg_match("/[^0-9,]/"$row[trans('productoption.csv.product.label.id')])){
  722.                 $message trans('productoption.admin.product.product_csv.not_correct', [
  723.                     '%line%' => $data->key() + 1,
  724.                     '%name%' => trans('productoption.csv.product.label.id'),
  725.                 ]);
  726.                 $errors[] = $message;
  727.             }
  728.         }
  729.         $event->setArgument('errors',$errors);
  730.     }
  731.     public function hookAdminProductCsvImportProductProcess(EventArgs $event)
  732.     {
  733.         $row $event->getArgument('row');
  734.         $data $event->getArgument('data');
  735.         $ProductClass $event->getArgument('ProductClass');
  736.         $Product $ProductClass->getProduct();
  737.         if(isset($row[trans('productoption.csv.product.label.id')])){
  738.             // 一旦クリア
  739.             $currentProductOptions $Product->getProductOptions();
  740.             foreach ($currentProductOptions as $currentProductOption) {
  741.                 $this->entityManager->remove($currentProductOption);
  742.                 $Product->removeProductOption($currentProductOption);
  743.             }
  744.             $this->entityManager->persist($Product);
  745.             $this->entityManager->flush();
  746.         }
  747.         if(isset($row[trans('productoption.csv.product.label.id')]) && strlen($row[trans('productoption.csv.product.label.id')]) > 0){
  748.             $productOptions explode(','$row[trans('productoption.csv.product.label.id')]);
  749.             foreach($productOptions as $option_id){
  750.                 if(is_numeric($option_id)){
  751.                     $Option $this->optionRepository->find($option_id);
  752.                     if($Option){
  753.                         $ProductOption = new ProductOption();
  754.                         $ProductOption->setProduct($Product);
  755.                         $ProductOption->setOption($Option);
  756.                         $this->productOptionRepository->save($ProductOption);
  757.                         $Product->addProductOption($ProductOption);
  758.                     }
  759.                 }
  760.             }
  761.         }
  762.     }
  763.     protected function getUser()
  764.     {
  765.         if (null === $token $this->tokenStorage->getToken()) {
  766.             return;
  767.         }
  768.         if (!is_object($user $token->getUser())) {
  769.             // e.g. anonymous authentication
  770.             return;
  771.         }
  772.         return $user;
  773.     }
  774. }