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

index() public method

商品規格が登録されていなければ新規登録、登録されていれば更新画面を表示する
public index ( Application $app, Request $request, $id )
$app Eccube\Application
$request Symfony\Component\HttpFoundation\Request
    public function index(Application $app, Request $request, $id)
    {
        /** @var $Product \Eccube\Entity\Product */
        $Product = $app['eccube.repository.product']->find($id);
        $hasClassCategoryFlg = false;
        if (!$Product) {
            throw new NotFoundHttpException('商品が存在しません');
        }
        // 商品規格情報が存在しなければ新規登録させる
        if (!$Product->hasProductClass()) {
            // 登録画面を表示
            log_info('商品規格新規登録表示', array($id));
            $builder = $app['form.factory']->createBuilder();
            $builder->add('class_name1', 'entity', array('class' => 'Eccube\\Entity\\ClassName', 'property' => 'name', 'empty_value' => '規格1を選択', 'constraints' => array(new Assert\NotBlank())))->add('class_name2', 'entity', array('class' => 'Eccube\\Entity\\ClassName', 'property' => 'name', 'empty_value' => '規格2を選択', 'required' => false));
            $event = new EventArgs(array('builder' => $builder, 'Product' => $Product), $request);
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_INDEX_INITIALIZE, $event);
            $form = $builder->getForm();
            $productClassForm = null;
            if ('POST' === $request->getMethod()) {
                $form->handleRequest($request);
                if ($form->isValid()) {
                    $data = $form->getData();
                    $ClassName1 = $data['class_name1'];
                    $ClassName2 = $data['class_name2'];
                    log_info('選択された商品規格', array($ClassName1, $ClassName2));
                    // 各規格が選択されている際に、分類を保有しているか確認
                    $class1Valied = $this->isValiedCategory($ClassName1);
                    $class2Valied = $this->isValiedCategory($ClassName2);
                    // 規格が選択されていないか、選択された状態で分類が保有されていれば、画面表示
                    if ($class1Valied && $class2Valied) {
                        $hasClassCategoryFlg = true;
                    }
                    if (!is_null($ClassName2) && $ClassName1->getId() == $ClassName2->getId()) {
                        // 規格1と規格2が同じ値はエラー
                        $form['class_name2']->addError(new FormError('規格1と規格2は、同じ値を使用できません。'));
                    } else {
                        // 規格分類が設定されていない商品規格を取得
                        $orgProductClasses = $Product->getProductClasses();
                        $sourceProduct = $orgProductClasses[0];
                        // 規格分類が組み合わされた商品規格を取得
                        $ProductClasses = $this->createProductClasses($app, $Product, $ClassName1, $ClassName2);
                        // 組み合わされた商品規格にデフォルト値をセット
                        foreach ($ProductClasses as $productClass) {
                            $this->setDefualtProductClass($app, $productClass, $sourceProduct);
                        }
                        $builder = $app['form.factory']->createBuilder();
                        $builder->add('product_classes', 'collection', array('type' => 'admin_product_class', 'allow_add' => true, 'allow_delete' => true, 'data' => $ProductClasses));
                        $event = new EventArgs(array('builder' => $builder, 'Product' => $Product, 'ProductClasses' => $ProductClasses), $request);
                        $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_INDEX_CLASSES, $event);
                        $productClassForm = $builder->getForm()->createView();
                    }
                }
            }
            return $app->render('Product/product_class.twig', array('form' => $form->createView(), 'classForm' => $productClassForm, 'Product' => $Product, 'not_product_class' => true, 'error' => null, 'has_class_category_flg' => $hasClassCategoryFlg));
        } else {
            // 既に商品規格が登録されている場合、商品規格画面を表示する
            log_info('商品規格登録済表示', array($id));
            // 既に登録されている商品規格を取得
            $ProductClasses = $this->getProductClassesExcludeNonClass($Product);
            // 設定されている規格分類1、2を取得(商品規格の規格分類には必ず同じ値がセットされている)
            $ProductClass = $ProductClasses[0];
            $ClassName1 = $ProductClass->getClassCategory1()->getClassName();
            $ClassName2 = null;
            if (!is_null($ProductClass->getClassCategory2())) {
                $ClassName2 = $ProductClass->getClassCategory2()->getClassName();
            }
            // 規格分類が組み合わされた空の商品規格を取得
            $createProductClasses = $this->createProductClasses($app, $Product, $ClassName1, $ClassName2);
            $mergeProductClasses = array();
            // 商品税率が設定されている場合、商品税率を項目に設定
            $BaseInfo = $app['eccube.repository.base_info']->get();
            if ($BaseInfo->getOptionProductTaxRule() == Constant::ENABLED) {
                foreach ($ProductClasses as $class) {
                    if ($class->getTaxRule() && !$class->getTaxRule()->getDelFlg()) {
                        $class->setTaxRate($class->getTaxRule()->getTaxRate());
                    }
                }
            }
            // 登録済み商品規格と空の商品規格をマージ
            $flag = false;
            foreach ($createProductClasses as $createProductClass) {
                // 既に登録済みの商品規格にチェックボックスを設定
                foreach ($ProductClasses as $productClass) {
                    if ($productClass->getClassCategory1() == $createProductClass->getClassCategory1() && $productClass->getClassCategory2() == $createProductClass->getClassCategory2()) {
                        // チェックボックスを追加
                        $productClass->setAdd(true);
                        $flag = true;
                        break;
                    }
                }
                if (!$flag) {
                    $mergeProductClasses[] = $createProductClass;
                }
                $flag = false;
            }
            // 登録済み商品規格と空の商品規格をマージ
            foreach ($mergeProductClasses as $mergeProductClass) {
                // 空の商品規格にデフォルト値を設定
                $this->setDefualtProductClass($app, $mergeProductClass, $ProductClass);
                $ProductClasses->add($mergeProductClass);
            }
            $builder = $app['form.factory']->createBuilder();
            $builder->add('product_classes', 'collection', array('type' => 'admin_product_class', 'allow_add' => true, 'allow_delete' => true, 'data' => $ProductClasses));
            $event = new EventArgs(array('builder' => $builder, 'Product' => $Product, 'ProductClasses' => $ProductClasses), $request);
            $app['eccube.event.dispatcher']->dispatch(EccubeEvents::ADMIN_PRODUCT_PRODUCT_CLASS_INDEX_CLASSES, $event);
            $productClassForm = $builder->getForm()->createView();
            return $app->render('Product/product_class.twig', array('classForm' => $productClassForm, 'Product' => $Product, 'class_name1' => $ClassName1, 'class_name2' => $ClassName2, 'not_product_class' => false, 'error' => null, 'has_class_category_flg' => true));
        }
    }