【ECCUBE】API機能をカスタマイズして情報を成形して返す
ECCUBEはもともとAPI機能が実装されてます。
PHP、XML、json形式で商品検索したり、カートに商品を追加・クリアしたり。
でも自社独自の基幹システムがあって、情報をやりとりする場合は標準の機能では実現できないことが多いです。
そこで、プログラムを修正して自分の好きな値を取得できるようなAPI機能にカスタマイズしてみました。
今回は「お届け日」をパラメーターで渡して、日付・商品番号・数量などの情報をcsv形式のデータで返すAPIです。
ただし注意点としては、顧客情報などは漏えいの可能性がありますので、扱う場合は直接データベースにアクセスする仕組みのほうがよいでしょう。
実際に機能追加を行ったECサイトとPHPのバージョンは以下の通りです。
- EC-CUBE:2.13.1
- PHP:5.3.15
新規で追加するファイルと修正対象ファイル
新しく作るファイルは3つ、既存の修正するファイルは2つです。
新規で作成するファイル
- /api/csv.php
- /data/class/pages/api/LC_Page_Api_Csv.php
- /data/class_extends/page_extends/api/LC_Page_Api_Csv_Ex.php
修正する既存ファイル
- SC_Api_Operation_Ex.php
- SC_Api_Utils_Ex.php
プログラム詳細
それでは一つ一つ見ていきます。
新規で作成するファイルも、基本的には既存のファイルを複製して修正を加えていきます。
- csv.php
基本的には同階層のxml.phpなどのファイルを複製してファイル名と内容を修正しています。
<?php require_once '../require.php'; require_once CLASS_EX_REALDIR . 'page_extends/api/LC_Page_Api_Csv_Ex.php'; $objPage = new LC_Page_Api_Csv_Ex(); $objPage->init(); $objPage->process();
- LC_Page_Api_Csv.php
これも「LC_Page_Api_Xml.php」を複製して一部修正します。
主な修正箇所はクラス名とメソッドの引数名くらいでしょうか。
<?php require_once CLASS_EX_REALDIR . 'page_extends/LC_Page_Ex.php'; require_once CLASS_EX_REALDIR . 'api_extends/SC_Api_Operation_Ex.php'; /** * APIのページクラス. * */ class LC_Page_Api_Csv extends LC_Page_Ex { /** * Page を初期化する. * * @return void */ public function init() { parent::init(); } /** * Page のプロセス. * * @return void */ public function process() { $this->action(); // $this->sendResponse(); } /** * Page のアクション. * * @return void */ public function action() { $arrParam = $_REQUEST; list($response_outer, $arrResponse) = SC_Api_Operation::doApiAction($arrParam); SC_Api_Operation_Ex::sendApiResponse('csv', $response_outer, $arrResponse); SC_Response_Ex::actionExit(); } }
- LC_Page_Api_Csv_Ex.php
これも複製して、読み込むクラスファイルとクラス名を変えるくらい。
<?php require_once CLASS_REALDIR . 'pages/api/LC_Page_Api_Csv.php'; /** * API のページクラス(拡張). * * LC_Page_Api_Csv をカスタマイズする場合はこのクラスを編集する. * */ class LC_Page_Api_Csv_Ex extends LC_Page_Api_Csv { /** * Page を初期化する. * * @return void */ function init() { parent::init(); } /** * Page のプロセス. * * @return void */ function process() { parent::process(); } }
つづいて既存ファイルの修正です。
- SC_Api_Operation_Ex.php
これはAPIが呼ばれたときにそのパラメータの指示どおり、いずれのタイプ(xmlかphpか、はたまたjson、csv)で応答するかを判定するクラスです。
単純にswitch文に「csv」を入れてやります。
<?php /** * APIの拡張クラス * */ require_once CLASS_REALDIR . 'api/SC_Api_Operation.php'; class SC_Api_Operation_Ex extends SC_Api_Operation { public function sendApiResponse($type, $response_outer_name, &$arrResponse) { switch ($type) { case 'xml': SC_Api_Utils_Ex::sendResponseXml($response_outer_name, $arrResponse); break; case 'php': SC_Api_Utils_Ex::sendResponsePhp($response_outer_name, $arrResponse); break; case 'csv'://ココに追記 SC_Api_Utils_Ex::sendResponseCsv($response_outer_name, $arrResponse); break; case 'json': default: SC_Api_Utils_Ex::sendResponseJson($response_outer_name, $arrResponse); break; } } }
- SC_Api_Utils_Ex.php
いよいよ、これがキモのファイルとなります。
どんな内容をココに入れてやれば、その内容を返します。
<?php /** * APIの拡張クラス */ require_once CLASS_REALDIR . 'api/SC_Api_Utils.php'; class SC_Api_Utils_Ex extends SC_Api_Utils { /* * apiでcsvを返すメソッド */ public function sendResponseCsv($response_outer_name, &$arrResponse) { header('Content-Type: text/http; charset=UTF-8'); $arrResponse['response_name'] = $response_outer_name; $shipping_date = $arrResponse["OperationRequest"]["Arguments"][0]["_attributes"]["Value"]; /* URLパラメータの日付でお届け日検索 */ $where = ' dtb_shipping.shipping_date = ? AND dtb_shipping.order_id = dtb_shipment_item.order_id AND dtb_shipping.order_id = dtb_order.order_id'; $arrval = array($shipping_date); $orderNum = ''; $objQuery = new SC_Query_Ex(); $arr = $objQuery->select('*', 'dtb_shipment_item,dtb_shipping,dtb_order', $where, $arrval); foreach ($arr as $arrvalue){ echo date("Y/m/d", strtotime($arrvalue["shipping_date"])) . "," . substr($arrvalue["product_code"], 2, 4) . "," . $arrvalue["quantity"] . "," . $arrvalue["order_id"] . "," . $arrvalue["customer_id"] . "\r\n"; } } }
ファイル追加、修正は以上です。
下記のURLでアクセスしてみてください。
http://(またはhttps://)ドメイン名/api/csv.php?catch=◯◯◯◯-◯◯-◯◯
今回はお届け日を指定して受注データを返すので、「◯◯◯◯-◯◯-◯◯」には「2016-01-25」みたいな感じでお届け日の日付を入れてみてください。
うまくいったでしょうか。
出力は以下のような内容でかえるかと思います。
日付,商品コード,個数,受注ID,顧客ID
2015/05/26,S509,1,944,396
2015/05/26,S148,1,944,396
2015/05/26,S132,1,944,396
2015/05/26,S003,1,937,232
2015/05/26,S011,1,937,232
2015/05/26,S085,1,937,232
オープンソースECサイト構築ソフトEC-CUBE【Ver2.11対応】公式ガイドブック基本編
オープンソースECサイト構築ソフトEC-CUBE【Ver2.11対応】公式ガイドブック応用編
いつも読んでくれてありがとね!