Skip to content

Commit

Permalink
ClassCategory の物理削除対応
Browse files Browse the repository at this point in the history
  • Loading branch information
nanasess committed Sep 11, 2017
1 parent 682baad commit 308f0b0
Show file tree
Hide file tree
Showing 9 changed files with 231 additions and 44 deletions.
46 changes: 46 additions & 0 deletions src/Eccube/Controller/Admin/Product/ClassCategoryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,52 @@ public function delete(Application $app, Request $request, $class_name_id, $id)
return $app->redirect($app->url('admin_product_class_category', array('class_name_id' => $ClassName->getId())));
}

/**
* @Method("PUT")
* @Route("/{_admin}/product/class_category/{class_name_id}/{id}/visibility", requirements={"class_name_id" = "\d+", "id" = "\d+"}, name="admin_product_class_category_visibility")
*/
public function visibility(Application $app, Request $request, $class_name_id, $id)
{
$this->isTokenValid($app);

$ClassName = $this->classNameRepository->find($class_name_id);
if (!$ClassName) {
throw new NotFoundHttpException('商品規格が存在しません');
}

log_info('規格分類表示変更開始', array($id));

$TargetClassCategory = $this->classCategoryRepository->find($id);
if (!$TargetClassCategory || $TargetClassCategory->getClassName() != $ClassName) {
$app->deleteMessage();
return $app->redirect($app->url('admin_product_class_category', array('class_name_id' => $ClassName->getId())));
}

$status = $this->classCategoryRepository->toggleVisibility($TargetClassCategory);

if ($status === true) {

log_info('規格分類表示変更完了', array($id));

$event = new EventArgs(
array(
'ClassName' => $ClassName,
'TargetClassCategory' => $TargetClassCategory,
),
$request
);
$this->eventDispatcher->dispatch(EccubeEvents::ADMIN_PRODUCT_CLASS_CATEGORY_DELETE_COMPLETE, $event);

$app->addSuccess('admin.class_category.delete.complete', 'admin');
} else {
log_info('規格分類表示変更エラー', array($id));

$app->addError('admin.class_category.delete.error', 'admin');
}

return $app->redirect($app->url('admin_product_class_category', array('class_name_id' => $ClassName->getId())));
}

/**
* @Method("POST")
* @Route("/product/class_category/rank/move", name="admin_product_class_category_rank_move")
Expand Down
68 changes: 41 additions & 27 deletions src/Eccube/Entity/ClassCategory.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,11 @@ public function __toString()
private $rank;

/**
* @var int
* @var boolean
*
* @ORM\Column(name="del_flg", type="smallint", options={"unsigned":true,"default":0})
* @ORM\Column(name="visible", type="boolean", options={"default":true})
*/
private $del_flg = 0;
private $visible;

/**
* @var \DateTime
Expand Down Expand Up @@ -144,6 +144,20 @@ public function getName()
return $this->name;
}

/**
* Get name for Admin.
*
* @return string
*/
public function getNameForAdmin()
{
if ($this->isVisible()) {
return $this->getName();
} else {
return $this->getName().'(非表示)';
}
}

/**
* Set rank.
*
Expand All @@ -168,30 +182,6 @@ public function getRank()
return $this->rank;
}

/**
* Set delFlg.
*
* @param int $delFlg
*
* @return ClassCategory
*/
public function setDelFlg($delFlg)
{
$this->del_flg = $delFlg;

return $this;
}

/**
* Get delFlg.
*
* @return int
*/
public function getDelFlg()
{
return $this->del_flg;
}

/**
* Set createDate.
*
Expand Down Expand Up @@ -287,4 +277,28 @@ public function getCreator()
{
return $this->Creator;
}

/**
* Set visible
*
* @param boolean $visible
*
* @return ClassCategory
*/
public function setVisible($visible)
{
$this->visible = $visible;

return $this;
}

/**
* Is the visibility visible?
*
* @return boolean
*/
public function isVisible()
{
return $this->visible;
}
}
12 changes: 11 additions & 1 deletion src/Eccube/Entity/Product.php
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,14 @@ public function _calc()
if ($ProductClass->getDelFlg() === 1) {
continue;
}
$ClassCategory1 = $ProductClass->getClassCategory1();
$ClassCategory2 = $ProductClass->getClassCategory2();
if ($ClassCategory1 && !$ClassCategory1->isVisible()) {
continue;
}
if ($ClassCategory2 && !$ClassCategory2->isVisible()) {
continue;
}

