EC-Cube 4系 Categoryで検索した商品の表示

EC-Cubeで商品登録の際にカテゴリを登録してある場合、登録カテゴリで商品を選択、表示することは可能です。
例えば、EC-cubeをインストールしてカテゴリ検索する方法は、URLに、
https://xxxx.xxx/products/list?icategory_id=8 で出来ます。

簡単にCategory_Idのみで検索するには、実際には不向きかと思います
以下のホームページを参考にCustomize Repositoryにファイルを作り、category_Idによる商品の検索を組み込んでみました。

上記を参考に、Customize Repositoryにcategory_Idによる検索ファイルを置くようにしました。手順は
1)/app/Customize/RepositoryにRepository Fileを作る
2)/app/Customize/ControllerにControllerを作る
3)/app/template/default/Productにテスト表示用Twigを作る
4)ドメイン/test にアクセスして確認

1)/app/Customize/RepositoryにRepository Fileを作る

EC-cubeのルート/app/Customize/Repositoryに検索用Repository Fileを作ります。
今回は、CustomizeCategoryRepositoryといるファイルを作りました。
/app/Customize/Repository/CustomizeCategoryRepository.php

<?php

namespace Customize\Repository;
use Eccube\Entity\Product; #ProductのDBから取得する為
use Eccube\Repository\AbstractRepository; #Repositoryを拡張する為
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Repository\ProductRepository;

/**
 * CustomizeCategoryRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class CustomizeCategoryRepository extends AbstractRepository
{
    /** 
     * @var EntityManagerIngerface
     */
    private $entityManager;


    /**
     * @var EccubeConfig
     */
    protected $eccubeConfig;

    /**
     * @var ProductRepository
     */
    private $productRepository;

    public function __construct(
        ManagerRegistry $registry,
        ECcubeConfig $eccubeConfig,
        EntityManagerInterface $entityManager,
        ProductRepository $productRepository
    ) {
        parent::__construct($registry, Product::class); #EntityのProductを呼び出している
        $this -> entityManager =$entityManager;
        $this->eccubeConfit = $eccubeConfig;
        $this -> productRepository = $productRepository;
    }

    /**
     * カテゴリ検索
     *
     * @return Products|array
     */
    public function findProductbyCategory(int $category_Id) #関数名(何でも良い)
    {
        $searchData = array();
        $qb = $this -> entityManager ->createQueryBuilder();
        $query = $qb->select('ctg')
            ->from('Eccube\\Entity\\Category','ctg')
            ->where ('ctg.id = :id') 
            ->setParameter('id',$category_Id) 
            ->getQuery();
        $searchData['category_id'] = $query->getOneOrNullResult();
        // 商品情報取得
        $qb = $this -> productRepository -> getQueryBuilderBySearchData($searchData);
        $query = $qb-> setMaxResults(10)->getQuery();
        $products = $query->getResult();
        return $products;
    }
} 

この中で
findProductbyCategory(int $category_Id)
が検索用の関数の名前です。引数はカテゴリIDです。
戻り値は $products です。(商品情報が戻ります)

2) /app/Customize/ControllerにControllerを作る

呼びだすControllerファイルは
EC-Cubeルート/app/Customize/Controllerの下に、以下のようなファイルを作ります。
app/Customize/Controller/testController.php

<?php
namespace Customize\Controller;

use Eccube\Controller\AbstractController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\Routing\Annotation\Route;
use Customize\Repository\CustomizeCategoryRepository;

class TestController extends AbstractController
{
    /**
     * @var CustomizeCategoryRepository
     */
    protected $customizeCategoryRepository;

    /**
     * TestController constructor.
     *
     *  @param CustomizeCategoryRepository $categoryRepository
     */

    public function __construct(
        CustomizeCategoryRepository $customizeCategoryRepository,
    ) {
        $this->customizeCategoryRepository = $customizeCategoryRepository;
    }

    /**
     *
     * @Route("/test", name="test") #URLを指定
     * @Template("Product/test.twig")  #ページ遷移先を指定      * 
     */
    public function index()
    {
        $category_Id = 8;
        $CategorizedProducts = $this->customizeCategoryRepository->findProductbyCategory($category_Id);

        return [
                'category8' => $CategorizedProducts,
            ];
    }
}

今回は https://EC-Cubeをインストールしたドメイン/test
で、表示が出来るようにControllerの内部で以下の様に定義しています。
/**
*
* @Route("/test", name="test") #URLを指定
* @Template("Product/test.twig") #ページ遷移先を指定
*
*/
また、以下のように関数の戻り値を定義しておくと、アクセスした際にtwigファイルでは、category8 の値として受け取ります。

return [ 'category8' => $CategorizedProducts, ];

3)/app/template/default/Productにテスト表示用Twigを作る

EC-Cubeのルートディレクトリ/app/template/default/Product
の下にtest.twigを作っておけば、Category_Idで検索された商品が表示されます。
たとえば、以下のようなtwigファイルです。

{% for product in category8 %}  <− category8 が受け渡す変数の値
  <p>{{ product }}</p>  <−商品名の表示になる
{% endfor %}

上記のproductを product.Id とすれば、商品のidを表示できます。
たとえば、
{% for product in category8 %}  <− category8 が受け渡す変数の値
  <p> {{product.id}} {{ product }}</p> <−商品Idと商品名が表示される。
{% endfor %}

/app/template/default/Product/test.twig

{% for product in category8 %}
    <p>{{ product }}</p>
{% endfor %}

4)アクセスして確認

今回はMAMPでのローカルサーバーを使っているので、
http://localhost:8888/test
にアクセスすれば、商品名が表示されます。

Category_Id による検索について簡単に書きました。
お役に立てればと思います。

よろしければサポートをお願いします。 今後の活動の励みになります。