[EC-CUBE4.0.2]商品詳細ページの関連カテゴリ表示を

  • 公開日:2019/7/10

EC-CUBE4の商品詳細ページに表示される関連カテゴリはデフォルトでは以下のように表示されます。

デフォルトの関連カテゴリ表示

親カテゴリが何度も表示されてクドいので次のようにスッキリ表示に変更。その方法をメモ。

スッキリ表示に改修した関連カテゴリ表示

表示制御ではなく登録制御で対応

商品詳細ページのテンプレートファイルを改修して表示制御できるかと思ったけど中々難しく、結局は商品登録時に子カテゴリを選択すると親カテゴリも併せて登録されてしまうところが問題だと考え、親カテゴリが同時に登録されるのを停止することにしました。

カスタマイズControllerを作成

Controllerファイルをカスタマイズするので以下を参考に、既存のルーティングを上書きすることにします。
コントローラのカスタマイズ

src/Eccube/Controller/Admin/Product/ProductController.phpをコピーして
app/Customize/Controller/Admin/Product/CustomizeProductController.phpを作成します。
※「CustomizeProductController」は任意

CustomizeProductControllerを編集

まず、namespaceを変更します。

<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) LOCKON CO.,LTD. All Rights Reserved.
 *
 * http://www.lockon.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Customize\Controller\Admin\Product;

use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use Eccube\Common\Constant;
use Eccube\Controller\AbstractController;

次に、class名を変更します。

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Routing\RouterInterface;

class CustomizeProductController extends AbstractController
{
    /**
     * @var CsvExportService
     */
    protected $csvExportService;

そして親カテゴリを登録している部分を削除します。
(以下は削除部分がわかるようにコメントにしています。)

// カテゴリの登録
// 一度クリア
/* @var $Product \Eccube\Entity\Product */
foreach ($Product->getProductCategories() as $ProductCategory) {
	$Product->removeProductCategory($ProductCategory);
	$this->entityManager->remove($ProductCategory);
}
$this->entityManager->persist($Product);
$this->entityManager->flush();

$count = 1;
$Categories = $form->get('Category')->getData();
$categoriesIdList = [];
foreach ($Categories as $Category) {
//	foreach ($Category->getPath() as $ParentCategory) {
//		if (!isset($categoriesIdList[$ParentCategory->getId()])) {
//			$ProductCategory = $this->createProductCategory($Product, $ParentCategory, $count);
//			$this->entityManager->persist($ProductCategory);
//			$count++;
//			/* @var $Product \Eccube\Entity\Product */
//			$Product->addProductCategory($ProductCategory);
//			$categoriesIdList[$ParentCategory->getId()] = true;
//		}
//	}
	if (!isset($categoriesIdList[$Category->getId()])) {
		$ProductCategory = $this->createProductCategory($Product, $Category, $count);
		$this->entityManager->persist($ProductCategory);
		$count++;
		/* @var $Product \Eccube\Entity\Product */
		$Product->addProductCategory($ProductCategory);
//		$categoriesIdList[$ParentCategory->getId()] = true;
	}
}

これで子カテゴリだけが登録されるようになるので、関連カテゴリの表示も思い通りになりました。