【EC-CUBE】レビュー管理で出力するCSVの項目をカスタマイズする。
こんにちは、fukasawaです。最近は仕事中飴を舐めることが多いです。チョコだと脂質が気になるので飴にしてみたのですが、細くなった飴で舌がサクッと切れたりするので少し困ります。味噌汁がしみる…
さて、EC-CUBEにはレビュー機能があり、商品毎にレビューを投稿することができます。投稿されたレビューは管理画面の「商品管理>レビュー管理」からCSV形式でダウンロードすることができますが、デフォルトの状態では、レビューが紐付いている商品の商品ID等を取得することができません。
今回は、レビュー管理のCSV出力を行った際に出力する項目をカスタマイズし、商品IDを出力する方法について少し書いてみようと思います。
※EC-CUBEバージョン2.13.1の使用を想定した内容になっています
CSV出力項目に商品IDを追加する
レビューに紐づく商品の商品IDをCSV出力項目に追加します。
CSVダウンロードを行った際に出力される項目はDBの「dtb_csv」というテーブルで管理されています。レビュー機能に限らずCSV出力項目を追加したい場合、このテーブルにレコードを新しく追加することになります。
INSERT INTO dtb_csv(
no,
csv_id,
col,
disp_name,
rank,
rw_flg,
status,
create_date,
update_date,
mb_convert_kana_option,
size_const_type,
error_check_types
)
VALUES
(
1001,
'4',
'A.product_id',
'商品ID',
'1',
'1',
'1',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,
'n',
'INT_LEN',
'NUM_CHECK,MAX_LENGTH_CHECK'
);
※各カラムについてはテーブル定義を参照してください(EC-CUBEのモジュールをダウンロードすると、\docs\table_definition.xlsにテーブル定義が含まれています。)
csv_id
レビュー機能に項目を追加する場合は4を設定します。どの機能のCSV出力に項目を追加するかを指定しており、商品管理の場合:1、会員管理の場合:2、受注管理の場合:3、カテゴリの場合:5 をそれぞれ指定します。
col
CSV出力に含めるテーブルのカラムを指定します。今回は'A.product_id'を指定しています。先頭のAについてですが、レビュー機能のCSV出力部分のソースを確認すると、SQLのfrom句に以下が指定がされていることを確認できます。
$from = 'dtb_review AS A INNER JOIN dtb_products AS B on A.product_id = B.product_id';
dtb_reviewというテーブルに「A」という別名が設定されています。今回はこの別名「A」を指定し、dtb_reviewテーブルのproduct_idを取得しています。dtb_csvテーブルに入っている他のレコードを見るとわかるのですが、colカラムには取得したい内容がSQL文の一部として設定されています。
レコードを追加した後は「管理画面→コンテンツ管理→CSV出力項目設定→レビュー」に「商品ID」が表示されるようになり、出力項目の順番を入れ替えられるようになります。
CSV出力項目のおすすめレベルを「★」から数値に変更する
管理画面のレビュー管理からCSVをダウンロードしてみるとわかるのですが、おすすめレベルが「★」で出力されています。画面表示のときは「★」で出力されていても良いのですが、CSVデータとして扱う場合は数値の方が都合よいケースもあると思います。ということで、これを数値で出力するよう変更してみます。
以下のSQLを発行し、既存のレコードを更新します。
UPDATE dtb_csv SET col = 'A.recommend_level as recommend_level' WHERE csv_id =4 AND disp_name = 'おすすめレベル'
このレコードはもともと「mtb_recommend」テーブルを使用しておすすめレベルを「★」に変換するよう設定されているのですが、おすすめレベルの数値をそのまま出力するよう変更しています。
CSV出力項目にレビューを書いた顧客の会員IDを出力する
まず、レビューを投稿した会員の会員IDがDBに入るように作られていないので、入れるようカスタマイズします。「dtb_review」テーブルには既にcustomer_idというカラムが存在しているのですが、実際には使われておらず、レビューを投稿するとNULLが設定されます。カラムがあるのに何故使われていないのだろうと疑問に思いつつ、下記のようにコードを修正します。
\data\class_extends\page_extends\products\LC_Page_Products_Review_Ex.php
//登録実行
public function lfRegistRecommendData(&$objFormParam)
{
$objQuery =& SC_Query_Ex::getSingletonInstance();
$arrRegist = $objFormParam->getDbArray();
$arrRegist['create_date'] = 'CURRENT_TIMESTAMP';
$arrRegist['update_date'] = 'CURRENT_TIMESTAMP';
$arrRegist['creator_id'] = '0';
if(isset($_SESSION['customer']['customer_id'])){
$arrRegist['customer_id'] = $_SESSION['customer']['customer_id'];
}
//-- 登録実行
$objQuery->begin();
$arrRegist['review_id'] = $objQuery->nextVal('dtb_review_review_id');
$objQuery->insert('dtb_review', $arrRegist);
$objQuery->commit();
}
※if文のあたりが追記箇所です。会員がログインしていた場合に、レビューを投稿した会員の会員IDが設定されるようにしています。
※lfRegistRecommendData()というメソッドがない場合は追加してください。
コードを修正したら、CSV出力項目に会員IDが追加されるよう「dtb_csv」テーブルにレコードを追加します。
INSERT INTO dtb_csv(
no,
csv_id,
col,
disp_name,
rank,
rw_flg,
status,
create_date,
update_date,
mb_convert_kana_option,
size_const_type,
error_check_types
)
VALUES
(
1002,
'4',
'A.customer_id',
'会員ID',
'1',
'1',
'1',
CURRENT_TIMESTAMP,
CURRENT_TIMESTAMP,
'n',
'INT_LEN',
'NUM_CHECK,MAX_LENGTH_CHECK'
);