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));
}
}