2015年8月6日木曜日

EC-CUBEにアンケート機能を追加する方法(その3)プラグインで実装

SYSTEM_KDです。

前回に引き続き、EC-CUBEにアンケート機能を追加する方法についてです。

前回は、Googleフォームの作成、EC-CUBEのテンプレートへの埋め込みを行いましたが、今回はそれをプラグイン化していきたいと思います。

 

プラグインでの実装手順

では、さっそく実装してきたいと思います。

手順としては、以下になります。

1.プラグインのベースとなるファイルを用意

2.Googleフォームの埋め込み用URLをセットできるようにテンプレートの書き換え機能を実装する。

3.完成

ひとまず、最低限の部分だけ実装しようと思いますので、手順はこれだけです。

 

プラグインベースファイルの準備

まず、プラグインを作成するために最低限必要なファイルを用意したいと思いますが、その前に今回のプラグインの名前を決めたいと思います。

プラグイン名:
Googleフォーム連携プラグイン

プラグインコード:
GFCooperation

プラグイン名だけ見ると、なんかすごそうですねw
とりあえず、上記で進めていきたいと思います。

 

では、プラグインを作成するにあたって必要なファイルを用意したいと思います。

必要なファイルは以下になります。

・GFCooperation.php
(プラグインのメインとなるファイルです)

・plugin_info.php
(プラグインの設定ファイルです)

・plugin_update.php
(アップデート用のファイルです。未使用)

・logo.png
(プラグインのロゴ画像です、好きな画像を用意下さい)

(詳細につきましては、過去のブログにありますので、参照頂ければと思います)

 

プラグインの実装方法

少し余談になりますが、プラグインを実装する際に、先に実現したい機能のコーディングを行ってしまって、最後にインストールして確認するというのは、かなり大変です。

ですので、作成の順としては、処理を実装していない状態のプラグインファイルをEC-CUBEへインストールし、インストール後のファイルを変更して実装していくのが良いと思います。

 

上記を踏まえて、まずは空(機能を実装していない)状態のものにしたいと思います。

そんなに量が多くないので、全文のせます。

GFCooperation.php

<?php

/**
* プラグインのメインクラス
*
* @package GFCooperation
* @version $Id: $
*/
class GFCooperation extends SC_Plugin_Base {

/**
* コンストラクタ
*/
public function __construct(array $arrSelfInfo) {
parent::__construct($arrSelfInfo);
}

/**
* インストール
* installはプラグインのインストール時に実行されます.
* 引数にはdtb_pluginのプラグイン情報が渡されます.
*
* @param array $arrPlugin plugin_infoを元にDBに登録されたプラグイン情報(dtb_plugin)
* @return void
*/
function install($arrPlugin) {
// ロゴのコピー
if(copy(PLUGIN_UPLOAD_REALDIR . "GFCooperation/logo.png", PLUGIN_HTML_REALDIR . "GFCooperation/logo.png") === false) print_r("失敗");

}

/**
* アンインストール
* uninstallはアンインストール時に実行されます.
* 引数にはdtb_pluginのプラグイン情報が渡されます.
*
* @param array $arrPlugin プラグイン情報の連想配列(dtb_plugin)
* @return void
*/
function uninstall($arrPlugin) {
// ロゴ削除
GFCooperation::lfDeleteFile(PLUGIN_HTML_REALDIR . "GFCooperation/logo.png");

}

static function lfDeleteFile($targetPath){
if(SC_Helper_FileManager_Ex::deleteFile($targetPath) === false) {
GFCooperation::lfTriggerError('[' . $targetPath . ']の削除に失敗しました');
}
}

static function lfTriggerError($errMsg){
GC_Utils_Ex::gfPrintLog($errMsg, ERROR_LOG_REALFILE, true);
}

/**
* アップデート
* updateはアップデート時に実行されます.
* 引数にはdtb_pluginのプラグイン情報が渡されます.
*
* @param array $arrPlugin プラグイン情報の連想配列(dtb_plugin)
* @return void
*/
function update($arrPlugin) {
// nop
}

/**
* 稼働
* enableはプラグインを有効にした際に実行されます.
* 引数にはdtb_pluginのプラグイン情報が渡されます.
*
* @param array $arrPlugin プラグイン情報の連想配列(dtb_plugin)
* @return void
*/
function enable($arrPlugin) {
// nop
}

/**
* 停止
* disableはプラグインを無効にした際に実行されます.
* 引数にはdtb_pluginのプラグイン情報が渡されます.
*
* @param array $arrPlugin プラグイン情報の連想配列(dtb_plugin)
* @return void
*/
function disable($arrPlugin) {
// nop
}

/**
* 処理の介入箇所とコールバック関数を設定
* registerはプラグインインスタンス生成時に実行されます
*
* @param SC_Helper_Plugin $objHelperPlugin
*/
function register(SC_Helper_Plugin $objHelperPlugin) {

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

/**
* グローバルフック
*
*/
function preProcess(LC_Page $objPage) {

}

/**
* プレフィルタコールバック関数
*
* @param string &$source テンプレートのHTMLソース
* @param LC_Page_Ex $objPage ページオブジェクト
* @param string $filename テンプレートのファイル名
* @return void
*/
function prefilterTransform(&$source, LC_Page_Ex $objPage, $filename) {
$objTransform = new SC_Helper_Transform($source);
$template_dir = PLUGIN_UPLOAD_REALDIR . 'GFCooperation/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:
break;
}
$source = $objTransform->getHTML();
}

}
?>