// stock_find
$this->stockFinds[] = $ProductClass->getStockFind();
Expand Down Expand Up @@ -407,7 +415,9 @@ public function getClassCategories()
/* @var $ProductClass \Eccube\Entity\ProductClass */
$ClassCategory1 = $ProductClass->getClassCategory1();
$ClassCategory2 = $ProductClass->getClassCategory2();

if (!$ClassCategory2->isVisible()) {
continue;
}
$class_category_id1 = $ClassCategory1 ? (string) $ClassCategory1->getId() : '__unselected2';
$class_category_id2 = $ClassCategory2 ? (string) $ClassCategory2->getId() : '';
$class_category_name1 = $ClassCategory1 ? $ClassCategory1->getName() . ($ProductClass->getStockFind() ? '' : ' (品切れ中)') : '';
Expand Down
38 changes: 35 additions & 3 deletions src/Eccube/Repository/ClassCategoryRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ public function save($ClassCategory)
$rank = 0;
}
$ClassCategory->setRank($rank + 1);
$ClassCategory->setDelFlg(0);
$ClassCategory->setVisible(true);
}

$em->persist($ClassCategory);
Expand All @@ -176,6 +176,10 @@ public function save($ClassCategory)
*/
public function delete($ClassCategory)
{
if (is_null($ClassCategory->getId())) {
// 存在しない場合は何もしない
return false;
}
$em = $this->getEntityManager();
$em->getConnection()->beginTransaction();
try {
Expand All @@ -191,8 +195,7 @@ public function delete($ClassCategory)
->getQuery()
->execute();

$ClassCategory->setDelFlg(1);
$em->persist($ClassCategory);
$em->remove($ClassCategory);
$em->flush();

$em->getConnection()->commit();
Expand All @@ -204,4 +207,33 @@ public function delete($ClassCategory)

return true;
}

/**
* 規格カテゴリの表示/非表示を切り替える.
*
* @param \Eccube\Entity\ClassCategory $ClassCategory
* @return boolean 成功した場合 true
*/
public function toggleVisibility($ClassCategory)
{
$em = $this->getEntityManager();
$em->getConnection()->beginTransaction();
if ($ClassCategory->isVisible()) {
$ClassCategory->setVisible(false);
} else {
$ClassCategory->setVisible(true);
}
try {
$em->persist($ClassCategory);
$em->flush($ClassCategory);

$em->getConnection()->commit();
} catch (\Exception $e) {
$em->getConnection()->rollback();

return false;
}

return true;
}
}
14 changes: 7 additions & 7 deletions src/Eccube/Resource/doctrine/import_csv/dtb_class_category.csv
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
class_category_id,class_name_id,creator_id,name,rank,create_date,update_date,del_flg,discriminator_type
"1","1","1","金","1","2017-03-07 10:14:52","2017-03-07 10:14:52","0","classcategory"
"2","1","1","銀","2","2017-03-07 10:14:52","2017-03-07 10:14:52","0","classcategory"
"3","1","1","プラチナ","3","2017-03-07 10:14:52","2017-03-07 10:14:52","0","classcategory"
"4","2","1","120mm","1","2017-03-07 10:14:52","2017-03-07 10:14:52","0","classcategory"
"5","2","1","170mm","2","2017-03-07 10:14:52","2017-03-07 10:14:52","0","classcategory"
"6","2","1","150cm","3","2017-03-07 10:14:52","2017-03-07 10:14:52","0","classcategory"
class_category_id,class_name_id,creator_id,name,rank,create_date,update_date,visible,discriminator_type
"1","1","1","金","1","2017-03-07 10:14:52","2017-03-07 10:14:52","1","classcategory"
"2","1","1","銀","2","2017-03-07 10:14:52","2017-03-07 10:14:52","1","classcategory"
"3","1","1","プラチナ","3","2017-03-07 10:14:52","2017-03-07 10:14:52","1","classcategory"
"4","2","1","120mm","1","2017-03-07 10:14:52","2017-03-07 10:14:52","1","classcategory"
"5","2","1","170mm","2","2017-03-07 10:14:52","2017-03-07 10:14:52","1","classcategory"
"6","2","1","150cm","3","2017-03-07 10:14:52","2017-03-07 10:14:52","1","classcategory"
15 changes: 14 additions & 1 deletion src/Eccube/Resource/template/admin/Product/class_category.twig
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
</div>
<div id="sortable_list_box__name--{{ ClassCategory.id }}" class="item_pattern td">
<a href="{{ url('admin_product_class_category_edit', {class_name_id: ClassName.id, id: ClassCategory.id}) }}">
{{ ClassCategory.name }}
{{ ClassCategory.nameForAdmin }}
</a>
</div>
<div id="sortable_list_box__menu_box--{{ ClassCategory.id }}" class="icon_edit td">
Expand All @@ -135,6 +135,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
{% else %}
<li><a>編集中</a></li>
{% endif %}
{% if ClassCategory.isVisible %}
<li>
<a href="{{ url('admin_product_class_category_visibility', {class_name_id: ClassName.id, id: ClassCategory.id }) }}" {{ csrf_token_for_anchor() }}
data-method="put"
data-message="分類名を非表示に変更しますか?">非表示</a>
</li>
{% else %}
<li>
<a href="{{ url('admin_product_class_category_visibility', {class_name_id: ClassName.id, id: ClassCategory.id }) }}" {{ csrf_token_for_anchor() }}
data-method="put"
data-message="分類名を表示に変更しますか?">表示</a>
</li>
{% endif %}
<li>
<a href="{{ url('admin_product_class_category_delete', {class_name_id: ClassName.id, id: ClassCategory.id }) }}" {{ csrf_token_for_anchor() }}
data-method="delete"
Expand Down
9 changes: 8 additions & 1 deletion src/Eccube/Service/CartService.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,14 @@ public function addProduct($ProductClass, $quantity = 1)
return false;
}
}

