• 2018.08.28
  • [最終更新日]2018.09.07
  • EC-cube

【EC-cube2.13】購入担当者を追加してMYページで絞り込み検索したい

【EC-cube2.13】購入担当者を追加してMYページで絞り込み検索したいのイメージ画像

1つの会員アカウント内で複数の担当者を管理したいという要望がありました。
親子関係を構築するとなると工数があがりそうなので、注文時に担当者を入力させて、
MYページからは購入履歴を担当者で絞り込みできる仕組みにします。

流れといたしましては、

  1. 1.「担当者」という項目をDBに追加して表示できるようにする。
  2. 2.「担当者」を注文時に登録できるようにする。
  3. 3.「担当者」でMYページの購入履歴を絞り込みできるようにする。

こんな感じでいってみます!

【項目追加】phpMyAdminを使用してDBに項目を追加する

注文情報は「dtb_order」と「dtb_order_temp」テーブルにはいるので、これらに項目を追加します。

EC-cubeでは、まず「dtb_order_temp」にデータが書き込まれ、最終的に購入完了まで行くと「dtb_order_temp」の内容が「dtb_order」にコピーされるようになっているようです。

「担当者」を「person_in_charge」という項目名で追加
名前「person_in_charge」データ型「TEXT」デフォルト値「NULL」

【項目追加】とりあえず表示させてみる

とりあえずテストで表示させてみたいので、先ほど追加した「担当者」にデータを直接入力します。

PHPロジック側ファイルの編集

「/data/class_extends/page_extends/mypage/LC_Page_Mypage_Ex.php」に

