app/Plugin/ApexOrderItemOption/Event/ShoppingEvent.php line 105

Open in your IDE?
  1. <?php
  2. namespace Plugin\ApexOrderItemOption\Event;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Eccube\Entity\Master\OrderItemType;
  5. use Eccube\Entity\OrderItem;
  6. use Eccube\Entity\Shipping;
  7. use Eccube\Event\EccubeEvents;
  8. use Eccube\Event\EventArgs;
  9. use Eccube\Event\TemplateEvent;
  10. use Eccube\Form\Type\ShippingMultipleType;
  11. use Eccube\Repository\Master\OrderItemTypeRepository;
  12. use Plugin\ApexOrderItemOption\Entity\OrderItemOption;
  13. use Plugin\ApexOrderItemOption\Entity\OrderItemOptionCategory;
  14. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  15. use Symfony\Component\Form\Extension\Core\Type\CollectionType;
  16. class ShoppingEvent implements EventSubscriberInterface
  17. {
  18.     private $entityManager;
  19.     private $orderItemTypeRepository;
  20.     public function __construct(
  21.         EntityManagerInterface $entityManager,
  22.         OrderItemTypeRepository $orderItemTypeRepository
  23.     ){
  24.         $this->entityManager $entityManager;
  25.         $this->orderItemTypeRepository $orderItemTypeRepository;
  26.     }
  27.     /**
  28.      * @return array
  29.      */
  30.     public static function getSubscribedEvents()
  31.     {
  32.         return [
  33.             'Shopping/index.twig' => 'onTempleteShoppingIndex',
  34.             'Shopping/confirm.twig' => 'onTempleteShoppingIndex',
  35.             'Shopping/shipping_multiple.twig' => 'onTempleteShoppingShippingMultiple',
  36.             EccubeEvents::FRONT_SHOPPING_SHIPPING_MULTIPLE_INITIALIZE => 'onHookShoppingShippingMultipleInitialize',
  37.             EccubeEvents::FRONT_SHOPPING_SHIPPING_MULTIPLE_COMPLETE => 'onHookShoppingShippingMultipleComplete',
  38.         ];
  39.     }
  40.     public function onTempleteShoppingIndex(TemplateEvent $event)
  41.     {
  42.         $source $event->getSource();
  43.         if(preg_match("/\<p\>\{\{\sorderItem\.priceIncTax\|price\s\}\}/",$source$result)){
  44.             $search $result[0];
  45.             $replace "{{ include('@ApexOrderItemOption/default/Shopping/orderitem_option.twig') }}" $search;
  46.             $source str_replace($search$replace$source);
  47.         }
  48.         $event->setSource($source);
  49.     }
  50.     public function onTempleteShoppingShippingMultiple(TemplateEvent $event)
  51.     {
  52.         $source $event->getSource();
  53.         if(preg_match("/\{\%\sif\sorderItem\.productClass\.id\s\=\=\skey\s\%\}/",$source$result)){
  54.             $search $result[0];
  55.             $replace "{% if orderItem.productClass.id ~ '_' ~ orderItem.option_serial == key %}";
  56.             $source str_replace($search$replace$source);
  57.         }
  58.         if(preg_match("/\<div\sclass\=\"ec\-AddAddress\_\_itemtPrice\"\>/",$source$result)){
  59.             $search $result[0];
  60.             $replace $search "{{ include('@ApexOrderItemOption/default/Shopping/shipping_multiple_option.twig') }}";
  61.             $source str_replace($search$replace$source);
  62.         }
  63.         $event->setSource($source);
  64.         $parameters $event->getParameters();
  65.         $OrderItems $parameters['OrderItems'];
  66.         $OrderItemsForFormBuilder = [];
  67.         $ItemQuantitiesByOption = [];
  68.         $tmpIds = [];
  69.         $Order $OrderItems[0]->getOrder();
  70.         foreach($Order->getProductOrderItems() as $OrderItem){
  71.             $quantity $OrderItem->getQuantity();
  72.             $itemId $OrderItem->getProductClass()->getId();
  73.             $serial $OrderItem->getOptionSerial();
  74.             $key $itemId .'_'$serial;
  75.             if (!in_array($key$tmpIds)) {
  76.                 $OrderItemsForFormBuilder[] = $OrderItem;
  77.                 $tmpIds[] = $key;
  78.                 $ItemQuantitiesByOption[$key] = $quantity;
  79.             }else{
  80.                 $ItemQuantitiesByOption[$key] += $quantity;
  81.             }
  82.         }
  83.         $parameters['OrderItems'] = $OrderItemsForFormBuilder;
  84.         $parameters['compItemQuantities'] = $ItemQuantitiesByOption;
  85.         $event->setParameters($parameters);
  86.     }
  87.     public function onHookShoppingShippingMultipleInitialize(EventArgs $event)
  88.     {
  89.         $builder $event->getArgument('builder');
  90.         $Order $event->getArgument('Order');
  91.         $OrderItemsForFormBuilder = [];
  92.         $tmpIds = [];
  93.         foreach($Order->getProductOrderItems() as $OrderItem){
  94.             $itemId $OrderItem->getProductClass()->getId();
  95.             $serial $OrderItem->getOptionSerial();
  96.             $key $itemId .'_'$serial;
  97.             if (!in_array($key$tmpIds)) {
  98.                 $OrderItemsForFormBuilder[] = $OrderItem;
  99.                 $tmpIds[] = $key;
  100.             }
  101.         }
  102.         $builder->remove('shipping_multiple');
  103.         $builder
  104.             ->add('shipping_multiple'CollectionType::class, [
  105.                 'entry_type' => ShippingMultipleType::class,
  106.                 'data' => $OrderItemsForFormBuilder,
  107.                 'allow_add' => true,
  108.                 'allow_delete' => true,
  109.             ]);
  110.     }
  111.     public function onHookShoppingShippingMultipleComplete(EventArgs $event)
  112.     {
  113.         $form $event->getArgument('form');
  114.         $Order $event->getArgument('Order');
  115.         if ($form->isSubmitted() && $form->isValid()) {
  116.             $data $form['shipping_multiple'];
  117.             // フォームの入力から、送り先ごとに商品の数量を集計する
  118.             $arrOrderItemTemp = [];
  119.             foreach ($data as $multiples) {
  120.                 $OrderItem $multiples->getData();
  121.                 foreach ($multiples as $items) {
  122.                     foreach ($items as $item) {
  123.                         $CustomerAddress $item['customer_address']->getData();
  124.                         $customerAddressName $CustomerAddress->getShippingMultipleDefaultName();
  125.                         $itemId $OrderItem->getProductClass()->getId() . '_' $OrderItem->getOptionSerial();
  126.                         $quantity $item['quantity']->getData();
  127.                         if (isset($arrOrderItemTemp[$customerAddressName]) && array_key_exists($itemId$arrOrderItemTemp[$customerAddressName])) {
  128.                             $arrOrderItemTemp[$customerAddressName][$itemId] = $arrOrderItemTemp[$customerAddressName][$itemId] + $quantity;
  129.                         } else {
  130.                             $arrOrderItemTemp[$customerAddressName][$itemId] = $quantity;
  131.                         }
  132.                     }
  133.                 }
  134.             }
  135.             // -- ここから先がお届け先を再生成する処理 --
  136.             // お届け先情報をすべて削除
  137.             /** @var Shipping $Shipping */
  138.             foreach ($Order->getShippings() as $Shipping) {
  139.                 foreach ($Shipping->getOrderItems() as $OrderItem) {
  140.                     $Shipping->removeOrderItem($OrderItem);
  141.                     $Order->removeOrderItem($OrderItem);
  142.                     $this->entityManager->remove($OrderItem);
  143.                 }
  144.                 $Order->removeShipping($Shipping);
  145.                 $this->entityManager->remove($Shipping);
  146.             }
  147.             // お届け先のリストを作成する
  148.             $ShippingList = [];
  149.             foreach ($data as $multiples) {
  150.                 $OrderItem $multiples->getData();
  151.                 $ProductClass $OrderItem->getProductClass();
  152.                 $saleTypeId $ProductClass->getSaleType()->getId();
  153.                 $Delivery $OrderItem->getShipping()->getDelivery();
  154.                 foreach ($multiples as $items) {
  155.                     foreach ($items as $item) {
  156.                         $CustomerAddress $item['customer_address']->getData();
  157.                         $customerAddressName $CustomerAddress->getShippingMultipleDefaultName();
  158.                         if (isset($ShippingList[$customerAddressName][$saleTypeId])) {
  159.                             continue;
  160.                         }
  161.                         $Shipping = new Shipping();
  162.                         $Shipping->setOrder($Order)
  163.                             ->setDelivery($Delivery)
  164.                             ->setFromCustomerAddress($CustomerAddress);
  165.                         $Order->addShipping($Shipping);
  166.                         $ShippingList[$customerAddressName][$saleTypeId] = $Shipping;
  167.                     }
  168.                 }
  169.             }
  170.             // お届け先のリストを保存
  171.             foreach ($ShippingList as $ShippingListByAddress) {
  172.                 foreach ($ShippingListByAddress as $Shipping) {
  173.                     $this->entityManager->persist($Shipping);
  174.                 }
  175.             }
  176.             $ProductOrderType $this->orderItemTypeRepository->find(OrderItemType::PRODUCT);
  177.             // お届け先に、配送商品の情報(OrderItem)を関連付ける
  178.             foreach ($data as $multiples) {
  179.                 /** @var OrderItem $OrderItem */
  180.                 $OrderItem $multiples->getData();
  181.                 $ProductClass $OrderItem->getProductClass();
  182.                 $Product $OrderItem->getProduct();
  183.                 $saleTypeId $ProductClass->getSaleType()->getId();
  184.                 $itemId $OrderItem->getProductClass()->getId() . '_' $OrderItem->getOptionSerial();
  185.                 $optionSerial $OrderItem->getOptionSerial();
  186.                 $OrderItemOptions $OrderItem->getOrderItemOptions();
  187.                 $optionPrice $OrderItem->getOptionPrice();
  188.                 $optionTax $OrderItem->getOptionTax();
  189.                 foreach ($multiples as $items) {
  190.                     foreach ($items as $item) {
  191.                         $CustomerAddress $item['customer_address']->getData();
  192.                         $customerAddressName $CustomerAddress->getShippingMultipleDefaultName();
  193.                         // お届け先から商品の数量を取得
  194.                         $quantity 0;
  195.                         if (isset($arrOrderItemTemp[$customerAddressName]) && array_key_exists($itemId$arrOrderItemTemp[$customerAddressName])) {
  196.                             $quantity $arrOrderItemTemp[$customerAddressName][$itemId];
  197.                             unset($arrOrderItemTemp[$customerAddressName][$itemId]);
  198.                         } else {
  199.                             // この配送先には送る商品がないのでスキップ(通常ありえない)
  200.                             continue;
  201.                         }
  202.                         // 関連付けるお届け先のインスタンスを取得
  203.                         $Shipping $ShippingList[$customerAddressName][$saleTypeId];
  204.                         // インスタンスを生成して保存
  205.                         $OrderItem = new OrderItem();
  206.                         $OrderItem->setShipping($Shipping)
  207.                             ->setOrder($Order)
  208.                             ->setProductClass($ProductClass)
  209.                             ->setProduct($Product)
  210.                             ->setProductName($Product->getName())
  211.                             ->setProductCode($ProductClass->getCode())
  212.                             ->setPrice($ProductClass->getPrice02())
  213.                             ->setQuantity($quantity)
  214.                             ->setOrderItemType($ProductOrderType)
  215.                             ->setOptionSerial($optionSerial);
  216.                         $ClassCategory1 $ProductClass->getClassCategory1();
  217.                         if (!is_null($ClassCategory1)) {
  218.                             $OrderItem->setClasscategoryName1($ClassCategory1->getName());
  219.                             $OrderItem->setClassName1($ClassCategory1->getClassName()->getName());
  220.                         }
  221.                         $ClassCategory2 $ProductClass->getClassCategory2();
  222.                         if (!is_null($ClassCategory2)) {
  223.                             $OrderItem->setClasscategoryName2($ClassCategory2->getName());
  224.                             $OrderItem->setClassName2($ClassCategory2->getClassName()->getName());
  225.                         }
  226.                         foreach($OrderItemOptions as $OrderItemOption){
  227.                             $newOrderItemOption = new OrderItemOption();
  228.                             $newOrderItemOption->setOptionId($OrderItemOption->getOptionId())
  229.                                                ->setOrderItem($OrderItem)
  230.                                                ->setLabel($OrderItemOption->getLabel())
  231.                                                ->setSortNo($OrderItemOption->getSortNo());
  232.                             foreach($OrderItemOption->getOrderItemOptionCategories() as $OrderItemOptionCategory){
  233.                                 $newOrderItemOptionCategory = new OrderItemOptionCategory();
  234.                                 $newOrderItemOptionCategory->setOptionCategoryId($OrderItemOptionCategory->getOptionCategoryId())
  235.                                                            ->setOrderItemOption($newOrderItemOption)
  236.                                                            ->setValue($OrderItemOptionCategory->getValue())
  237.                                                            ->setPrice($OrderItemOptionCategory->getPrice())
  238.                                                            ->setTax($OrderItemOptionCategory->getTax())
  239.                                                            ->setSortNo($OrderItemOptionCategory->getSortNo());
  240.                                 $newOrderItemOption->addOrderItemOptionCategory($newOrderItemOptionCategory);
  241.                             }
  242.                             $OrderItem->addOrderItemOption($newOrderItemOption);
  243.                         }
  244.                         $OrderItem->setPrice($OrderItem->getPrice() + $optionPrice);
  245.                         $OrderItem->setTax($OrderItem->getTax() + $optionTax);
  246.                         $OrderItem->setOptionSetFlg(true);
  247.                         $Shipping->addOrderItem($OrderItem);
  248.                         $Order->addOrderItem($OrderItem);
  249.                         $this->entityManager->persist($OrderItem);
  250.                     }
  251.                 }
  252.             }
  253.             $this->entityManager->flush();
  254.         }
  255.     }
  256. }