EC-CUBE をカスタマイズして検索で入力されたキーワードをデータベースに保存する方法


[初回公開] 2007年11月16日

EC-CUBE には初期インストール時からサイト内の商品を検索する機能が実装されているが、どのようなキーワードで検索されたかは Web サーバのログなどに残らないため、データベースに保存するカスタマイズについて紹介する。

EC-CUBE をカスタマイズして検索で入力されたキーワードをデータベースに保存する方法




1.EC-CUBE に用意されている検索機能とは


EC-CUBE に用意されている検索機能は商品テーブルに対して商品名などを対象に検索され、検索結果には入力したキーワードに該当した商品の一覧が表示されるようになっている。

検索で入力されたキーワードはログには残らないため、閲覧者がどのような検索を行ったかを把握するためには検索ボタンを押下された時点でログに書き出すかデータベースに書き込むようにカスタマイズが必要となる。



閲覧者がどのようなキーワードで検索したかを知ることで、商品名ではなく商品の特徴や性能に関して入力することが多ければ商品情報の内容を見直して検索一覧に表示しやすくするなど EC サイト運営に役立たさせることができる。

2.検索内容をデータベースに保存する方法


検索内容をデータベースに保存するためには、EC-CUBE の初期インストール時に生成されるテーブルに入力された検索キーワードを保存するカラムを用意するとともに、そのカラムに値を格納する処理を追加する必要がある。

2-1.テーブル定義ファイルの作成


EC-CUBE でカラムを追加する場合はデータベースにあるテーブルに直接 SQL コマンドで操作しなくても PHP ファイルを用いてテーブル定義ファイルを作成することでカラム追加することができる。

自作のテーブル定義ファイルは {EC-CUBE の設置ディレクトリ}/app/Customize/Entity に保存し、今回は下記のコードを記述した Searchlog.php という名前のファイルを用意する。

<?php

namespace Customize\Entity;
use Doctrine\ORM\Mapping as ORM;

if (!class_exists('\Eccube\Entity\Searchlog')) {
/**
* Searchlog
*
* @ORM\Table(name="dtb_searchlog")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
* @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="Customize\Repository\SearchlogRepository")
*/
class Searchlog extends \Eccube\Entity\AbstractEntity
{

/**
* @var int
*
* @ORM\Column(name="id", type="integer", options={"unsigned":true})
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="keyword", type="string", length=255)
*/
private $keyword;

/**
* @var int
*
* @ORM\Column(name="count", type="integer")
*/
private $count;


/**
* Get id.
*
* @return Id
*/
public function getId()
{
return $this->id;
}

/**
* Get keyword
*
* @return keyword
*/
public function getKeyword()
{
return $this->keyword;
}

/**
* Set keyword
*
* @return this
*/
public function setKeyword($keyword)
{
$this->keyword = $keyword;
}

/**
* Get count
*
* @return count
*/
public function getCount()
{
return $this->count;
}

/**
* Set count
*
* @return this
*/
public function setCount($count)
{
$this->count = $count;
}
}
}




2-2.SQL の実行前チェック


上記のファイルをサーバに設置した後は PHP のコマンドを実行することでテーブルが作成されるが、テーブルを作成する前に意図したテーブル構造になっているかを下記のコマンドで確認する。
コマンドを実行して問題なければ、2 行目以降のようにテーブル生成の create 文が表示される。

# php {EC-CUBE の設置ディレクトリ}/bin/console d:s:u --dump-sql
The following SQL statements will be executed:

CREATE TABLE dtb_searchlog (id INT UNSIGNED AUTO_INCREMENT NOT NULL, keyword VARCHAR(255) NOT NULL, count INT NOT NULL, discriminator_type VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ENGINE = InnoDB;


もしコマンドを実行して失敗したり、修正のためやり直す場合は EC-CUBE 内にキャッシュができているため下記のコマンドでクリア処理が必要となる。

# php {EC-CUBE の設置ディレクトリ}/bin/console cache:clear --no-warmup


2-3.テーブルにカラム追加


create 文が表示され問題なければ、下記のコマンドでテーブルが作成される。

# php {EC-CUBE の設置ディレクトリ}/bin/console eccube:schema:update --force --dump-sql




2-4.レコードを追加


作成したテーブルにレコードが格納できるかは SQL の操作で確認することができる。

mysql> insert into dtb_searchlog values(1,'CUBE',1,'searchlog');
mysql> select * from dtb_searchlog;


2-5.repository の作成


EC-CUBE をカスタマイズする場合は初期インストール時のファイル類はあまり改修せず、カスタマイズを記載したファイルを用意する運用が推奨されている。
カスタマイズ用のファイルを本体に紐づけるためにリポジトリと呼ばれる定義ファイルが必要となり、下記のように記述する。

尚、初期インストール時はリポジトリのディレクトリが無いため、下記ファイルを用意する前にサーバへ設置ディレクトリを用意する。

# mkdir Repository
# chown apache:apache Repository/
# vi {EC-CUBE の設置ディレクトリ}/app/Customize/Repository/SearchlogRepository.php

<?php

namespace Customize\Repository;

use Customize\Entity\Searchlog;
use Eccube\Repository\AbstractRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;

class SearchlogRepository extends AbstractRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, Searchlog::class);
}
}


2-6.controller の作成


次にデータベースにあるテーブルをデータ操作するために controller ファイルを用意する。
controller はデータ操作するとともに実際に画面に表示する内容も記載することができる。
今回は画面に表示する内容は別途 template ファイルとして用意するため、controller は次のように用意する。


# vi {EC-CUBE の設置ディレクトリ}/app/Customize/Controller/SearchlogController.php

<?php
namespace Customize\Controller;

use Customize\Repository\SearchlogRepository;
use Eccube\Controller\AbstractController;
use Eccube\Entity\BaseInfo;
use Customize\Entity\Searchlog;
use Eccube\Repository\BaseInfoRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class SearchlogController extends AbstractController
{
/** @var BaseInfo */
protected $baseInfo;

/** @var Searchlog */
protected $searchlogRepository;

/**
* SamplePageController constructor.
* @param BaseInfoRepository $baseInfoRepository
* @param SearchlogRepository $searchlogRepository
*/
public function __construct(
BaseInfoRepository $baseInfoRepository,
SearchlogRepository $searchlogRepository
)
{
$this->baseInfo = $baseInfoRepository->get();
$this->searchlogRepository = $searchlogRepository;
}

/**
* @Route("/sample/{id}", name="sample_index")
* @Template("Sample/index.twig")
*/
public function index($id)
{
$searchlog = $this->searchlogRepository->find($id);

return [
'keyword' => $searchlog->getKeyword(),
];
}
}




2-7.template の作成


最後に用意するのは controller から呼び出されて画面に表示する template ファイルである。

# mkdir {EC-CUBE の設置ディレクトリ}/app/template/default/Sample
# chown apache:apache {EC-CUBE の設置ディレクトリ}/template/default/Sample
# vi {EC-CUBE の設置ディレクトリ}/app/template/default/Sample/index.twig

{% extends 'default_frame.twig' %}

{% block main %}

キーワードは"{{ keyword }}"です。


{% endblock %}


2-8.ログに書き込むためにアクセス


(修正中)

2-9.書き込まれたログを表示する


テーブルに保存された検索キーワードは次の URL にアクセスするとブラウザに表示される。

http://{EC-CUBE の設置パス}/sample/1


3.バージョン 3 以前での検索キーワードの保存方法


EC-CUBE のバージョン 3 以前で検索キーワードをデータベースに保存する方法は、次の流れで行う。

・検索キーワードを保存するテーブルを作成
・検索キーワードの保存
・テーブルに保存したデータを表示

まず検索キーワードを保存するテーブルは SQL の create 文を実行して作成する。
今回はテーブル「dtb_searchlog」を新たに用意する。

次に検索キーワードの保存だが、下図のように検索フォームと検索処理は既に EC-CUBE に用意されているためテキストボックスに入力された値をテーブル「dtb_searchlog」に格納する処理を追加する。
カラムは入力されたキーワードの他、更新日時と同キーワードが利用されたときのためにカウント数を格納できるとよい。

EC-CUBE の検索フォーム


検索する処理は /html/products/list.php のファンクション「lfDispProductsList」に追加する。
処理としては検索されるために 1 レコード追加する方法と、既に同じキーワードがレコードにある場合はカウントアップする方法の 2 種類ある。
前者の方がプログラムが簡単だが、集計する手間が掛かる。



最後にテーブルに保存されたデータを表示する画面を用意する。
一般公開するデータではないので、管理画面内に作るとよい。

カスタマイズするファイルは /html/admin/products/search.php でテーブル「dtb_searchlog」を取得する。
取得したデータはテンプレート /data/Smarty/templates/admin/products/search.tpl を新たに用意する。

また、この新しいテンプレートにリンクするために / data/Smarty/templates/admin/products/subnavi.tpl も修正する。

検索キーワードの集計結果


以上のカスタマイズが終了して管理画面から新しく設置した検索キーワードを表示するテンプレートを表示すると上図のようにキーワードと利用された回数を確認することができる。

関連記事