はじめに
この記事は、「CS-CARTのデザインとアドオン」から続きになります。
注)CS-CART4系の説明になります。バージョンによって、hook有無、データベースの仕組みが異なる場合があります。
プラグインディレクトリー構成
google_tag_manager < Folder >
├ app < Folder >
│ └ addons < Folder >
│ └ google_tag_manager < Folder >
│ └ addon.xml
│ └ init.php (新)
│ └ config.php (新)
│ └ func.php (新)
└ var < Folder >
├ langs < Folder >
│ ├ en < Folder >
│ │ └ addons < Folder >
│ │ └ google_tag_manager.po
│ └ ja < Folder >
│ └ addons < Folder >
│ └ google_tag_manager.po
└ themes_repository < Folder >
└ responsive < Folder >
└ templates < Folder >
└ addons < Folder >
└ google_tag_manager < Folder >
└ hooks < Folder >
└ index < Folder >
├ body.pre.tpl
└ head_scripts.pre.tpl
作業中よく見る1文字英字説明
defineされてない1文字英字
AREA
'C':ユーザー画面
'A':管理画面
status(注文ステータスではない)
'A':有効
'D':無効
'H':非表示
profile_fields.section
'C':連絡先情報
'B':請求先住所
'S':配送先
注文ステータスの英字はCS-CARTインストール直下のconfig.phpと管理画面、一般設定→注文ステータスで確認できます。
会員情報フィールドで追加したものをチェックする方法
まず、ユーザ画面であれば下記ディレクトリーを見ます。
\app\controllers\frontend
管理画面はbackendになります。
profiles.phpがユーザー情報ぽいので中身を見ると
fn_update_user
上記のユーザーデータを更新するような関数名が出てきます。
この関数名をgrepしてみると、下記のファイルが見つかります。
\app\functions\fn.users.php
上記のファイルから、fn_update_userを探して、関数をハックします。
下記の行が見つかります。基本は、ほとんどの関数の最初の方に、_pre、関数の最後の方に、_postのhookがあります。
fn_set_hook('update_user_pre', $user_id, $user_data, $auth, $ship_to_another, $notify_user);
_preは、初期設定、データのチェックを追加できます。
_postはデータベースに書き込みが完了など、処理の完了後になります。
7行目addons\google_tag_manager\init.phpを作成します。(名前は決まってます)
改行コードはLFのみ、漢字を含める場合はUTF8のBOM無しで保存します。
fn_register_hooksにupdate_user_preを追加します。複数はカンマで区切ってください。
<?php
if (!defined('BOOTSTRAP')) { die('Access denied'); }
fn_register_hooks(
'update_user_pre'
);
hookの関数命名ルール
fn_[プラグインID]_[hook名](fn_set_hookの第2引数、fn_set_hookの第3引数)
[プラグインID]は今回は、google_tag_managerで話を進めます。
このルールに基づいて下記になります。引数に&がついていることに注意してください。
function fn_[プラグインID]_update_user_pre(&$user_id, &$user_data, &$auth, &$ship_to_another, &$notify_user)
引数が何が来るのか?確認する。
8行目addons\google_tag_manager\config.phpを作成します。(名前は決まってます)
改行コードはLFのみ、漢字を含める場合はUTF8のBOM無しで保存します。
config.phpに下記を追加します。
<?php
define('MY_DEBUG', true); ##false or true
9行目addons\google_tag_manager\func.phpを作成します。(名前は決まってます)
改行コードはLFのみ、漢字を含める場合はUTF8のBOM無しで保存します。
func.phpに下記を追加します。
<?php
if (!defined('BOOTSTRAP')) { die('Access denied'); }
function fn_google_tag_manager_update_user_pre(&$user_id, &$user_data, &$auth, &$ship_to_another, &$notify_user)
{
if(defined('MY_DEBUG') && MY_DEBUG === true) {
ob_start();
var_dump($user_id);
var_dump($user_data);
var_dump($auth);
var_dump($ship_to_another);
var_dump($notify_user);
$out = ob_get_contents();
ob_end_clean();
file_put_contents("作成するパス絶対パス/ファイル名", $out);
}
return true;
}
user_idは、ユーザーデータベースのシーケンシャルIDです。
authは、ログイン後の認証された情報が入ります。
user_dataは該当ユーザーのユーザー情報が入ってきます。
保存された、ファイルを確認して、今回は、user_dataの配列を確認します。
会員情報フィールドで追加したものは下記の場所に入ります。xxは数字
$user_data['fields'][xx]
xxを確認します。
注)会員情報フィールドで削除したり、追加すると変化します、
会員情報フィールドで追加したものをチェックする方法サンプル
function fn_[プラグインID]_update_user_pre(&$user_id, &$user_data, &$auth, &$ship_to_another, &$notify_user)
{
if(defined('MY_DEBUG') && MY_DEBUG === true) {
ob_start();
var_dump($user_id);
var_dump($user_data);
var_dump($auth);
var_dump($ship_to_another);
var_dump($notify_user);
$out = ob_get_contents();
ob_end_clean();
file_put_contents("作成するパス絶対パス/ファイル名", $out);
}
if(AREA == 'C') { #ユーザー画面だけ
if(!empty($user_data['fields'][xx])) {
#なにかチェックする
}
}
return true;
}
CS-CARTインストール直下のconfig.phpのdefine('DEBUG_MODE', true);をすることでCS-CARTデバッガーを起動できます。
SQL文など参考にできます。
user_dataの内容s_,b_の意味
$user_data['s_firstname']
$user_data['s_lastname']
$user_data['s_phone']
$user_data['s_zipcode']
$user_data['s_state']
$user_data['s_city']
$user_data['s_address']
$user_data['s_address_2']
s_配送先
b_は請求先
ユーザーグループが設定されたか確認
$usrgp_id = db_get_field("SELECT usergroup_id FROM ?:usergroup_descriptions WHERE usergroup = ?s AND lang_code = ?s", "ユーザグループで登録した名称",DESCR_SL);
$sts = db_get_field("SELECT link_id FROM ?:usergroup_links WHERE user_id = ?i AND status = 'A' AND usergroup_id = ?i",$auth[user_id], $usrgp_id);
if(!empty($sts)) {
#セットされている
}
よく使用するデータベース・プレイスホルダー
?: cscart_が入ります。
?s 文字列
?i 数値
?u データを更新するための連想配列
?e データを追加するための連想配列
さいごに
今回は、作成というよりは、どのように、hookを探して、コードを書いていくか?に結果なってしまいました。
参考になるか。。。どうか・・・
では・・・