【EC-CUBE(2.13】納品書の購入商品一覧テーブルに商品画像を表示させる方法

【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;
	}

以上です。

お気軽にコメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください