この記事では、Repository(リポジトリ)を使ってデータベースの商品情報をページに表示させる方法を解説します。
デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。
カスタマイズ後は、デバッグモードの解除を忘れないように。
初期ページ(作成前)と完成ページ
- 初期ページ
-
Twigテンプレートに直接記述した「テストページ」のみ表示。
TwigとControllerのコードは以下に記載。
- 完成ページ
-
商品テーブルから、「商品ID = 2」の商品(チェリーアイスサンド)情報をTwigテンプレートに渡し、商品画像・商品ID・商品名を表示。
手順やコードなどは本記事に掲載。
本記事では、事前に用意したテストページ(URL: ドメイン名/test)のTwigとControllerを使って解説します。
同じような環境を準備したい方は、以下記事とコードを参考に作ってみてください。
編集前のTwigとControllerのコード
- Twig
-
{% extends 'default_frame.twig' %} {% block main %} <h1>テストページです。</h1> {% endblock %}
- Controller
-
<?php namespace Customize\Controller; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template; use Eccube\Controller\AbstractController; class TestController extends AbstractController { /** * @Route("/test", name="test") * @Template("test.twig") */ public function index(Request $request) { return []; } }
データベースから情報を取得するにはRepositoryを使う
EC-CUBEでは、データベースの操作は『Repository』というファイルを利用します。
Repositoryは基本的にテーブルごとに作成されています。
「src/Eccube/Repository」下に、デフォルトで用意されている各種Repositoryファイルを確認できます。
以下はその一例です。
- ProductRepository
-
商品情報に関するRepository
- OrderRepository
-
注文情報に関するRepository
- CustomerRepository
-
会員情報に関するRepository
これらのRepositoryは、Controller内で呼び出すことができます。
対応するRepositoryを利用することで、特定のデータを取得や新しいデータの追加、既存データの変更・削除などができます。
本記事では、ControllerでProductRepositoryを呼び出し、商品テーブル(dtb_product)から特定の商品情報を取得する方法を紹介します。
作成手順と各手順の詳細
- ControllerファイルにRepositoryを利用したコードを記載し、ファイルサーバーにアップ。
- Twigファイルを修正。
- EC CUBE 管理画面にてキャッシュを削除。
各手順の詳細は以下の通り。
Controllerの作成
上述の「TestController.php」を以下の通り修正し、app/Customize/Controllerにアップロードします。
<?php
namespace Customize\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Eccube\Controller\AbstractController;
use Eccube\Repository\ProductRepository; // ProductRepositoyの使用を宣言
class TestController extends AbstractController
{
/**
* ProductRepositoryのインスタンスを保持するプロパティ
* @var ProductRepository
*/
protected $productRepository;
/**
* コンストラクタでProductRepositoryのインスタンスを注入
* @param ProductRepository $productRepository
*/
public function __construct(ProductRepository $productRepository) {
$this->productRepository = $productRepository;
}
/**
* @Route("/test", name="test")
* @Template("test.twig")
*/
public function index(Request $request)
{
// ProductRepositoryを使用してID=2の商品データ(Productエンティティ)を取得
$Sample = $this->productRepository->find(2);
return [
// Twigテンプレートに渡す変数「Product」に、$Sampleのデータを設定
'Product' => $Sample
];
}
}
Twigの修正
冒頭の「Twigテンプレート」(ファイル名:test.twig)を以下の通り修正します。
{% extends 'default_frame.twig' %}
{% block main %}
<h1>テストページ</h1>
<img src="{{ asset(Product.main_list_image|no_image_product, 'save_image') }}" alt="{{ Product.name }}" width="300" height="300">
<p>ID:{{ Product.id }}</p>
<p>Name:{{Product.name}}</p>
{% endblock %}
先程修正したControllerより、Productには$Sample(商品ID = 2の商品情報)が格納されています。
商品IDを表示する場合は「Product.id」、商品名を表示する場合は「Product.name」と記載します。
もちろん他の情報(画像や価格など)も表示でき、記載の仕方は商品詳細ページや商品一覧ページのTwigファイルを参考にしてみてください。
キャッシュを削除
ここまでで準備完了です。
管理画面からキャッシュを削除して、ページにアクセスしてみましょう。
冒頭でお見せしたような、「テストページです。」というタイトルの下に、Controllerで渡した商品IDの商品名が表示されていればOKです!
まとめ
以上、データベースの商品情報を取得してページに表示させる方法を紹介しました。
今回はRepositoryの基本的な使い方を解説しました。
本記事では、商品IDからデータを持ってくるというシンプルな用法でしたが、応用次第で特定の条件に合う商品情報だけを持ってきたり、データベースの情報を書き換えたり、いろいろな機能を使うことができます。
以下の記事はその一例ですので、参考にしてみてください!