EC-CUBE(2.13)のMYページの購入履歴一覧に絞り込み検索機能を追加する方法

EC-CUBE(2.13)のMYページの購入履歴一覧に絞り込み検索機能を追加する方法です。今回は商品名または注文日で絞り検索できるようにカスタマイズします。

カスタマイズはLC_Page_Mypage_Exクラスで行います。

まずは、LC_Page_Mypage_Exクラスに以下のinitメソッドを追加して、LC_Page_Mypageクラスのinitメソッドに処理を追加します。

/**
 * Page を初期化する.
 *
 * @return void
 */
public function init()
{
    parent::init();

    $masterData = new SC_DB_MasterData_Ex();
    $this->arrPageMax = $masterData->getMasterData('mtb_page_max');

    $objDate = new SC_Date_Ex();
    // 登録・更新日検索用
    $objDate->setStartYear(RELEASE_YEAR);
    $objDate->setEndYear(DATE('Y'));
    $this->arrRegistYear = $objDate->getYear();
    // 月日の設定
    $this->arrMonth = $objDate->getMonth();
    $this->arrDay = $objDate->getDay();
}

次に、LC_Page_Mypage_Exクラスに以下のactionメソッドを追加して、LC_Page_Mypageクラスのactionメソッドを上書きします。

/**
 * Page のAction.
 *
 * @return void
 */
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();

	// ポストデータのエラーチェック
	$objFormParam->convParam();
	$objFormParam->trimParam();
	// 入力内容のチェックを行うメソッド。のちほど用意
	$this->arrErr = $this->lfCheckError($objFormParam); 
	$arrParam = $objFormParam->getHashArray();

	// エラーがなければ検索条件用のクエリを作成
	if (count($this->arrErr) == 0) {
		$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),
						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);

	// 以下はデフォルトのまま
	switch ($this->getMode()) {
		case 'getList':
		echo SC_Utils_Ex::jsonEncode($this->arrOrder);
		SC_Response_Ex::actionExit();
		break;
		default:
		break;
	}
	// 支払い方法の取得
	$this->arrPayment = SC_Helper_Payment_Ex::getIDValueList();
	// 1ページあたりの件数
	$this->dispNumber = SEARCH_PMAX;

	$this->json_payment = SC_Utils::jsonEncode($this->arrPayment);
	$this->json_customer_order_status = SC_Utils::jsonEncode($this->arrCustomerOrderStatus);
}

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

/**
 * パラメーター情報の初期化を行う.
 *
 * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
 * @return void
 */
