EC-CUBEでは、商品が登録されているカテゴリは削除できない仕様になっています。それが例え「非公開」「廃止」の商品であっても削除することはできません。
ただ、登録商品があってもカテゴリを削除したいと思う人は多いと思います。正直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();
}
カテゴリ削除できるプラグインもあります
プラグインがありますのでオーナーズストアからダウンロードしてみてください。
・商品や子カテゴリがあってもカテゴリ削除可能プラグイン for EC-CUBE4.2
https://www.ec-cube.net/products/detail.php?product_id=2909
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。