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 による検索について簡単に書きました。
お役に立てればと思います。