管理画面から注文情報のCSVの出力
ネットショップを運営していると他サービスとの連携で注文情報のCSVを必要とする場面が多いです。
今回はSOY Shopの管理画面から注文情報のCSVの出力周りを見ていきたいと思います。
CSVの出力は納品書の一括出力の際に利用した拡張ポイントを利用します。
SOY Shopプラグインの解説 納品書やCSVを一括で出力する
今回はB2CSVエクスポートのコードを確認しながら処理を見ていきます。
(プラグインID: b2_order_csv)
(/soyshop/webapp/src/module/plugins/b2_order_csv/soyshop.order.export.php)
はじめにプラグインをインストールすると

注文一覧に上の画像のように出力ボタンが用意されます。
下の説明文はsoyshop.order.csv.phpのgetMenuDescription関数で用意します。
function getMenuDescription(){
return 'B2形式のCSVを出力します。 (<b>文字コード=</b>
<input id="charset_shit_jis" name="charset" value="Shift-JIS" checked="checked" type="radio" />
<label for="charset_shit_jis">Shift-JIS</label>
<input id="charset_utf_8" name="charset" value="UTF-8" type="radio" />
<label for="charset_utf_8">UTF-8</label>
)';
}
このプラグインでは出力ボタンの下に出力時のエンコードの指定を表示しています。
次に出力周りの処理ですが、同じファイルのexport関数で行います。
if(!$this->csvLogic)$this->csvLogic = new B2OutputCSV();
set_time_limit(0);
$lines = array();
foreach($orders as $order){
$orderId = $order->getId();
$line = $this->csvLogic->getCSVLine($orderId);
if(!is_null($line)){
$lines[] = $line;
}
}
getCSVLine($orderId)で注文ごとにCSVの行を作成します。
getCSVLine関数の内部の処理を見ると
/soyshop/webapp/src/module/plugins/b2_order_csv/common.php
$csv = array();
$csv[] = $config["number"]; //お客様管理番号
$csv[] = ($daibiki==true) ? 2 : 0; //送り状種類
$csv[] = ""; //クール区分
$csv[] = ""; //伝票番号
$csv[] = ""; //出荷予定日
$csv[] = ""; //お届け予定日
$csv[] = $deliveryCode; //配達時間帯
$csv[] = ""; //お届け先コード
$csv[] = $this->mbConvertKana($address["telephoneNumber"]); //お届け先電話番号
$csv[] = ""; //お届け先電話番号枝番
//途中省略
$line = implode(",",$csv);
return $line;
$csvの配列を用意し、B2の仕様に合わせて列分だけ配列に値を入れ、implode(",", $csv)でカンマ区切りの行用の文字列を作成して返します。
soyshop.order.export.phpに戻って、
$charset = (isset($_REQUEST["charset"])) ? $_REQUEST["charset"] : "Shift-JIS";
header("Cache-Control: public");
header("Pragma: public");
//出力するファイル名の指定
header("Content-Disposition: attachment; filename=b2_" . $orderId.".csv");
//出力するファイルのエンコードを指定
header("Content-Type: text/csv; charset=" . htmlspecialchars($charset) . ";");
ob_start();
echo implode("," , $this->csvLogic->getLabels());
echo "\r\n";
echo implode("\r\n",$lines);
$csv = ob_get_contents();
ob_end_clean();
echo mb_convert_encoding($csv,$charset,"UTF-8");
カンマ区切りの行テキストにしたものを$lines配列に放り込んでob_startで出力します。
echo implode("," , $this->csvLogic->getLabels());
function getLabels(){
$label = array();
$label[] = "お客様管理番号";
$label[] = "送り状種類";
$label[] = ""; //クール区分
$label[] = ""; //伝票番号
$label[] = "出荷予定日"; // YYYY/MM/DD
$label[] = "お届け予定日"; // YYYY/MM/DD
$label[] = "配達時間帯";
$label[] = "お届け先コード"; //ここは空欄になってる
$label[] = "お届け先電話番号"; //ハイフンを含む
$label[] = "お届け先電話番号枝番";
$label[] = "お届け先郵便番号"; //ハイフンなし可
$label[] = "お届け先住所";
$label[] = "お届け先建物名";
$label[] = "お届け先会社・部門1";
$label[] = "お届け先会社・部門2";
//途中省略
return $label;
}
ラベルが必要な場合は上記のコードのように各項目を入れた配列を返す関数を用意して、その関数もカンマ区切りの文字列にして出力します。
ここでいうラベルとは、

出力されたCSVの一行目の各項目の表示のことで、
連携するシステムによっては不要な場合もありますので、
適宜付与するようにしてください。