CS-cartのNP後払い対応CSV出力アドオン(いわゆるプラグイン)作りました。
内容的には
1.注文IDと紐付いているデータをデータベースから取り出して、
2.そのデータを出力形式に合わせて整形して
3.出力する
という流れです。疲れた。
ディレクトリ構造
addons/
│ addon.xml
│
exim_np/
├─controllers/
│ └─backend/
│ exim.post.php
│
└─schemas/
└─exim/
order_np.functions.php
order_np.php
1.2.の処理は主にorder_np.functions.phpにて行い、3.はorder_np.phpで行います。あとは省略。cs-cartドキュメント勝手に参照して下さい。
order_np.functions.php
<?php
/***************************************************************************
* *
* Copyright (c) 2018 Kyobunkwan Co.,Ltd. All rights reserved. *
* *
****************************************************************************/
/**
* 半角=1,全角=2とし、$strの文字列長を計算し、$len以内の文字にして返却する
*/
function fn_exim_order_np_get_strcut($str, $len, $nomix)
{
//半角全角の混在不可
if ($nomix) {
// 半角文字だけでない場合、すべて全角に変換
if (strlen($str) != mb_strlen($str)) {
$str = mb_convert_kana($str,'ASKHV','UTF-8');
}
}
// SJISに変換し、文字数が $len以内か判定する
$char_codes = mb_list_encodings();
$str_len = strlen(mb_convert_encoding($str, (in_array('SJIS-win', $char_codes) ? 'SJIS-win' : 'SJIS'), 'UTF-8'));
if ($str_len <= $len) {
return $str;
}
$str_len = 0;
$i = 0;
do {
$str_1 = mb_substr($str, $i, 1, 'UTF-8');
if (strlen($str_1) == 1) {
$str_len += 1;
} else {
$str_len += 2;
}
if ($str_len >= $len) {
if ($str_len > $len) {
$i--;
}
return mb_substr($str, 0, ++$i, 'UTF-8');
break;
}
$i++;
} while(1);
}
/**
* Get item orders information
* @param $order_id, $col
* @return orders information
*/
function fn_exim_order_np_get_orders($order_id, $col)
{
static $_data = array();
if (empty($_data) or (isset($_data[order_id]) and $_data[order_id] != $order_id )) {
$_data = db_get_row("SELECT *, order_id, concat(b_state,b_city,b_address,b_address_2) as address, concat(b_firstname,' ',b_lastname) as b_name FROM ?:orders WHERE order_id = ?i", $order_id);
if (!empty($_data)) {
$_data['address'] = mb_convert_kana($_data['address'],'ASKHV','UTF-8');
$_data['b_name'] = mb_convert_kana($_data['b_name'],'ASKHV','UTF-8');
}
}
$return = "";
if (array_key_exists($col, $_data)) {
$return = $_data[$col];
} elseif ($col == "collect_total") { // 代引き対応 15.11.08
if (fn_exim_order_np_get_orderdata($order_id, 'shipping') == 'COLLECT') {
$return = intval($_data['total']);
}
}
return $return;
}
/**
* Get item kana information
* @param $order_id, $lang_code
* @return kana information
*/
function fn_exim_order_np_get_kana($order_id, $lang_code = CART_LANGUAGE)
{
$_firestname_kana = '';
$_lastname_kana = '';
$_user = db_get_array("SELECT d.description, f.value, a.section FROM ?:profile_fields_data as f LEFT JOIN ?:profile_field_descriptions as d ON d.object_id = f.field_id AND d.object_type = 'F' AND d.lang_code = ?s LEFT JOIN ?:profile_fields as a ON a.field_id = f.field_id WHERE f.object_id = ?i AND f.object_type = 'O' AND a.section = 'S'", $lang_code, $order_id);
if (!empty($_user)) {
foreach ($_user as $field) {
if ($field['description'] == '姓フリガナ') {
$_firestname_kana = $field['value'];
} elseif ($field['description'] == '名フリガナ') {
$_lastname_kana = $field['value'];
}
}
}
if (strlen($_firestname_kana) and strlen($_lastname_kana)) {
$_firestname_kana .= " ";
}
return mb_convert_kana($_firestname_kana.$_lastname_kana, "aks");
}
/**
* Get Today
* @param array $data extra data
* @return Today YYYY/MM/DD
*/
function fn_exim_order_np_get_now()
{
return date("Y/m/d");
}
/**
* Get Default Value
* @param Default Value
* @return Default Value
*/
function fn_exim_order_np_get_default($val)
{
return $val;
}
order_np.php
<?php
/***************************************************************************
* *
* Copyright (c) 2018 Kyobunkwan Co.,Ltd. All rights reserved. *
* *
****************************************************************************/
use Tygh\Registry;
include_once(Registry::get('config.dir.addons') . 'exim_np/schemas/exim/order_np.functions.php');
return array(
'section' => 'orders',
'pattern_id' => 'order_np',
'name' => 'NP後払い',
'key' => array('order_id'),
'order' => 3,
'table' => 'orders',
// 'condition' => array(
// 'conditions' => array('&orders.is_parent_order' => 'N', '&orders.status' => array('P','O')),
// ),
'condition' => array(
'conditions' => array('&orders.is_parent_order' => 'N'),
),
'range_options' => array(
'selector_url' => 'orders.manage',
'object_name' => __('orders'),
),
'export_fields' => array(
'加盟店取引ID' => array(
'db_field' => 'order_id',
'alt_key' => true,
'required' => true,
),
'注文日' => array(
'linked' => false,
'process_get' => array('fn_exim_order_np_get_now'), // 処理日付
'required' => true,
),
'購入者会社名' => array(
'linked' => false,
'required' => true,
),
'購入者部署名' => array(
'linked' => false,
'required' => true,
),
'購入者氏名(漢字)' => array(
'linked' => false,
'process_get' => array('fn_exim_order_np_get_orders', '#key', 'b_name'),
'required' => true,
),
'購入者氏名(カナ)' => array(
'linked' => false,
'required' => true,
),
'購入者〒' => array(
'db_field' => 'b_zipcode',
'required' => true,
),
'購入者氏名(カナ)' => array(
'linked' => false,
'required' => true,
),
'購入者住所' => array(
'linked' => false,
'process_get' => array('fn_exim_order_np_get_orders', '#key', 'address'),
'required' => true,
),
'購入者電話番号' => array(
'db_field' => 'phone',
'required' => true,
),
'購入者メールアドレス' => array(
'db_field' => 'email',
'required' => true,
),
'お届け先会社' => array(
'linked' => false,
'required' => true,
),
'お届け先部署名' => array(
'linked' => false,
'required' => true,
),
'お届け先氏名(漢字)' => array(
'linked' => false,
'required' => true,
),
'お届け先氏名(カナ)' => array(
'linked' => false,
'required' => true,
),
'お届け先〒' => array(
'linked' => false,
'required' => true,
),
'お届先住所' => array(
'linked' => false,
'required' => true,
),
'お届先電話番号' => array(
'linked' => false,
'required' => true,
),
'決済方法' => array(
'linked' => false,
'process_get' => array('fn_exim_order_np_get_default','2'), // :決済方法
'required' => true,
),
'カード支払い方法' => array(
'linked' => false,
'required' => true,
),
'カード番号' => array(
'linked' => false,
'required' => true,
),
'カード有効期限' => array(
'linked' => false,
'required' => true,
),
'顧客請求金額' => array( //「単価」と同一
'db_field' => 'total',
'required' => true,
),
'商品名' => array( //
'linked' => false,
'process_get' => array('fn_exim_order_np_get_default','ご注文商品総額'), // :ご注文商品総額
'required' => true,
),
'単価' => array(
'db_field' => 'total',
'required' => true,
),
'数量' => array(
'linked' => false,
'process_get' => array('fn_exim_order_np_get_default','1'), // :数量
'required' => true,
),
),
);
追記 18.3.30
cs-cartではデータベースに格納されるtotalが小数点以下2桁まであることが判明。単純に取り出すと
1230.00円→123000円
と「.」を3桁区切りの文字と認識して桁が2つ増えてしまう。CS-cart上管理画面で小数点の区切り文字を「.」から変更できるようだが、本来の操作ではなく、後々に影響が出る危惧がある。そこで新たに文字型を整数型にするintval関数をtotalにかぶせる独自関数「fn_exim_order_np_get_num_int」を作って適用する。
order_np.functions.php
/**
* Get total intval
* @param $order_id, $col
* @return intval(total)
*/
function fn_exim_order_np_get_num_int($order_id, $col)
{
static $_data = array();
if (empty($_data) or (isset($_data[order_id]) and $_data[order_id] != $order_id )) {
$_data = db_get_row("SELECT *, order_id, concat(b_state,b_city,b_address,b_address_2) as address, concat(b_firstname,' ',b_lastname) as b_name FROM ?:orders WHERE order_id = ?i", $order_id);
}
$return = "";
if ($col == "total") {
$return = intval($_data['total']); //ここでデータベースのtotalが整数型にされる
}
return $return;
}
参考
array db_get_row(string $query)
CS-Cartのデータベースからデータを取得するAPI。
一行だけ取得する。LIMIT 1を自動的につけるわけではないので、パフォーマンスを得たい場合はSQLにLIMIT 1も明示する必要あり。
例$user = db_get_row('SELECT user_id, firstname, lastname FROM ?:users');結果
array ( 'user_id' => '1', 'firstname' => 'John', 'lastname' => 'Doe', )