plugin_info.php

<?php
/**
* プラグイン の情報クラス.
*
* @package GFCooperation
* @version $Id: $
*/
class plugin_info{
/** プラグインコード(必須):プラグインを識別する為キーで、他のプラグインと重複しない一意な値である必要がありま. */
static $PLUGIN_CODE = "GFCooperation";
/** プラグイン名(必須):EC-CUBE上で表示されるプラグイン名. */
static $PLUGIN_NAME = "Googleフォーム連携プラグイン";
/** クラス名(必須):プラグインのクラス(拡張子は含まない) */
static $CLASS_NAME = "GFCooperation";
/** プラグインバージョン(必須):プラグインのバージョン. */
static $PLUGIN_VERSION = "1.0";
/** 対応バージョン(必須):対応するEC-CUBEバージョン. */
static $COMPLIANT_VERSION = "2.13.3";
/** 作者(必須):プラグイン作者. */
static $AUTHOR = "作成者の名前";
/** 説明(必須):プラグインの説明. */
static $DESCRIPTION = "Googleフォームによるアンケート機能を利用可能にします。";
/** プラグインURL:プラグイン毎に設定出来るURL(説明ページなど) */
static $PLUGIN_SITE_URL = "";
/** フックポイント:フックポイントとコールバック関数を定義します */
static $HOOK_POINTS = array(
array("prefilterTransform", 'prefilterTransform'),
);
}
?>

plugin_update.php

<?php

/**
* プラグイン のアップデート用クラス.
*
* @package GFCooperation
* @version $Id: $
*/
class plugin_update{
/**
* アップデート
* updateはアップデート時に実行されます.
* 引数にはdtb_pluginのプラグイン情報が渡されます.
*
* @param array $arrPlugin プラグイン情報の連想配列(dtb_plugin)
* @return void
*/
function update($arrPlugin) {
// nop
}
}
?>

こんな感じです。


用意できたら、tar.gzで固めて、EC-CUBEにインストールします。


 


アンケート連携のためテンプレートをトランスフォームする


ようやく本題の部分です。


アンケート埋め込み用のリンクを設定できるようにテンプレートを変更したいと思います。


変更するファイルは「GFCooperation.php」になり、変更箇所は、「prefilterTransform」の部分になります。


この部分で、テンプレートの内容を操作することができますので、購入完了画面のテンプレートに対して、アンケート埋め込み用のリンクを挿入するよにします。

function prefilterTransform(&$source, LC_Page_Ex $objPage, $filename) {
$objTransform = new SC_Helper_Transform($source);
$template_dir = PLUGIN_UPLOAD_REALDIR . 'GFCooperation/templates/';
switch($objPage->arrPageLayout['device_type_id']){
case DEVICE_TYPE_MOBILE:
break;
case DEVICE_TYPE_SMARTPHONE:
break;
case DEVICE_TYPE_PC:

if (strpos($filename, 'shopping/complete.tpl') !== false) {
$objTransform->select('div.shop_information')->insertBefore(
'<p class="message" style="margin-top: 15px;">宜しければ、アンケートにご協力ください</p>
<iframe src="https://docs.google.com/forms/d/xx略xx/viewform?embedded=true" width="760" height="510" frameborder="0" marginheight="0" marginwidth="0">読み込み中...</iframe>'
);
}

break;
case DEVICE_TYPE_ADMIN:
default:
break;
}
$source = $objTransform->getHTML();
}

対象部分だけを抜粋すると上記のようになります。
(テンプレートが書き換わらない場合は、data/cache/mtb_constants.php内の「SMARTY_FORCE_COMPILE_MODE」というパラメータをtrueにすると改善されるかもしれません。


これで、テンプレートをフックして、埋め込み用のリンク情報をセットできます。
(埋め込みURLは読み替えて下さい)


完了画面を確認すると、以下のようになっていると思います。


完了画面_プラグイン


完成です!


 


まとめ


プラグインのベースとなるファイル群を用意するのが若干面倒ではありますが、実際の処理自体は簡単だったのではないかと思います。


プラグインで実装したことで、プラグインの有効・無効を切り替えることにより、アンケートを表示したり、非表示にしたりということが、管理画面からできるようになったかと思いますが、まだ埋め込み用のURLを直接埋め込んでいたりしますので、次回はこの部分を改良したいと思います。

0 件のコメント:

コメントを投稿