2014年10月5日日曜日

EC-CUBEプラグインでテンプレートを変更するサンプル

SYSTEM_KDです。

今回は、久々にプラグインを作成したいと思います。
作成するプラグインは、テンプレート変更プラグインになります。

これまで、テンプレートフックについて簡単に説明させて頂きましたが、やはり実際に動作するものがあった方がわかりやすいと思いますので、簡単なプラグインにはなりますが、作成したいと思います。

まず、プラグインの作成のため、(久々に)以前作成したプラグインのベースを利用したいと思います。
(ソースはこちらのになります)
(上記を作成した際の記事はこちらです)

ちなみに今回のプラグインは「おすすめ商品情報」ブロックのタイトル部分へおすすめ商品情報の最終更新日付を表示してやるといったものになります。

今回は以下の手順で進めたいと思います。

1.ファイル名および設定の整備

2.処理の追加

3.テンプレートの書き換え処理実装

ではさっそく、ダウンロードしてきたプラグインのベース(PluginBase.tar.gz)をどこかへ解凍し、ファイル名の変更と設定の整備を行いたいと思います。

おすすめ商品へ日付を追加するプラグインですので、「RecommendDate」プラグインという名前にしたいと思います。

ということで、「plugin_info.php」と「PluginBase.php」を開いてファイル名を「PluginBase」を「RecommendDate」へ置換します。

続いて、「plugin_info.php」の内容を今回のプラグインにそったものへ書き換えます。

class plugin_info{
/** プラグインコード(必須):プラグインを識別する為キーで、他のプラグインと重複しない一意な値である必要がありま. */
static $PLUGIN_CODE = "RecommendDate";
/** プラグイン名(必須):EC-CUBE上で表示されるプラグイン名. */
static $PLUGIN_NAME = "テンプレートと変更サンプル";
/** クラス名(必須):プラグインのクラス(拡張子は含まない) */
static $CLASS_NAME = "RecommendDate";
/** プラグインバージョン(必須):プラグインのバージョン. */
static $PLUGIN_VERSION = "0.1";
/** 対応バージョン(必須):対応するEC-CUBEバージョン. */
static $COMPLIANT_VERSION = "2.12.0";
/** 作者(必須):プラグイン作者. */
static $AUTHOR = "SYSTEM_KD";
/** 説明(必須):プラグインの説明. */
static $DESCRIPTION = "おすすめ商品情報ブロックのタイトルへ最終更新日時を設定";
/** プラグインURL:プラグイン毎に設定出来るURL(説明ページなど) */
static $PLUGIN_SITE_URL = "http://systemkd.blogspot.jp/";
/** ライセンス */
static $LICENSE = "LGPL";
}

これで、「1.ファイル名および設定の整備」は完了です。

次は処理を追加していきたいと思いますが、その前にEC-CUBEへインストールしておきましょう。

インストールすうるには、次のファイルを「tar.gz」で圧縮してプラグイン用のファイルにします。


  • logo.png
  • plugin_info.php
  • plugin_update.php
  • RecommendDate.php

後は、EC-CUBEの管理画面からインストールするだけです。

rd_02

ちなみに、上の画像で表示される情報は、「plugin_info.php」で設定したものですが、表示する際のデータは「plugin_info.php」から取得しているのではなく、データベースから取得しています。
(インストール時にDBへ格納されている)
どのテーブルに入っているかと言いますと、「dtb_plugin」テーブルになります。

インストールできたら、次へ進みたいと思います。


2.処理の追加

少し脱線しましたが、気を取り直して処理の追加へ進みたいと思います。

処理を追加するソースは、
data/downloads/plugin/RecommendDate/RecommendDate.php
になります。

今回はテンプレートの表示をフックしたプラグインになりますので、処理の介入点(フックポイント)としてテンプレートの表示をフックするように「register」へ処理を追加します。

function register(SC_Helper_Plugin $objHelperPlugin) {
// テンプレートトランスフォーム
$objHelperPlugin->addAction('prefilterTransform', array(&$this, 'prefilterTransform'));
}

ここで1点、定数の設定を変更しておきたいと思います。

