Eccube\Controller\Admin\Product\ProductClassController::edit PHP Method

edit() public method

商品規格の登録、更新、削除を行う
public edit ( Application $app, Request $request, $id )
$app Eccube\Application
$request Symfony\Component\HttpFoundation\Request
    public function edit(Application $app, Request $request, $id)
    {
        /* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
        $softDeleteFilter = $app['orm.em']->getFilters()->getFilter('soft_delete');
        $softDeleteFilter->setExcludes(array('Eccube\\Entity\\TaxRule'));
        /** @var $Product \Eccube\Entity\Product */
        $Product = $app['eccube.repository.product']->find($id);
        if (!$Product) {
            throw new NotFoundHttpException('商品が存在しません');
        }
        $builder = $app['form.factory']->createBuilder();
        $builder->add('product_classes', 'collection', array('type' => 'admin_product_class', 'allow_add' => true, 'allow_delete' => true));
        $event = new EventArgs(array('builder' => $builder, 'Product' => $Product), $request);
        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_EDIT_INITIALIZE, $event);
        $form = $builder->getForm();
        $ProductClasses = $this->getProductClassesExcludeNonClass($Product);
        if ('POST' === $request->getMethod()) {
            $form->handleRequest($request);
            switch ($request->get('mode')) {
                case 'edit':
                    // 新規登録
                    log_info('商品規格新規登録開始', array($id));
                    if (count($ProductClasses) > 0) {
                        // 既に登録されていれば最初の画面に戻す
                        log_info('商品規格登録済', array($id));
                        return $app->redirect($app->url('admin_product_product_class', array('id' => $id)));
                    }
                    $addProductClasses = array();
                    $tmpProductClass = null;
                    foreach ($form->get('product_classes') as $formData) {
                        // 追加対象の行をvalidate
                        $ProductClass = $formData->getData();
                        if ($ProductClass->getAdd()) {
                            if ($formData->isValid()) {
                                $addProductClasses[] = $ProductClass;
                            } else {
                                // 対象行のエラー
                                return $this->render($app, $Product, $ProductClass, true, $form);
                            }
                        }
                        $tmpProductClass = $ProductClass;
                    }
                    if (count($addProductClasses) == 0) {
                        // 対象がなければエラー
                        log_info('商品規格が未選択', array($id));
                        $error = array('message' => '商品規格が選択されていません。');
                        return $this->render($app, $Product, $tmpProductClass, true, $form, $error);
                    }
                    // 選択された商品規格を登録
                    $this->insertProductClass($app, $Product, $addProductClasses);
                    // デフォルトの商品規格を更新
                    $defaultProductClass = $app['eccube.repository.product_class']->findOneBy(array('Product' => $Product, 'ClassCategory1' => null, 'ClassCategory2' => null));
                    $defaultProductClass->setDelFlg(Constant::ENABLED);
                    $app['orm.em']->flush();
                    log_info('商品規格新規登録完了', array($id));
                    $event = new EventArgs(array('form' => $form, 'Product' => $Product, 'defaultProductClass' => $defaultProductClass), $request);
                    $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_EDIT_COMPLETE, $event);
                    $app->addSuccess('admin.product.product_class.save.complete', 'admin');
                    break;
                case 'update':
                    // 更新
                    log_info('商品規格更新開始', array($id));
                    if (count($ProductClasses) == 0) {
                        // 商品規格が0件であれば最初の画面に戻す
                        log_info('商品規格が存在しません', array($id));
                        return $app->redirect($app->url('admin_product_product_class', array('id' => $id)));
                    }
                    $checkProductClasses = array();
                    $removeProductClasses = array();
                    $tempProductClass = null;
                    foreach ($form->get('product_classes') as $formData) {
                        // 追加対象の行をvalidate
                        $ProductClass = $formData->getData();
                        if ($ProductClass->getAdd()) {
                            if ($formData->isValid()) {
                                $checkProductClasses[] = $ProductClass;
                            } else {
                                return $this->render($app, $Product, $ProductClass, false, $form);
                            }
                        } else {
                            // 削除対象の行
                            $removeProductClasses[] = $ProductClass;
                        }
                        $tempProductClass = $ProductClass;
                    }
                    if (count($checkProductClasses) == 0) {
                        // 対象がなければエラー
                        log_info('商品規格が存在しません', array($id));
                        $error = array('message' => '商品規格が選択されていません。');
                        return $this->render($app, $Product, $tempProductClass, false, $form, $error);
                    }
                    // 登録対象と更新対象の行か判断する
                    $addProductClasses = array();
                    $updateProductClasses = array();
                    foreach ($checkProductClasses as $cp) {
                        $flag = false;
                        // 既に登録済みの商品規格か確認
                        foreach ($ProductClasses as $productClass) {
                            if ($productClass->getProduct()->getId() == $id && $productClass->getClassCategory1() == $cp->getClassCategory1() && $productClass->getClassCategory2() == $cp->getClassCategory2()) {
                                $updateProductClasses[] = $cp;
                                // 商品情報
                                $cp->setProduct($Product);
                                // 商品在庫
                                $productStock = $productClass->getProductStock();
                                if (!$cp->getStockUnlimited()) {
                                    $productStock->setStock($cp->getStock());
                                } else {
                                    $productStock->setStock(null);
                                }
                                $this->setDefualtProductClass($app, $productClass, $cp);
                                $flag = true;
                                break;
                            }
                        }
                        if (!$flag) {
                            $addProductClasses[] = $cp;
                        }
                    }
                    foreach ($removeProductClasses as $rc) {
                        // 登録されている商品規格に削除フラグをセット
                        foreach ($ProductClasses as $productClass) {
                            if ($productClass->getProduct()->getId() == $id && $productClass->getClassCategory1() == $rc->getClassCategory1() && $productClass->getClassCategory2() == $rc->getClassCategory2()) {
                                $productClass->setDelFlg(Constant::ENABLED);
                                break;
                            }
                        }
                    }
                    // 選択された商品規格を登録
                    $this->insertProductClass($app, $Product, $addProductClasses);
                    $app['orm.em']->flush();
                    log_info('商品規格更新完了', array($id));
                    $event = new EventArgs(array('form' => $form, 'Product' => $Product, 'updateProductClasses' => $updateProductClasses, 'addProductClasses' => $addProductClasses), $request);
                    $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_EDIT_UPDATE, $event);
                    $app->addSuccess('admin.product.product_class.update.complete', 'admin');
                    break;
                case 'delete':
                    // 削除
                    log_info('商品規格削除開始', array($id));
                    if (count($ProductClasses) == 0) {
                        // 既に商品が削除されていれば元の画面に戻す
                        log_info('商品規格が存在しません', array($id));
                        return $app->redirect($app->url('admin_product_product_class', array('id' => $id)));
                    }
                    foreach ($ProductClasses as $ProductClass) {
                        // 登録されている商品規格に削除フラグをセット
                        $ProductClass->setDelFlg(Constant::ENABLED);
                    }
                    /* @var $softDeleteFilter \Eccube\Doctrine\Filter\SoftDeleteFilter */
                    $softDeleteFilter = $app['orm.em']->getFilters()->getFilter('soft_delete');
                    $softDeleteFilter->setExcludes(array('Eccube\\Entity\\ProductClass'));
                    // デフォルトの商品規格を更新
                    $defaultProductClass = $app['eccube.repository.product_class']->findOneBy(array('Product' => $Product, 'ClassCategory1' => null, 'ClassCategory2' => null, 'del_flg' => Constant::ENABLED));
                    $defaultProductClass->setDelFlg(Constant::DISABLED);
                    $app['orm.em']->flush();
                    log_info('商品規格削除完了', array($id));
                    $event = new EventArgs(array('form' => $form, 'Product' => $Product, 'defaultProductClass' => $defaultProductClass), $request);
                    $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_EDIT_DELETE, $event);
                    $app->addSuccess('admin.product.product_class.delete.complete', 'admin');
                    break;
                default:
                    break;
            }
        }
        return $app->redirect($app->url('admin_product_product_class', array('id' => $id)));
    }