public function lfInitParam(&$objFormParam)
{
	$objFormParam->addParam('商品名','search_product_name',STEXT_LEN,'KVa',array('MAX_LENGTH_CHECK'));
X_LENGTH_CHECK'));
	$objFormParam->addParam('表示件数', 'search_page_max', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	// 購入日時
	$objFormParam->addParam('開始年', 'search_sorderyear', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('開始月', 'search_sordermonth', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('開始日', 'search_sorderday', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('終了年', 'search_eorderyear', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('終了月', 'search_eordermonth', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
	$objFormParam->addParam('終了日', 'search_eorderday', INT_LEN, 'n', array('MAX_LENGTH_CHECK', 'NUM_CHECK'));
}

入力内容のチェックを行うために、LC_Page_Mypage_Exクラスに以下のlfGetOrderHistoryメソッドを追加します。

/**
 * 入力内容のチェックを行う.
 *
 * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
 * @return void
 */
public function lfCheckError(&$objFormParam)
{
	$objErr = new SC_CheckError_Ex($objFormParam->getHashArray());
	$objErr->arrErr = $objFormParam->checkError();

	// 購入日時
	$objErr->doFunc(array('開始', 'search_sorderyear', 'search_sordermonth', 'search_sorderday'), array('CHECK_DATE'));
	$objErr->doFunc(array('終了', 'search_eorderyear', 'search_eordermonth', 'search_eorderday'), array('CHECK_DATE'));
	$objErr->doFunc(array('開始', '終了', 'search_sorderyear', 'search_sordermonth', 'search_sorderday', 'search_eorderyear', 'search_eordermonth', 'search_eorderday'), array('CHECK_SET_TERM'));
	return $objErr->arrErr;
}

クエリを構築するために、LC_Page_Mypage_Exクラスに以下のbuildQueryメソッドを追加します。

/**
 * クエリを構築する.
 *
 * 検索条件のキーに応じた WHERE 句と, クエリパラメーターを構築する.
 * クエリパラメーターは, SC_FormParam の入力値から取得する.
 *
 * 構築内容は, 引数の $where 及び $arrValues にそれぞれ追加される.
 *
 * @param  string   $key  検索条件のキー
 * @param  string   $where構築する WHERE 句
 * @param  array$arrValues構築するクエリパラメーター
 * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
 * @return void
 */
public function buildQuery($key, &$where, &$arrValues, &$objFormParam)
{
	$dbFactory = SC_DB_DBFactory_Ex::getInstance();
	switch ($key) {
		case 'search_product_name':
			$where .= ' AND EXISTS (SELECT 1 FROM dtb_order_detail od WHERE od.order_id = dtb_order.order_id AND od.product_name LIKE ?)';
			$arrValues[] = sprintf('%%%s%%', $objFormParam->getValue($key));
			break;
		case 'search_sorderyear':
			$date = SC_Utils_Ex::sfGetTimestamp($objFormParam->getValue('search_sorderyear'),
			$objFormParam->getValue('search_sordermonth'),
			$objFormParam->getValue('search_sorderday'));
			$where.= ' AND create_date >= ?';
			$arrValues[] = $date;
			break;
		case 'search_eorderyear':
			$date = SC_Utils_Ex::sfGetTimestamp($objFormParam->getValue('search_eorderyear'),
			$objFormParam->getValue('search_eordermonth'),
			$objFormParam->getValue('search_eorderday'), true);
			$where.= ' AND create_date <= ?';
			$arrValues[] = $date;
			break;
		default:
			break;
	}
}

最後に、受注履歴を取得するメソッドをカスタマイズするため、LC_Page_Mypage_Exクラスに以下のlfGetOrderHistoryメソッドを追加して、LC_Page_MypageクラスのlfGetOrderHistoryメソッドを上書きします。

/**
 * 受注履歴を返す
 *
 * @param mixed $customer_id
 * @param mixed $startno 0以上の場合は受注履歴を返却する -1の場合は件数を返す
 * @access private
 * @return void
 */
public function lfGetOrderHistory($customer_id, $where, $arrWhereVal, $startno = -1)
{
	$objQuery   = SC_Query_Ex::getSingletonInstance();

	$col = <<< __EOS__
				order_id,
				create_date,
				payment_id,
				payment_total,
				status
__EOS__;
	$from = <<< __EOS__
				dtb_order
__EOS__;
			if($where){
				$where .= <<< __EOS__
					AND customer_id = ?
__EOS__;
			}else{
				$where = <<< __EOS__
					customer_id = ?
__EOS__;
			}

	$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);
}

以上で購入履歴一覧に絞り込み検索機能が実装完了です。

あとは、購入履歴一覧テンプレートに以下のフォームを追加するだけです。

<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" />
	<h2>検索条件設定</h2>
	<!--{* 検索条件設定テーブルここから *}-->
	<table>
		<tr>
			<th>商品名</th>
			<td>
				<!--{assign var=key value="search_product_name"}-->
				<!--{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="<!--{$arrErr[$key]|sfGetErrorColor}-->" size="30" class="box30" />
			</td>
		</tr>
		<tr>
			<th>購入日時</th>
			<td colspan="3">
				<!--{if $arrErr.search_sorderyear}--><span class="attention"><!--{$arrErr.search_sorderyear}--></span><!--{/if}-->
				<!--{if $arrErr.search_eorderyear}--><span class="attention"><!--{$arrErr.search_eorderyear}--></span><!--{/if}-->
				<select name="search_sorderyear" style="<!--{$arrErr.search_sorderyear|sfGetErrorColor}-->">
				<option value="">----</option>
				<!--{html_options options=$arrRegistYear selected=$arrForm.search_sorderyear.value}-->
				</select>年
				<select name="search_sordermonth" style="<!--{$arrErr.search_sorderyear|sfGetErrorColor}-->">
				<option value="">--</option>
				<!--{html_options options=$arrMonth selected=$arrForm.search_sordermonth.value}-->
				</select>月
				<select name="search_sorderday" style="<!--{$arrErr.search_sorderyear|sfGetErrorColor}-->">
				<option value="">--</option>
				<!--{html_options options=$arrDay selected=$arrForm.search_sorderday.value}-->
				</select>日~
				<select name="search_eorderyear" style="<!--{$arrErr.search_eorderyear|sfGetErrorColor}-->">
				<option value="">----</option>
				<!--{html_options options=$arrRegistYear selected=$arrForm.search_eorderyear.value}-->
				</select>年
				<select name="search_eordermonth" style="<!--{$arrErr.search_eorderyear|sfGetErrorColor}-->">
				<option value="">--</option>
				<!--{html_options options=$arrMonth selected=$arrForm.search_eordermonth.value}-->
				</select>月
				<select name="search_eorderday" style="<!--{$arrErr.search_eorderyear|sfGetErrorColor}-->">
				<option value="">--</option>
				<!--{html_options options=$arrDay selected=$arrForm.search_eorderday.value}-->
			</select>日
		</td>
		</tr>
	</table>

	<div class="btn">
		<p class="page_rows">検索結果表示件数
		<!--{assign var=key value="search_page_max"}-->
		<span class="attention"><!--{$arrErr[$key]}--></span>
		<select name="<!--{$arrForm[$key].keyname}-->" style="<!--{$arrErr[$key]|sfGetErrorColor}-->">
		<!--{html_options options=$arrPageMax selected=$arrForm[$key].value}-->
		</select> 件</p>
		<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>

 

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

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