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