$ClassCategory1 = $ProductClass->getClassCategory1();
if ($ClassCategory1 && !$ClassCategory1->isVisible()) {
return false;
}
$ClassCategory2 = $ProductClass->getClassCategory2();
if ($ClassCategory2 && !$ClassCategory2->isVisible()) {
return false;
}
/** @var Cart $cart */
$cart = $this->getCart();
$exists = $cart->getCartItemByIdentifier(ProductClass::class, $ProductClass->getId());
Expand Down
35 changes: 32 additions & 3 deletions tests/Eccube/Tests/Repository/ClassCategoryRepositoryTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public function setUp()
$ClassCategory
->setName('classcategory-'.$i.'-'.$j)
->setCreator($this->Member)
->setDelFlg(0)
->setVisible(true)
->setRank($j)
->setClassName($ClassName);
$ClassName->addClassCategory($ClassCategory);
Expand Down Expand Up @@ -218,11 +218,11 @@ public function testDelete()
$ClassCategory = $this->app['eccube.repository.class_category']->findOneBy(
array('name' => 'classcategory-1-0')
);
$ClassCategoryId = $ClassCategory->getId();
$result = $this->app['eccube.repository.class_category']->delete($ClassCategory);

$this->assertTrue($result);
$this->assertEquals(Constant::ENABLED, $ClassCategory->getDelFlg());
$this->assertTrue(0 === $ClassCategory->getRank());
self::assertNull($this->app['orm.em']->find(ClassCategory::class, $ClassCategoryId));
}

public function testDeleteWithException()
Expand All @@ -233,4 +233,33 @@ public function testDeleteWithException()
$this->assertFalse($result, '削除に失敗するはず');

}

public function testToggleVisibilityToHidden()
{
$ClassCategory = $this->app['eccube.repository.class_category']->findOneBy(
array('name' => 'classcategory-1-0')
);
$ClassCategoryId = $ClassCategory->getId();
$result = $this->app['eccube.repository.class_category']->toggleVisibility($ClassCategory);

$this->assertTrue($result);
$actual = $this->app['orm.em']->find(ClassCategory::class, $ClassCategoryId);
self::assertFalse($actual->isVisible());
}

public function testToggleVisibilityToVisible()
{
$ClassCategory = $this->app['eccube.repository.class_category']->findOneBy(
array('name' => 'classcategory-1-0')
);
$ClassCategory->setVisible(false);
$this->app['orm.em']->flush($ClassCategory);
$ClassCategoryId = $ClassCategory->getId();

$result = $this->app['eccube.repository.class_category']->toggleVisibility($ClassCategory);

$this->assertTrue($result);
$actual = $this->app['orm.em']->find(ClassCategory::class, $ClassCategoryId);
self::assertTrue($actual->isVisible());
}
}
Loading

0 comments on commit 308f0b0

Please sign in to comment.