【EC-CUBE(2.13】納品書の購入商品一覧テーブルに商品画像を表示させる方法です。
画像情報を取得するため注文詳細データ取得メソッドを修正
以下の拡張ヘルパークラスファイルにgetOrderDetailメソッドを追加します。
data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php
public function getOrderDetail($order_id, $has_order_status = true) {
$objQuery = & SC_Query_Ex::getSingletonInstance();
$dbFactory = SC_DB_DBFactory_Ex::getInstance();
$col = <<< __EOS__
T3.product_id,
T3.product_class_id as product_class_id,
T3.product_type_id AS product_type_id,
T2.product_code,
T2.product_name,
T2.classcategory_name1 AS classcategory_name1,
T2.classcategory_name2 AS classcategory_name2,
T2.price,
T2.quantity,
T2.point_rate,
T2.tax_rate,
T2.tax_rule,
T4.main_list_image, // これを追加して商品画像ファイル名を取得する
__EOS__;
if ($has_order_status) {
$col .= 'T1.status AS status, T1.payment_date AS payment_date,';
}
$col .= <<< __EOS__
CASE WHEN
EXISTS(
SELECT * FROM dtb_products
WHERE product_id = T3.product_id
AND del_flg = 0
AND status = 1
)
THEN '1'
ELSE '0'
END AS enable,
__EOS__;
$col .= $dbFactory->getDownloadableDaysWhereSql('T1') . ' AS effective';
$from = <<< __EOS__
dtb_order T1
JOIN dtb_order_detail T2
ON T1.order_id = T2.order_id
LEFT JOIN dtb_products_class T3
ON T2.product_class_id = T3.product_class_id
LEFT JOIN dtb_products T4
ON T3.product_id = T4.product_id
__EOS__;
$objQuery->setOrder('T2.order_detail_id');
return $objQuery->select($col, $from, 'T1.order_id = ?', array($order_id));
}
購入商品情報配列に商品画像ファイルパスを追加
以下の拡張クラスファイルにsetOrderDataメソッドを編集して追加します。
data/class_extends/SC_Fpdf_Ex.php
public function setOrderData() {
$arrOrder = array();
// DBから受注情報を読み込む
$this->lfGetOrderData($this->arrData['order_id']);
// 購入者情報
$text = '〒 ' . $this->arrDisp['order_zip01'] . ' - ' . $this->arrDisp['order_zip02'];
$this->lfText(23, 43, $text, 10); //購入者郵便番号
$text = $this->arrPref[$this->arrDisp['order_pref']] . $this->arrDisp['order_addr01'];
$this->lfText(27, 47, $text, 10); //購入者都道府県+住所1
$this->lfText(27, 51, $this->arrDisp['order_addr02'], 10); //購入者住所2
$text = $this->arrDisp['order_name01'] . ' ' . $this->arrDisp['order_name02'] . ' 様';
$this->lfText(27, 59, $text, 11); //購入者氏名
// お届け先情報
$this->SetFont('SJIS', '', 10);
$this->lfText(25, 125, SC_Utils_Ex::sfDispDBDate($this->arrDisp['create_date']), 10); //ご注文日
$this->lfText(25, 135, $this->arrDisp['order_id'], 10); //注文番号
$this->SetFont('Gothic', 'B', 15);
$this->Cell(0, 10, $this->tpl_title, 0, 2, 'C', 0, ''); //文書タイトル(納品書・請求書)
$this->Cell(0, 66, '', 0, 2, 'R', 0, '');
$this->Cell(5, 0, '', 0, 0, 'R', 0, '');
$this->SetFont('SJIS', 'B', 15);
$this->Cell(67, 8, number_format($this->arrDisp['payment_total']) . ' 円', 0, 2, 'R', 0, '');
$this->Cell(0, 45, '', 0, 2, '', 0, '');
$this->SetFont('SJIS', '', 8);
$monetary_unit = '円';
$point_unit = 'Pt';
// 購入商品情報
for ($i = 0; $i < count($this->arrDisp['quantity']); $i++) {
// 商品画像ファイルパスを追加
$arrOrder[$i][0] = sprintf('%s%s', IMAGE_SAVE_REALDIR, $this->arrDisp['main_list_image'][$i]);
// 購入数量
$data[0] = $this->arrDisp['quantity'][$i];
// 税込金額(単価)
$data[1] = SC_Helper_DB_Ex::sfCalcIncTax($this->arrDisp['price'][$i], $this->arrDisp['tax_rate'][$i], $this->arrDisp['tax_rule'][$i]);
// 小計(商品毎)
$data[2] = $data[0] * $data[1];
$arrOrder[$i][0] = $this->arrDisp['product_name'][$i] . ' / ';
$arrOrder[$i][0] .= $this->arrDisp['product_code'][$i] . ' / ';
if ($this->arrDisp['classcategory_name1'][$i]) {
$arrOrder[$i][0] .= ' [ ' . $this->arrDisp['classcategory_name1'][$i];
if ($this->arrDisp['classcategory_name2'][$i] == '') {
$arrOrder[$i][0] .= ' ]';
} else {
$arrOrder[$i][0] .= ' * ' . $this->arrDisp['classcategory_name2'][$i] . ' ]';
}
}
$arrOrder[$i][1] = number_format($data[0]);
$arrOrder[$i][2] = number_format($data[1]) . $monetary_unit;
$arrOrder[$i][3] = number_format($data[2]) . $monetary_unit;
}
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '';
$arrOrder[$i][3] = '';
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '商品合計';
$arrOrder[$i][3] = number_format($this->arrDisp['subtotal']) . $monetary_unit;
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '送料';
$arrOrder[$i][3] = number_format($this->arrDisp['deliv_fee']) . $monetary_unit;
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '手数料';
$arrOrder[$i][3] = number_format($this->arrDisp['charge']) . $monetary_unit;
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '値引き';
$arrOrder[$i][3] = '- ' . number_format(($this->arrDisp['use_point'] * POINT_VALUE) + $this->arrDisp['discount']) . $monetary_unit;
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '請求金額';
$arrOrder[$i][3] = number_format($this->arrDisp['payment_total']) . $monetary_unit;
// ポイント表記
if ($this->arrData['disp_point'] && $this->arrDisp['customer_id']) {
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '';
$arrOrder[$i][3] = '';
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '利用ポイント';
$arrOrder[$i][3] = number_format($this->arrDisp['use_point']) . $point_unit;
$i++;
$arrOrder[$i][0] = '';
$arrOrder[$i][1] = '';
$arrOrder[$i][2] = '加算ポイント';
$arrOrder[$i][3] = number_format($this->arrDisp['add_point']) . $point_unit;
}
$this->FancyTable($this->label_cell, $arrOrder, $this->width_cell);
}
テーブルカラム名を追加
上記と同じ拡張クラスファイルに編集したコンストラクタを追加します。
public function __construct($download, $title, $tpl_pdf = 'nouhinsyo1.pdf') {
parent::__construct($download, $title, $tpl_pdf);
$this->width_cell = array(20, 90.3, 12, 21.7, 24.5);
$this->label_cell = array();
$this->label_cell[] = '商品画像'; //カラム名を追加
$this->label_cell[] = '商品名 / 商品コード / [ 規格 ]';
$this->label_cell[] = '数量';
$this->label_cell[] = '単価';
$this->label_cell[] = '金額(税込)';
}
setOrderDataメソッドのアクセス権をpublicに変更
以下のクラスファイルのsetOrderDateメソッドのアクセス権を修正して下さい。
data/class/SC_Fpdf.php
public function setOrderData() {
テーブルを生成するメソッドをカスタマイズ
以下の拡張クラスファイルに編集したFancyTableメソッドを追加します。
data/class_extends/helper_extends/SC_Helper_FPDI_Ex.php
/**
* Colored table
*
* FIXME: 後の列の高さが大きい場合、表示が乱れる。
*/
public function FancyTable($header, $data, $w) {
$base_x = $this->x;
// Colors, line width and bold font
$this->SetFillColor(216, 216, 216);
$this->SetTextColor(0);
$this->SetDrawColor(0, 0, 0);
$this->SetLineWidth(.3);
$this->SetFont('', 'B');
// Header
for ($i = 0; $i < count($header); $i++) {
$this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
}
$this->Ln();
// Color and font restoration
$this->SetFillColor(235, 235, 235);
$this->SetTextColor(0);
$this->SetFont('');
// Data
$fill = false;
$h = 4;
foreach ($data as $row) {
$x = $base_x;
$h = 4;
$i = 0;
// XXX この処理を消すと2ページ目以降でセルごとに改ページされる。
$this->Cell(0, $h, '', 0, 0, '', 0, '');
foreach ($row as $col) {
// 列位置
$this->x = $x;
// FIXME 汎用的ではない処理。この指定は呼び出し元で行うようにしたい。
if ($i == 0) {
$align = 'L';
} else {
$align = 'R';
}
$y_before = $this->y;
// 商品画像ファイルパスだったら商品画像表示させる
if (preg_match('/.*(jpg|png)$/', preg_quote($col, "/"))) {
$this->Image($col, $x, $this->y, $w[$i]);
$h = $this->SJISMultiCell($w[$i], $w[$i], "", 1, $align, false, 0);
} else {
//商品名が改行される場合高さを調整する
$wmax = ($cell['width'][$i]-2*$this->cMargin);
$sjis = mb_convert_encoding($col, "SJIS", "UTF-8");
$strw = $this->GetSJISStringWidth($sjis);
if($strw > $wmax){
$h = $h/(floor($strw/$wmax)+1);
}
$h = $this->SJISMultiCell($w[$i], $h, $col, 1, $align, $fill, 0);
}
$h = $this->y - $y_before;
$this->y = $y_before;
$x += $w[$i];
$i++;
}
$this->Ln();
$fill = !$fill;
}
$this->SetFillColor(255);
$this->x = $base_x;
}
以上です。