CS-CARTのプラグインプログラミング編

らら
らら

はじめに

この記事は、「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を探して、コードを書いていくか?に結果なってしまいました。

参考になるか。。。どうか・・・

では・・・

関連記事