変更するファイルは、
data/cache/mtb_constants.php
になります。

この定数の「SMARTY_FORCE_COMPILE_MODE」を「true」に設定します。

/** SMARTYコンパイルモード */
define('SMARTY_FORCE_COMPILE_MODE', true);

詳細な説明は別途行いたいと思いますが、この設定は、プラグインにてテンプレート変更を行う場合は、trueに設定しておいた方が何かと便利なものになります。

(定数の設定場所とかも、phpとcacheとDBがありちょっとややこしいので、そのうちまとめれたらと思います)

次に、実際の処理(おすすめ商品の最終更新日の取得)部分を実装したいと思います。

といっても、たいした処理ではないですが。。

取得処理は、グローバルフックへ実装したいと思いますので、下記のコードを「RecommendDate.php」へ追加します。

function preProcess(LC_Page $objPage) {
// 新着情報の最終更新日時取得
$objQuery =& SC_Query_Ex::getSingletonInstance();
$result = $objQuery->getRow("MAX(update_date) as max_update_date", "dtb_best_products");

// yyyy/mm/dd形式で設定
$this->bp_last_update = date("Y/m/d", strtotime($result['max_update_date']));
}

おすすめ商品が格納されているテーブル「dtb_best_products」から「update_date」の最大値を取得しているだけです。

処理は実装しましたので、今回のキモのテンプレートの変更部分に移ります。


3.テンプレートの書き換え処理実装

さきに、ソースをのせます。

function prefilterTransform(&$source, LC_Page_Ex $objPage, $filename) {
$objTransform = new SC_Helper_Transform($source);
$template_dir = PLUGIN_UPLOAD_REALDIR . 'PluginBase/templates/';
switch($objPage->arrPageLayout['device_type_id']){
case DEVICE_TYPE_MOBILE:
break;
case DEVICE_TYPE_SMARTPHONE:
break;
case DEVICE_TYPE_PC:
break;
case DEVICE_TYPE_ADMIN:
default:
if (strpos($filename, 'bloc/recommend.tpl') !== false) {
$html = "

";
$html .= "(最終更新日:" . $this->bp_last_update . ")

";
$objTransform->select('div#recommend_area h2')->appendChild($html);
}
break;
}
$source = $objTransform->getHTML();
}

実際、変更を行っている部分は「13行目~17行目」の以下の部分になります。
(今回はブロックの表示を変更するので、モバイルでもスマホでもPCでもない、部分に処理を記述しています)

if (strpos($filename, 'bloc/recommend.tpl') !== false) {
$html = "

";
$html .= "(最終更新日:" . $this->bp_last_update . ")

";
$objTransform->select('div#recommend_area h2')->appendChild($html);
}

では、この抽出部分について、順に説明していきます。

1行目ですが、今回はおすすめ商品ブロックのタイトルを変更しようとしていますので、変更を行うテンプレートファイルは「おすすめ商品ブロック」のテンプレートである、「data/Smarty/templates/default/frontparts/bloc/recommend.tpl」になります。
ですので、「bloc/recommend.tpl」の場合にテンプレートの変更処理を行う様な条件を設定しています。

2行目と3行目は、変更する内容(追加する表示内容)を設定しております。
ここで「preProcess」にて取得した、おすすめ商品の最終更新日を設定しています。

4行目ですが、ここがテンプレートの変更部分になります。
selectにて、「おすすめ商品ブロックのタイトル」を指定し、その要素の子として「2行目・3行目」のHTMLを追加しています。

これを実装してやり、ページを表示すると

rd_03

この様な感じで、おすすめ商品情報の右側へ最終更新日時が表示されます。
(とりあえず表示する形なので、ブロックの位置を変えた場合等は綺麗に表示されなくなります)

プラグインで実装しておりますので、試しにEC-CUBEの管理画面よりプラグインを無効化するとこの表示変更は反映されなくなります。

どうでしょうか?表示内容や表示方法によって難易度は変わってきますが、以外に簡単に表示を追加できたのではないでしょうか?

ということで、テンプレートを変更するプラグインのサンプル作成は終了です。
本日の成果物はこちらになります。

0 件のコメント:

コメントを投稿