【EC-CUBE 4】(初心者向け)データベースから特定のデータを抽出してページに表示する方法

この記事では、Repository(リポジトリ)を使ってデータベースの商品情報をページに表示させる方法を解説します。

【動作環境】
EC CUBEのバージョン:4.2.1
サーバー:Xserver

開発前にデバッグモードの設定をお薦めします

デバッグモードを設定しておくと、エラーが起きたときに詳細情報が表示されるようになります。
エラー箇所を探しやすくなるので、開発前に設定しておくのをオススメします。
デバッグモードの設定方法については 以下記事 で解説しています。

カスタマイズ後は、デバッグモードの解除を忘れないように。

目次

初期ページ(作成前)と完成ページ

初期ページ
テキストだけを表示させたページの画面
テストページ(初期)

Twigテンプレートに直接記述した「テストページ」のみ表示。

TwigとControllerのコードは以下に記載。

完成ページ
データベースから商品ID=2の商品を抽出して表示したページの画面
テストページ(完成)

商品テーブルから、「商品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)から特定の商品情報を取得する方法を紹介します。

作成手順と各手順の詳細

  1. ControllerファイルにRepositoryを利用したコードを記載し、ファイルサーバーにアップ。
  2. Twigファイルを修正。
  3. EC CUBE 管理画面にてキャッシュを削除。

各手順の詳細は以下の通り。

STEP

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
    ];
  }    
}

ポイントは以下の通り。

  • 「ProductRepository」の使用宣言および初期設定
  • 「ProductRepository」の機能:find()関数を呼び出して、引数に指定した商品ID(この場合は2)の商品データを$Sampleに格納
    • Repositoryにはデフォルトで各種メソッドが設定されており、find()関数もその一つです。
      詳細は こちらの記事 で解説していますので、合わせてご覧ください。
  • Twigテンプレートに渡す変数「Product」に$Sampleを設定
    • ControllerからTwigへデータを渡す方法については こちらの記事 で解説しています。
STEP

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ファイルを参考にしてみてください。

STEP

キャッシュを削除

ここまでで準備完了です。
管理画面からキャッシュを削除して、ページにアクセスしてみましょう。

キャッシュ管理からキャッシュを削除できます。

冒頭でお見せしたような、「テストページです。」というタイトルの下に、Controllerで渡した商品IDの商品名が表示されていればOKです!

データベースから商品ID=2の商品を抽出して表示したページの画面
テストページ(完成)

まとめ

以上、データベースの商品情報を取得してページに表示させる方法を紹介しました。

今回はRepositoryの基本的な使い方を解説しました。
本記事では、商品IDからデータを持ってくるというシンプルな用法でしたが、応用次第で特定の条件に合う商品情報だけを持ってきたり、データベースの情報を書き換えたり、いろいろな機能を使うことができます。

以下の記事はその一例ですので、参考にしてみてください!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次