この記事では、特定の「タグ」が付いた商品のみをデータベースから検索し、一覧表示する方法を紹介します。
デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。
カスタマイズ後は、デバッグモードの解除を忘れないように。
【完成例】タグ商品一覧ページ
以下のような、特定のタグが付いた商品の画像・商品名・価格が一覧で表示されるページを作成します。
こちらは、商品登録時に【サンプル】というタグを付与し、【サンプル】タグが付与された商品のみが表示される一覧ページです。
(上図のサンプル_1〜サンプル_4には、【サンプル】というタグが付いています。)
なお、新規ページは ” 管理画面 > コンテンツ管理 > ページ管理 ” から作成したものでも構いませんが、その場合はControllerファイルの作成がやや難しいです。(参考:新規ページのControllerを作成する方法)
特別な理由がなければ、こちらの記事を参考にベースとなるControllerを新規作成してから取り掛かるのがオススメです。
タグ商品一覧ページの作成手順
- タグ商品一覧を表示させる新規ページを作成。
- こちらは 前回 作成済のため、本記事ではスキップ
- 新規ページのControllerを作成。
- 商品一覧を表示するためのコードを新規ページに記載。
- EC CUBE 管理画面にてキャッシュを削除。
Controllerの作成
以下のようなControllerファイルを作成し、app/Customize/Controllerにアップします。
今回は、前回の記事 でControllerは作成済のため、そのファイルを以下の通り修正しました。
<?php
namespace Customize\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Eccube\Controller\AbstractController;
use Eccube\Repository\ProductRepository; // ProductRepositoyの使用を宣言
class SamplePageController extends AbstractController
{
/**
* ProductRepositoryのインスタンスを保持するプロパティ
* @var ProductRepository
*/
protected $productRepository;
/**
* コンストラクタでProductRepositoryのインスタンスを注入
* @param ProductRepository $productRepository
*/
public function __construct(ProductRepository $productRepository) {
$this->productRepository = $productRepository;
}
/**
* @Route("/lists/sample", name="lists_sample")
* @Template("sample.twig")
*/
public function index(Request $request)
{
// ID=4のタグをもつ商品を抽出するクエリを作成
$customQb = $this->productRepository->createQueryBuilder('p');
$customQb->innerJoin('p.ProductTag', 'pt')
->innerJoin('pt.Tag', 't')
->andWhere('t.id = :Tag')
->setParameter('Tag', 4);
// 上記クエリを実行し、ID=4のタグをもつ商品を$TagProductsに格納
$TagProducts = $customQb->getQuery()->getResult();
return [
// Twigテンプレートに渡す変数「TagProducts」に、$TagProductsのデータを設定
'TagProducts' => $TagProducts,
];
}
}
このControllerによって、@Routeで指定したURLにアクセスしたときに、データベースから特定のタグをもつ商品データを引っ張ってくることができます。
上記コードでは、URL「ドメイン名/lists/sample」にアクセスしたときに、ID=4のタグをもつ商品データが取得されます。
タグのIDは、管理画面の商品管理 > タグ管理で確認できます。ご自身の状況に合わせて、適宜修正してください。
なお、RepositoryやControllerの仕組みや使い方については、以下記事にて解説しています。
再利用性やメンテナンス性の観点から、このようなデータベースに関するクエリはリポジトリで定義することが推奨されています。
クエリの移行方法は以下記事で紹介しているので、合わせて設定しておくのをお薦めします。
新規ページ(Twigテンプレート)の編集
管理画面のコンテンツ管理 > ページ管理から、Twigテンプレートを編集します。
なお、このテンプレートの大部分は、デフォルトで用意されている「商品一覧ページ」を参考にしています。
{% extends 'default_frame.twig' %}
{% block main %}
<div class="ec-shelfRole">
<ul class="ec-shelfGrid">
{# TagProductsに格納されているデータを順に取り出し、TagProductに代入 #}
{% for TagProduct in TagProducts %}
<li class="ec-shelfGrid__item">
{# 商品画像の表示 #}
<p class="ec-shelfGrid__item-image">
<img src="{{ asset(TagProduct.main_list_image|no_image_product, 'save_image') }}" alt="{{ TagProduct.name }}" loading="lazy">
</p>
{# 商品名の表示 #}
<p>{{ TagProduct.name }}</p>
{# 価格の表示 #}
<p class="price02-default">
{% if TagProduct.hasProductClass %}
{% if TagProduct.getPrice02Min == TagProduct.getPrice02Max %}
{{ TagProduct.getPrice02IncTaxMin|price }}
{% else %}
{{ TagProduct.getPrice02IncTaxMin|price }} ~ {{ TagProduct.getPrice02IncTaxMax|price }}
{% endif %}
{% else %}
{{ TagProduct.getPrice02IncTaxMin|price }}
{% endif %}
</p>
</li>
{% endfor %}
</ul>
</div>
{% endblock %}
STEP 1で作成したControllerにより、TagProductsには$TagProducs(ID=4のタグが付いた商品情報)が格納されています。
その商品情報を、for文を用いて「TagProduct」として一つずつ取り出し、
- TagProduct.main_list_image
-
商品のメイン画像
- TagProduct.name
-
商品名
- TagProduct.getPrice
-
商品の価格
というように表示しています。
商品データの他の値(商品IDなど)を表示させることも可能です。
なお、Twigテンプレートのfor文については、以下記事で解説しています。
本記事のコードそのままに作られたページは、商品の公開ステータス(公開、非公開、廃止)に関係なく商品が表示されてしまいます。
ステータスが「非公開」や「廃止」の商品を非表示にする方法は、以下記事にて解説しています。
キャッシュを削除
ここまでで準備完了です。
管理画面からキャッシュを削除して、ページにアクセスしてみましょう。
冒頭でお見せしたような一覧ページが表示されればOKです!
まとめ
以上、特定のタグが付いた商品のみを表示する「タグ商品一覧ページ」を作る方法を紹介しました。
カテゴリーが異なる商品を纏めたり、特集ページを作ったりするのに役立ちそうですね。
ぜひ、利用してみてください。