Eccube\Controller\Admin\Order\EditController::index PHP Метод

index() публичный Метод

public index ( Application $app, Request $request, $id = null )
$app Eccube\Application
$request Symfony\Component\HttpFoundation\Request
    public function index(Application $app, Request $request, $id = null)
    {
        /* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
        $softDeleteFilter = $app['orm.em']->getFilters()->getFilter('soft_delete');
        $softDeleteFilter->setExcludes(array('Eccube\\Entity\\ProductClass', 'Eccube\\Entity\\Product'));
        $TargetOrder = null;
        $OriginOrder = null;
        if (is_null($id)) {
            // 空のエンティティを作成.
            $TargetOrder = $this->newOrder();
        } else {
            $TargetOrder = $app['eccube.repository.order']->find($id);
            if (is_null($TargetOrder)) {
                throw new NotFoundHttpException();
            }
        }
        // 編集前の受注情報を保持
        $OriginOrder = clone $TargetOrder;
        $OriginalOrderDetails = new ArrayCollection();
        foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
            $OriginalOrderDetails->add($OrderDetail);
        }
        $builder = $app['form.factory']->createBuilder('order', $TargetOrder);
        $event = new EventArgs(array('builder' => $builder, 'OriginOrder' => $OriginOrder, 'TargetOrder' => $TargetOrder, 'OriginOrderDetails' => $OriginalOrderDetails), $request);
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_INITIALIZE, $event);
        $form = $builder->getForm();
        if ('POST' === $request->getMethod()) {
            $form->handleRequest($request);
            $event = new EventArgs(array('builder' => $builder, 'OriginOrder' => $OriginOrder, 'TargetOrder' => $TargetOrder, 'OriginOrderDetails' => $OriginalOrderDetails), $request);
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_PROGRESS, $event);
            // 入力情報にもとづいて再計算.
            $this->calculate($app, $TargetOrder);
            // 登録ボタン押下
            switch ($request->get('mode')) {
                case 'register':
                    log_info('受注登録開始', array($TargetOrder->getId()));
                    if ($TargetOrder->getTotal() > $app['config']['max_total_fee']) {
                        log_info('受注登録入力チェックエラー', array($TargetOrder->getId()));
                        $form['charge']->addError(new FormError('合計金額の上限を超えております。'));
                    } elseif ($form->isValid()) {
                        $BaseInfo = $app['eccube.repository.base_info']->get();
                        // お支払い方法の更新
                        $TargetOrder->setPaymentMethod($TargetOrder->getPayment()->getMethod());
                        // 配送業者・お届け時間の更新
                        $Shippings = $TargetOrder->getShippings();
                        foreach ($Shippings as $Shipping) {
                            $Shipping->setShippingDeliveryName($Shipping->getDelivery()->getName());
                            if (!is_null($Shipping->getDeliveryTime())) {
                                $Shipping->setShippingDeliveryTime($Shipping->getDeliveryTime()->getDeliveryTime());
                            } else {
                                $Shipping->setShippingDeliveryTime(null);
                            }
                        }
                        // 受注日/発送日/入金日の更新.
                        $this->updateDate($app, $TargetOrder, $OriginOrder);
                        // 受注明細で削除されているものをremove
                        foreach ($OriginalOrderDetails as $OrderDetail) {
                            if (false === $TargetOrder->getOrderDetails()->contains($OrderDetail)) {
                                $app['orm.em']->remove($OrderDetail);
                            }
                        }
                        if ($BaseInfo->getOptionMultipleShipping() == Constant::ENABLED) {
                            foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
                                /** @var $OrderDetail \Eccube\Entity\OrderDetail */
                                $OrderDetail->setOrder($TargetOrder);
                            }
                            /** @var \Eccube\Entity\Shipping $Shipping */
                            foreach ($Shippings as $Shipping) {
                                $shipmentItems = $Shipping->getShipmentItems();
                                /** @var \Eccube\Entity\ShipmentItem $ShipmentItem */
                                foreach ($shipmentItems as $ShipmentItem) {
                                    $ShipmentItem->setOrder($TargetOrder);
                                    $ShipmentItem->setShipping($Shipping);
                                    $app['orm.em']->persist($ShipmentItem);
                                }
                                $Shipping->setOrder($TargetOrder);
                                $app['orm.em']->persist($Shipping);
                            }
                        } else {
                            $NewShipmentItems = new ArrayCollection();
                            foreach ($TargetOrder->getOrderDetails() as $OrderDetail) {
                                /** @var $OrderDetail \Eccube\Entity\OrderDetail */
                                $OrderDetail->setOrder($TargetOrder);
                                $NewShipmentItem = new ShipmentItem();
                                $NewShipmentItem->setProduct($OrderDetail->getProduct())->setProductClass($OrderDetail->getProductClass())->setProductName($OrderDetail->getProduct()->getName())->setProductCode($OrderDetail->getProductClass()->getCode())->setClassCategoryName1($OrderDetail->getClassCategoryName1())->setClassCategoryName2($OrderDetail->getClassCategoryName2())->setClassName1($OrderDetail->getClassName1())->setClassName2($OrderDetail->getClassName2())->setPrice($OrderDetail->getPrice())->setQuantity($OrderDetail->getQuantity())->setOrder($TargetOrder);
                                $NewShipmentItems[] = $NewShipmentItem;
                            }
                            // 配送商品の更新. delete/insert.
                            $Shippings = $TargetOrder->getShippings();
                            foreach ($Shippings as $Shipping) {
                                $ShipmentItems = $Shipping->getShipmentItems();
                                foreach ($ShipmentItems as $ShipmentItem) {
                                    $app['orm.em']->remove($ShipmentItem);
                                }
                                $ShipmentItems->clear();
                                foreach ($NewShipmentItems as $NewShipmentItem) {
                                    $NewShipmentItem->setShipping($Shipping);
                                    $ShipmentItems->add($NewShipmentItem);
                                }
                            }
                        }
                        $Customer = $TargetOrder->getCustomer();
                        if ($Customer) {
                            // 受注情報の会員情報を更新
                            $TargetOrder->setSex($Customer->getSex());
                            $TargetOrder->setJob($Customer->getJob());
                            $TargetOrder->setBirth($Customer->getBirth());
                        }
                        $app['orm.em']->persist($TargetOrder);
                        $app['orm.em']->flush();
                        if ($Customer) {
                            // 会員の場合、購入回数、購入金額などを更新
                            $app['eccube.repository.customer']->updateBuyData($app, $Customer, $TargetOrder->getOrderStatus()->getId());
                        }
                        $event = new EventArgs(array('form' => $form, 'OriginOrder' => $OriginOrder, 'TargetOrder' => $TargetOrder, 'OriginOrderDetails' => $OriginalOrderDetails, 'Customer' => $Customer), $request);
                        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_INDEX_COMPLETE, $event);
                        $app->addSuccess('admin.order.save.complete', 'admin');
                        log_info('受注登録完了', array($TargetOrder->getId()));
                        return $app->redirect($app->url('admin_order_edit', array('id' => $TargetOrder->getId())));
                    }
                    break;
                case 'add_delivery':
                    // お届け先情報の新規追加
                    $form = $builder->getForm();
                    $Shipping = new \Eccube\Entity\Shipping();
                    $Shipping->setDelFlg(Constant::DISABLED);
                    $TargetOrder->addShipping($Shipping);
                    $Shipping->setOrder($TargetOrder);
                    $form->setData($TargetOrder);
                    break;
                default:
                    break;
            }
        }
        // 会員検索フォーム
        $builder = $app['form.factory']->createBuilder('admin_search_customer');
        $event = new EventArgs(array('builder' => $builder, 'OriginOrder' => $OriginOrder, 'TargetOrder' => $TargetOrder, 'OriginOrderDetails' => $OriginalOrderDetails), $request);
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_CUSTOMER_INITIALIZE, $event);
        $searchCustomerModalForm = $builder->getForm();
        // 商品検索フォーム
        $builder = $app['form.factory']->createBuilder('admin_search_product');
        $event = new EventArgs(array('builder' => $builder, 'OriginOrder' => $OriginOrder, 'TargetOrder' => $TargetOrder, 'OriginOrderDetails' => $OriginalOrderDetails), $request);
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_ORDER_EDIT_SEARCH_PRODUCT_INITIALIZE, $event);
        $searchProductModalForm = $builder->getForm();
        // 配送業者のお届け時間
        $times = array();
        $deliveries = $app['eccube.repository.delivery']->findAll();
        foreach ($deliveries as $Delivery) {
            $deliveryTiems = $Delivery->getDeliveryTimes();
            foreach ($deliveryTiems as $DeliveryTime) {
                $times[$Delivery->getId()][$DeliveryTime->getId()] = $DeliveryTime->getDeliveryTime();
            }
        }
        return $app->render('Order/edit.twig', array('form' => $form->createView(), 'searchCustomerModalForm' => $searchCustomerModalForm->createView(), 'searchProductModalForm' => $searchProductModalForm->createView(), 'Order' => $TargetOrder, 'id' => $id, 'shippingDeliveryTimes' => $app['serializer']->serialize($times, 'json')));
    }