public function lfGetOrderHistory($customer_id, $startno = -1)
{
 $objQuery   = SC_Query_Ex::getSingletonInstance();
 
 $col = 'order_id, create_date, payment_id, payment_total, status, 
 person_in_charge'; //この行を追加
     ・
     ・

Smartyテンプレート側ファイルの編集

「data/Smarty/templates/default/mypage/index.tpl」の購入一覧のテーブルに追加

<td class="alignC"><!--{$arrOrder[cnt].person_in_charge}--></td>

DBに入力した「担当者名」をMYページで確認できましたでしょうか?

【登録機能】注文時に購入担当者をDBに登録する

LC_Page_Shopping_Payment_Ex.phpを編集

LC_Page_Shopping_Payment.php から「lfInitParam」メソッドをコピーしてきて項目を追加します

public function lfInitParam(&$objFormParam, $deliv_only, &$arrShipping)
    {
        $objFormParam->addParam('配送業者', 'deliv_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));
        $objFormParam->addParam('ポイント', 'use_point', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK', 'ZERO_START'));
        $objFormParam->addParam('その他お問い合わせ', 'message', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
        $objFormParam->addParam('ポイントを使用する', 'point_check', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'), '2');

        if ($deliv_only) {
            $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
        } else {
            $objFormParam->addParam('お支払い方法', 'payment_id', INT_LEN, 'n', array('EXIST_CHECK', 'MAX_LENGTH_CHECK', 'NUM_CHECK'));

            foreach ($arrShipping as $val) {
                $objFormParam->addParam('お届け時間', 'deliv_time_id' . $val['shipping_id'], INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
                $objFormParam->addParam('お届け日', 'deliv_date' . $val['shipping_id'], STEXT_LEN, 'KVa', array('MAX_LENGTH_CHECK'));
            }
        }
		
		//この行加えて上書きしているだけ
		$objFormParam->addParam('担当者', 'person_in_charge', STEXT_LEN, 'KVa', array('EXIST_CHECK', 'MAX_LENGTH_CHECK'));

        $objFormParam->setParam($arrShipping);
        $objFormParam->convParam();
    }

Smartyテンプレート側ファイルの編集

「data/Smarty/templates/default/shopping/payment.tpl」のフォームに追加

<!--{assign var=key value="person_in_charge"}-->
<input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value}-->" maxlength="<!--{$arrForm[$key].length}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->" class="box60" />

ここまでで一旦区切り

ここまでうまくいっていれば、注文時に入力した「担当者」がDBのdtb_order等に登録されて、
それをMYページの購入一覧のテーブルで表示を確認できるようになっていると思います。

【検索機能】actionメソッドをカスタマイズ

LC_Page_Mypage_Ex.php

LC_Page_Mypage.phpからactionメソッドをコピーしてきて内容を上書きします。

    public function action()
    {
        //決済処理中ステータスのロールバック
        $objPurchase = new SC_Helper_Purchase_Ex();
        $objPurchase->cancelPendingOrder(PENDING_ORDER_CANCEL_FLAG);

		// 顧客IDを取得
        $objCustomer = new SC_Customer_Ex();
        $customer_id = $objCustomer->getValue('customer_id');

		// ポストデータ取得  ここから追記
		$objFormParam = new SC_FormParam_Ex();
		// パラメーター情報の初期化を行うメソッド。のちほど用意
		$this->lfInitParam($objFormParam); 
		$objFormParam->setParam($_POST);
		$this->arrForm = $objFormParam->getFormParamList();

		$arrParam = $objFormParam->getHashArray();
		// 検索条件用のクエリを作成

		$where = 'del_flg = 0';
		$arrWhereVal = array();
		foreach ($arrParam as $key => $val) {
			if ($val == '') {
				continue;
			}
			//クエリを構築するメソッド。のちほど用意
			$this->buildQuery($key, $where, $arrWhereVal, $objFormParam);
		}
		//ここまで追記内容
		
        //ページ送り用
        $this->objNavi = new SC_PageNavi_Ex($_REQUEST['pageno'],
                                            $this->lfGetOrderHistory($customer_id, $where, $arrWhereVal), //add
                                            SEARCH_PMAX,
                                            'eccube.movePage',
                                            NAVI_PMAX,
                                            'pageno=#page#',
                                            SC_Display_Ex::detectDevice() !== DEVICE_TYPE_MOBILE);

        $this->arrOrder = $this->lfGetOrderHistory($customer_id, $where, $arrWhereVal, $this->objNavi->start_row); //add
     ・
     ・

【検索機能】パラメーターの初期化

パラメーター情報の初期化を行うために、「lfInitParam」メソッドを追加します。

public function lfInitParam(&$objFormParam)
{
	$objFormParam->addParam('担当者','search_person_in_charge',STEXT_LEN,'KVa',array('MAX_LENGTH_CHECK'));
}

【検索機能】クエリ用のメソッドを構築

LC_Page_Mypage_Exクラスに「buildQuery」メソッドを追加して、クエリを構築します。

クエリ、、つまりどんな内容で絞り込み検索するかを、データベース(DB)に命令してあげます。

「$key」に検索条件種が入ってきます。
今回の場合は「担当者」を「search_person_in_charge」としました。ちょっと長いので省略したかったのですが、「search_pic」とすると画像検索みたいでややこしいのでやめておきました。

public function buildQuery($key, &$where, &$arrValues, &$objFormParam)
{
	$dbFactory = SC_DB_DBFactory_Ex::getInstance();
	$key = 'search_person_in_charge';
	$where .= ' AND EXISTS (SELECT 1 FROM dtb_order_detail od WHERE od.order_id = dtb_order.order_id AND dtb_order.person_in_charge LIKE ?)';
	$arrValues[] = sprintf('%%%s%%', $objFormParam->getValue($key));
}

ちなみに検索条件が複数ある場合は、swicth文を使用すればいいと思います。

switch ($key) {
 case '〇〇':
break;
     ・
     ・
 default:
 break;
 }

【検索機能】受注履歴取得のメソッドをカスタマイズ

検索条件を反映させた一覧を再表示させる必要があるため、「lfGetOrderHistoryメソッド」を編集します。

	public function lfGetOrderHistory($customer_id, $where, $arrWhereVal, $startno = -1)
	{
 	
		$objQuery   = SC_Query_Ex::getSingletonInstance();
 		$col = 'order_id, create_date, payment_id, payment_total, status, person_in_charge';
		$from = 'dtb_order';
 		if($where){
 			$where .= ' AND customer_id = ?';
 		}else{
 			$where = 'customer_id = ?';
 		}
 		$arrWhereVal[] = $customer_id;
		$order  = 'order_id DESC';

        if ($startno == -1) {
            return $objQuery->count($from, $where, $arrWhereVal);
        }

        $objQuery->setLimitOffset(SEARCH_PMAX, $startno);

        // 表示順序
        $objQuery->setOrder($order);

        //購入履歴の取得
        return $objQuery->select($col, $from, $where, $arrWhereVal);
    }

【検索機能】フォームを追加

前述した「search_person_in_charge」を「$key」に渡すようにフォームを用意します。

「data/Smarty/templates/default/mypage/index.tpl」にフォームを追加

<form name="search_form" id="search_form" method="post" action="?">
	<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
	<input type="hidden" name="mode" value="search" />
	<h4>担当者検索</h4>
	<!--{* 検索条件設定テーブルここから *}-->
	<!--{assign var=key value="search_person_in_charge"}-->
	<!--{if $arrErr[$key]}--><span class="attention"><!--{$arrErr[$key]}--></span><!--{/if}-->
	<input type="text" name="<!--{$key}-->" value="<!--{$arrForm[$key].value|h}-->" maxlength="<!--{$arrForm[$key].length}-->" style="" size="10" class="box30" />
	<div class="btn">
		<div class="btn-area">
			<ul>
				<li><a class="btn-action" href="javascript:;" onclick="eccube.fnFormModeSubmit('search_form', 'search', '', ''); return false;"><span class="btn-next">検索</span></a></li>
			</ul>
		</div>
	</div>
	<!--検索条件設定テーブルここまで-->
</form>

【追記】エラーが起きたので修正

私の環境だからかもしれませんが、担当者で絞り込みした時にはページ送りが上手くいっていない事に気が付きました。

原因は「検索用」と「ページ送り用」のフォームが別々に設置されていたからみたい。

ページ送りに必要そうな

<input type="hidden" name="pageno" value="<!--{$objNavi->nowpage}-->" />

この部分が検索のformと別のところに記載してあったので、検索用にページ送りしてもらえなかったのだと思います。
「form」タグを1つにまとめる事で対応しました。

<form name="form1" id="form1" method="post" action="?">//form1に変更
	<input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
	<input type="hidden" name="order_id" value="" />//必要かわからないけど追加
	<input type="hidden" name="pageno" value="" />//追加
	<input type="hidden" name="mode" value="search" />
     ・
     ・
 	<div class="btn-area">
		<ul>
			<li><a class="btn-action" href="javascript:;" onclick="eccube.fnFormModeSubmit('form1', 'search', '', ''); return false;">検索</span></a></li>//form1に変更
		</ul>
	</div>
     ・
     ・
	<div class="pagenumber_area">
		<!--▼ページナビ-->
			<!--{$objNavi->strnavi}-->
		<!--▲ページナビ-->
	</div>
 </form>

以上です!ほんと素人ですみません!