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


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

EC-CUBE には初期インストール時からサイト内の商品を検索する機能が実装されているが、どのようなキーワードで検索されたかはウェブサーバのログなどには残らないため、利用者が求めている商品を集計したり、どのようなキーワードで探そうとしているかのマーケティングを目的に、カスタマイズしてデータベースへ保存する方法について紹介する。

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

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

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



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

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

ウェブサイトでは一般的には「サイト内検索」と呼ばれる機能と同類となり、入力されたキーワードから関連するコンテンツを増やしたり、リライトに活用されている。

2.EC-CUBE で検索された内容をデータベースに保存する方法

検索内容をデータベースに保存するためには、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 のコマンドを実行することでテーブルが作成されるが、テーブルを作成する前に意図したテーブル構造になっているか問題ないことを確認するために下記のコマンドを実行する。

コマンドを実行して問題なければ、3 行目以降のようにテーブル生成の 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;

尚、今回作成するテーブル名は「dtb_searchlog」とし、カラムは次の役割をする。

  1. id – テーブルのユニークキー
  2. keyword – 入力されたキーワード
  3. count – 同キーワードが利用された回数
  4. discriminator_type – 識別子

もしコマンドを実行して失敗したり、修正のためやり直す場合は 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 の操作で確認することができる。
SSH などでサーバのデータベースにアクセスし、insert コマンドでレコードを追加する。

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 ファイルである。
次のように拡張子「.twig」の HTML タグで記述するファイルを用意する。

# 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.ログテーブルに書き込むためにアクセスする

検索で入力された文字列は作成したデータベースのテーブルに格納されるたため、EC-CUBE の公開しているサイトをブラウザで表示して、検索入力欄にキーワードを入れて検索する。

検索すると該当する結果がブラウザに表示されるが、同時に新たに作成したテーブルに情報が入る。

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 種類ある。
前者の方がプログラムの構造としては簡単だが、同じキーワードでも複数レコード格納されるので集計する手間が掛かる。

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

カスタマイズするファイルは既に EC-CUBE にある /html/admin/products/search.php を利用し、テーブル「dtb_searchlog」を取得するようにカスタマイズする。
取得したデータはテンプレート /data/Smarty/templates/admin/products/search.tpl としてファイルを新たに用意する。

また、この新しいテンプレートが管理画面から遷移して利用できるようにリンクするために /data/Smarty/templates/admin/products/subnavi.tpl も修正する。

検索キーワードを集計した様子

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

関連記事

コメントを残す