登録商品があってもカテゴリを削除したいと思う人は多いと思います。正直1つ1つ商品からカテゴリの登録を外していくようなことはしたくありません・・・。

SQLを実行してカテゴリと商品の紐付きを解除してもよいのですが、今回はカテゴリに登録商品があってもカテゴリ削除できるようにするカスタマイズをご紹介します。

いくつか方法はありますが、危なくなさそうな方法で。

テンプレートの修正

対象ファイル:src/Eccube/Resource/template/admin/Product/category.twig

商品があっても削除ボタンを押せるようにします。

[修正前]

<a class="btn btn-ec-actionIcon{% if Category.Children|length > 0 or Category.hasProductCategories %} disabled{% endif %}"

[修正後] 

<a class="btn btn-ec-actionIcon{% if Category.Children|length > 0%} disabled{% endif %}"

削除処理の修正

対象ファイル:src/Eccube/Repository/CategoryRepository.php

カテゴリを削除する前に商品との紐付きを削除します。

deleteメソッドを下記のように修正してください。

/**
* カテゴリを削除する.
* @see https://umebius.com/eccube/delete-category-if-product-exists/
*
* @param Category $Category 削除対象のカテゴリ
*
* @throws ForeignKeyConstraintViolationException 外部キー制約違反の場合
* @throws DriverException SQLiteの場合, 外部キー制約違反が発生すると, DriverExceptionをthrowします.
*/
public function delete($Category)
{
$this
->createQueryBuilder('c')
->update()
->set('c.sort_no', 'c.sort_no - 1')
->where('c.sort_no > :sort_no')
->setParameter('sort_no', $Category->getSortNo())
->getQuery()
->execute();

$em = $this->getEntityManager();

/* 追加部分ここから */
$qb = $em->getRepository(\Eccube\Entity\ProductCategory::class)->createQueryBuilder('product_category')->delete();
$qb
->where('product_category.Category = :category')
->setParameter('category', $Category->getId());
$qb->getQuery()->execute();
/* 追加部分ここまで */

$em->remove($Category);
$em->flush();
}

ECCUBE制作トップへ

EC-CUBEカスタマイズに関するお問い合わせはこちら

    脆弱性修正