Quantcast
Channel: EC-CUBE アーカイブ - あずみ.net
Viewing all 271 articles
Browse latest View live

EC-CUBE(2.13)で会員ログイン後の画面遷移をトップページに固定する

$
0
0

クローズドサイトプラグインを使ってEC-CUBE(2.13)でクローズド通販サイトを作った時のメモ。

クローズドサイトプラグインを使った場合、未ログインユーザーがアクセスするとログインページにリダイレクトされます。そしてログインページでログインをするとマイページが表示されます。

通常の通販サイトですとこれで良いと思いますが、今回クローズドサイトを作っているのでログイン後の画面遷移をトップページ変更しました。

変更方法は以下の通りです。

LC_Page_Mypage_Login_Exクラスに以下のメソッドを追加。

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

    // ログインページから画面遷移の場合はトップページへ
    if ($this->lfCheckReferer()) {
        SC_Response_Ex::sendRedirect(TOP_URL);			
    }else{
        SC_Response_Ex::sendRedirect(DIR_INDEX_PATH);
    }
}

/**
 * login.php からの遷移の妥当性をチェックする
 *
 * 以下の内容をチェックし, 妥当であれば true を返す.
 * 1. ログインページからの遷移かどうか
 * 2. PC及びスマートフォンかどうか
 *
 * @access protected
 * @return boolean login.php からの妥当な遷移であれば true
 */
public function lfCheckReferer()
{
    $arrRefererParseUrl = parse_url($_SERVER['HTTP_REFERER']);
    $referer_urlpath = $arrRefererParseUrl['path'];

    $login_urlpath = ROOT_URLPATH . 'mypage/login.php';

    $allowed_urlpath = array(
        $login_urlpath,
    );

    if (SC_Display_Ex::detectDevice() !== DEVICE_TYPE_MOBILE
        && !in_array($referer_urlpath, $allowed_urlpath)) {
        return false;
    }

    return true;
}

これでログイン後、トップページへ画面遷移されるようになります。

 


EC-CUBE(2.13)で注文フォームの入力項目を増やす方法

$
0
0

EC-CUBE(2.13)で注文フォームの入力項目を増やす方法です。

まずは、以下のテーブルに追加項目のカラムを追加します。

  • dtb_order
  • dtb_order_temp

LC_Page_Shopping_Payment_Exクラスに以下のコードを追加します。

/**
   * パラメーター情報の初期化を行う.
   *
   * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
   * @param  boolean      $deliv_only   必須チェックは deliv_id のみの場合 true
   * @param  array        $arrShipping  配送先情報の配列
   * @return void
   */
 public function lfInitParam(&$objFormParam, $deliv_only, &$arrShipping)
 {
    parent::lfInitParam($objFormParam, $deliv_only, $arrShipping);
    // 以下のように項目を追加して下さい。
    $objFormParam->addParam('追加項目名', '追加項目カラム名', LTEXT_LEN, 'KVa', array('SPTAB_CHECK', 'MAX_LENGTH_CHECK'));
 
    $objFormParam->setParam($arrShipping);
    $objFormParam->convParam();
}

$objFormParam->addParam()に項目を追加していくだけです。

あとはpayment.tplなど関連するテンプレートに項目を追加して下さい。

EC-CUBE(2.13)の入力フォームのエラーチェックで数字とカナのみ許可を追加する方法

$
0
0

EC-CUBE(2.13)の入力フォームのエラーチェックで数字とカナのみ許可を追加する方法です。

まずは、SC_CheckError_Exクラスに以下のメソッドを追加。

/* カタカナと数字は許可する */
 // 入力文字がカナと数字以外ならエラーを返す
 // value[0] = 項目名 value[1] = 判定対象文字列
public function KANANUM_CHECK($value)
{
    if (isset($this->arrErr[$value[1]])) {
        return;
    }
    $this->createParam($value);
    if (strlen($this->arrParam[$value[1]]) > 0 && !preg_match("/^([0-9]|[ァ-ヶ]|[ー])+$/u", $this->arrParam[$value[1]])) {
        $this->arrErr[$value[1]] = '※ ' . $value[0] . 'はカタカナと数字で入力してください。<br />';
    }
}

次に、SC_FormParam_Exクラスに以下のメソッドを追加して下さい。

以下のコードでは、case文に上記で作成したメソッドのメソッド名(KANANUM_CHECK)を追加しています。

public function checkError($br = true)
{
    $arrErr = array();

    foreach ($this->keyname as $index => $key) {
        foreach ($this->arrCheck[$index] as $func) {
            $value = $this->getValue($key);
            switch ($func) {
                case 'KANANUM_CHECK': // メソッド名を追加
                case 'EXIST_CHECK':
                case 'NUM_CHECK':
                case 'EMAIL_CHECK':
                case 'EMAIL_CHAR_CHECK':
                case 'ALNUM_CHECK':
                case 'GRAPH_CHECK':
                case 'KANA_CHECK':
                case 'URL_CHECK':
                case 'IP_CHECK':
                case 'SPTAB_CHECK':
                case 'ZERO_CHECK':
                case 'ALPHA_CHECK':
                case 'ZERO_START':
                case 'FIND_FILE':
                case 'NO_SPTAB':
                case 'DIR_CHECK':
                case 'DOMAIN_CHECK':
                case 'FILE_NAME_CHECK':
                case 'MOBILE_EMAIL_CHECK':
                case 'MAX_LENGTH_CHECK':
                case 'MIN_LENGTH_CHECK':
                case 'NUM_COUNT_CHECK':
                case 'KANABLANK_CHECK':
                case 'SELECT_CHECK':
                case 'FILE_NAME_CHECK_BY_NOUPLOAD':
                case 'NUM_POINT_CHECK':
                    $this->recursionCheck($this->disp_name[$index], $func,
                        $value, $arrErr, $key, $this->length[$index]);
                    break;
                // 小文字に変換
                case 'CHANGE_LOWER':
                    $this->toLower($key);
                    break;
                // ファイルの存在チェック
                case 'FILE_EXISTS':
                    if ($value != '' && !file_exists($this->check_dir . $value)) {
                        $arrErr[$key] = '※ ' . $this->disp_name[$index] . 'のファイルが存在しません。<br>';
                    }
                    break;
                // ダウンロード用ファイルの存在チェック
                case 'DOWN_FILE_EXISTS':
                    if ($value != '' && !file_exists(DOWN_SAVE_REALDIR . $value)) {
                        $arrErr[$key] = '※ ' . $this->disp_name[$index] . 'のファイルが存在しません。<br>';
                    }
                    break;
                default:
                    $arrErr[$key] = "※※ エラーチェック形式($func)には対応していません ※※ <br>";
                    break;
            }
        }

        if (isset($arrErr[$key]) && !$br) {
            $arrErr[$key] = preg_replace("/<br(s+/)?>/i", '', $arrErr[$key]);
        }
    }

    return $arrErr;
}

あとは、以下のようにaddParamメソッドで設定すれば適用されます。

$objFormParam->addParam('カナと数字', 'kana01', STEXT_LEN, 'CKV', array('EXIST_CHECK', 'NO_SPTAB', 'SPTAB_CHECK' ,'MAX_LENGTH_CHECK', 'KANANUM_CHECK'));

 

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

$
0
0

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>

 

EC-CUBE(2.13)の管理者ページの売上集計に購入者別集計を追加する方法

$
0
0

EC-CUBE(2.13)の管理者ページの売上集計に購入者別集計を追加する方法です。

まずはLC_Page_Admin_Total_Exクラスを編集します。

initメソッドを編集

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

	$this->arrTitle['customer']   = '購入者別集計';
}

actionメソッドを追加

/**
  * Page のアクション.
  *
  * @return void
  */
public function action()
{
	parent::action();
}

購入者別集計を行うlfGetOrderCustomerメソッドを追加

/** 購入者別集計 **/
public function lfGetOrderCustomer($type, $sdate, $edate)
{
	$objQuery = SC_Query_Ex::getSingletonInstance();

	list($where, $arrWhereVal) = $this->lfGetWhereMember('create_date', $sdate, $edate, $type);

	$where .= ' AND del_flg = 0 AND status <> ?';
	$arrWhereVal[] = ORDER_CANCEL;

	// 会員集計の取得(MySQLの場合)
	$col = <<< __EOS__
				CONCAT(order_name01, order_name02) AS order_name,
				COUNT(order_id) AS order_count,
				SUM(total) AS total,
				AVG(total) AS total_average
__EOS__;

	/* 会員集計の取得(PostgreSQLの場合)
	$col = <<< __EOS__
				(order_name01 || order_name02) AS order_name,
				COUNT(order_id) AS order_count,
				SUM(total) AS total,
				AVG(total) AS total_average
__EOS__;
	*/

	$from   = 'dtb_order';

	$objQuery->setGroupBy('customer_id, order_name01, order_name02');

	$arrTotalResults = $objQuery->select($col, $from, $where, $arrWhereVal);

	$tpl_image = $this->lfGetGraphPie($arrTotalResults, 'order_name', 'customer', '(売上比率)', $sdate, $edate);

	return array($arrTotalResults, $tpl_image);
}

これで購入者別集計の処理が完了です。

あとはテンプレートの設定を行います。

売上集計タブ(subnavi.tpl)に購入者別集計リンクを追加

<ul class="level1">
    <li id="navi-total-term"
        class="<!--{if ($tpl_mainno == 'total' && ($arrForm.page.value == 'term' || $arrForm.page.value == ''))}-->on<!--{/if}-->"
    ><a href="<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->total/<!--{$smarty.const.DIR_INDEX_PATH}-->?page=term"><span>期間別集計</span></a></li>
    <li id="navi-total-products"
        class="<!--{if ($tpl_mainno == 'total' && $arrForm.page.value == 'products')}-->on<!--{/if}-->"
    ><a href="<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->total/<!--{$smarty.const.DIR_INDEX_PATH}-->?page=products"><span>商品別集計</span></a></li>
    <li id="navi-total-products"
        class="<!--{if ($tpl_mainno == 'total' && $arrForm.page.value == 'customer')}-->on<!--{/if}-->"
    ><a href="<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->total/<!--{$smarty.const.DIR_INDEX_PATH}-->?page=customer"><span>購入者別集計</span></a></li>
    <li id="navi-total-age"
        class="<!--{if ($tpl_mainno == 'total' && $arrForm.page.value == 'age')}-->on<!--{/if}-->"
    ><a href="<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->total/<!--{$smarty.const.DIR_INDEX_PATH}-->?page=age"><span>年代別集計</span></a></li>
    <li id="navi-total-job"
        class="<!--{if ($tpl_mainno == 'total' && $arrForm.page.value == 'job')}-->on<!--{/if}-->"
    ><a href="<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->total/<!--{$smarty.const.DIR_INDEX_PATH}-->?page=job"><span>職業別集計</span></a></li>
    <li id="navi-total-member"
        class="<!--{if ($tpl_mainno == 'total' && $arrForm.page.value == 'member')}-->on<!--{/if}-->"
    ><a href="<!--{$smarty.const.ROOT_URLPATH}--><!--{$smarty.const.ADMIN_DIR}-->total/<!--{$smarty.const.DIR_INDEX_PATH}-->?page=member"><span>会員別集計</span></a></li>
</ul>

page_customer.tplを追加

ファイルの設置場所は以下のとおりです。

data/Smarty/templates/admin/total/page_customer.tpl

<table id="total-member" class="list">
    <tr>
        <th>購入者</th>
        <th>購入件数</th>
        <th>購入合計</th>
        <th>購入平均</th>
    </tr>

    <!--{section name=cnt loop=$arrResults}-->
        <!--{* 色分け判定 *}-->
        <!--{assign var=type value="`$smarty.section.cnt.index%2`"}-->
        <!--{if $type == 0}-->
            <!--{* 偶数行 *}-->
            <!--{assign var=color value="even"}-->
        <!--{else}-->
            <!--{* 奇数行 *}-->
            <!--{assign var=color value="odd"}-->
        <!--{/if}-->

        <tr class="<!--{$color}-->">
            <td class="center"><!--{*区分*}--><!--{$arrResults[cnt].order_name}--></td>
            <td class="right"><!--{*購入件数*}--><!--{$arrResults[cnt].order_count}-->件</td>
            <td class="right"><!--{*購入合計*}--><!--{$arrResults[cnt].total|number_format}-->円</td>
            <td class="right"><!--{*購入平均*}--><!--{$arrResults[cnt].total_average|number_format}-->円</td>
        </tr>
    <!--{/section}-->

    <tr>
        <th>購入者</th>
        <th>購入件数</th>
        <th>購入合計</th>
        <th>購入平均</th>
    </tr>
</table>

以上です。

EC-CUBE(2.13)のマイページで問い合せ履歴を表示する方法

$
0
0

お問い合わせ管理プラグインをインストールすると、EC-CUBEで問い合わせが管理できます。このプラグインを利用して、会員のマイページでも問い合わせ履歴を確認できるようにしてみました。

まず、会員毎の問い合わせ履歴を取得するクラスを以下の場所に用意します。

data/class/pages/mypage/LC_Page_Mypage_Contact.php

require_once CLASS_EX_REALDIR . 'page_extends/mypage/LC_Page_AbstractMypage_Ex.php';

/**
 * MyPage のページクラス.
 *
 * @package Page
 * @author LOCKON CO.,LTD.
 * @version $Id: LC_Page_Mypage.php 23230 2013-09-19 02:49:03Z m_uehara $
 */
class LC_Page_Mypage_Contact extends LC_Page_AbstractMypage_Ex
{
    /** ページナンバー */
    public $tpl_pageno;

    /**
     * Page を初期化する.
     *
     * @return void
     */
    public function init()
    {
        parent::init();
        $this->tpl_subtitle = 'お問い合わせ履歴';
        $this->tpl_mypageno = 'contact';
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    public function process()
    {
        parent::process();
    }

    /**
     * Page のAction.
     *
     * @return void
     */
    public function action()
    {
        $objCustomer = new SC_Customer_Ex();

        $customer_id = $objCustomer->getValue('customer_id');

        //ページ送り用
        $this->objNavi = new SC_PageNavi_Ex($_REQUEST['pageno'],
                                            $this->lfGetContacts($customer_id),
                                            SEARCH_PMAX,
                                            'eccube.movePage',
                                            NAVI_PMAX,
                                            'pageno=#page#',
                                            SC_Display_Ex::detectDevice() !== DEVICE_TYPE_MOBILE);

		$this->arrContact = $this->lfGetContacts($customer_id, $this->objNavi->start_row);
        // 1ページあたりの件数
        $this->dispNumber = SEARCH_PMAX;

		//対応状況マスターデータ
        $masterData = new SC_DB_MasterData_Ex();
        $this->arrCONTACTSTATUS = $masterData->getMasterData("mtb_plg_ContactReply_status");
    }

    /**
     * お問い合わせを取得する
     *
     * @param mixed $customer_id
     * @param mixed $objPage
     * @access private
     * @return array お問い合わせ一覧
     */
    function lfGetContacts($customer_id, $startno = -1)
	{
        $objQuery =& SC_Query_Ex::getSingletonInstance();

        $col = <<< __EOS__
			*
__EOS__;

        $from = <<< __EOS__
			plg_ContactReply_contact
__EOS__;

		$where = <<< __EOS__
				customer_id = ?
				AND del_flg = 0
__EOS__;

        $arrWhereVal[] = $customer_id;
        $order      = 'contact_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);
    }
}

次に、LC_Page_Mypage_Contactの拡張クラスを以下の場所に用意します。

data/class_extends/pages_extends/mypage/LC_Page_Mypage_Contact_EX.php

require_once CLASS_REALDIR . 'pages/mypage/LC_Page_Mypage_Contact.php';

/**
 * 購入履歴 のページクラス(拡張).
 *
 * LC_Page_Mypage_Contact をカスタマイズする場合はこのクラスを編集する.
 *
 * @package Page
 * @author LOCKON CO.,LTD.
 * @version $Id: LC_Page_Mypage_Contact_Ex.php 22926 2013-06-29 16:24:23Z Seasoft $
 */
class LC_Page_Mypage_Contact_Ex extends LC_Page_Mypage_Contact
{
    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init()
    {
        parent::init();
    }

    /**
     * Page のプロセス.
     *
     * @return void
     */
    function process()
    {
        parent::process();
    }
}

問い合わせ履歴一覧ページのテンプレートを以下の場所に用意します。

data/Smarty/templates/default/mypage/contact.tpl

<div id="mypagecolumn">
    <h2 class="title"><!--{$tpl_title|h}--></h2>
    <!--{if $tpl_navi != ""}-->
        <!--{include file=$tpl_navi}-->
    <!--{else}-->
        <!--{include file=`$smarty.const.TEMPLATE_REALDIR`mypage/navi.tpl}-->
    <!--{/if}-->

    <div id="mycontents_area">
        <form name="form1" id="form1" method="post" action="?">
            <input type="hidden" name="<!--{$smarty.const.TRANSACTION_ID_NAME}-->" value="<!--{$transactionid}-->" />
            <input type="hidden" name="pageno" value="<!--{$objNavi->nowpage}-->" />
            <h3><!--{$tpl_subtitle|h}--></h3>

            <!--{if $objNavi->all_row > 0}-->

                <p><span class="attention"><!--{$objNavi->all_row}-->件</span>のお問い合わせがあります。</p>
                <div class="pagenumber_area">
                    <!--▼ページナビ-->
                    <!--{$objNavi->strnavi}-->
                    <!--▲ページナビ-->
                </div>

                <table summary="お問い合わせ履歴">
                    <col width="15%" />
                    <col width="70%" />
                    <col width="15%" />
                    <tr>
                        <th class="alignC">送信日時</th>
                        <th class="alignC">内容</th>
                        <th class="alignC">対応状況</th>
                    </tr>
                    <!--{section name=cnt loop=$arrContact}-->
						<!--{assign var=contact_id value=$arrContact[cnt].contact_id}-->
						<!--{assign var=status value=$arrContact[cnt].status}-->
                        <tr>
                            <td class="alignC"><!--{$arrContact[cnt].create_date|sfDispDBDate:false}--></td>
                            <td class="alignL"><!--{$arrContact[cnt].contents|escape|nl2br}--></td>
                            <td class="alignC"><!--{$arrCONTACTSTATUS[$status]}--></td>
                        </tr>
                    <!--{/section}-->
                </table>

            <!--{else}-->
                <p>お問い合わせ履歴はありません。</p>
            <!--{/if}-->
        </form>
    </div>
</div>

マイページのグローバルナビゲーションにもお問い合せ履歴を追加します。

data/Smarty/templates/default/mypage/navi.tpl

<div id="mynavi_area">
    <!--{strip}-->
        <ul class="mynavi_list clearfix">

            <!--{* 会員状態 *}-->
            <!--{if $tpl_login}-->
                <li><a href="./<!--{$smarty.const.DIR_INDEX_PATH}-->" class="<!--{if $tpl_mypageno == 'index'}--> selected<!--{/if}-->">
                    購入履歴一覧</a></li>
                <!--{if $smarty.const.OPTION_FAVORITE_PRODUCT == 1}-->
                    <li><a href="favorite.php" class="<!--{if $tpl_mypageno == 'favorite'}--> selected<!--{/if}-->">
                        お気に入り一覧</a></li>
                <!--{/if}-->
                <li><a href="contact.php" class="<!--{if $tpl_mypageno == 'contact'}--> selected<!--{/if}-->">
                    お問い合わせ履歴</a></li>
                <li><a href="change.php" class="<!--{if $tpl_mypageno == 'change'}--> selected<!--{/if}-->">
                    会員登録内容変更</a></li>
                <li><a href="delivery.php" class="<!--{if $tpl_mypageno == 'delivery'}--> selected<!--{/if}-->">
                    お届け先追加・変更</a></li>
                <li><a href="refusal.php" class="<!--{if $tpl_mypageno == 'refusal'}--> selected<!--{/if}-->">
                    退会手続き</a></li>

            <!--{* 退会状態 *}-->
            <!--{else}-->
                <li><a href="<!--{$smarty.const.TOP_URL}-->" class="<!--{if $tpl_mypageno == 'index'}--> selected<!--{/if}-->">
                    購入履歴一覧</a></li>
                <!--{if $smarty.const.OPTION_FAVORITE_PRODUCT == 1}-->
                    <li><a href="<!--{$smarty.const.TOP_URL}-->" class="<!--{if $tpl_mypageno == 'favorite'}--> selected<!--{/if}-->">
                        お気に入り一覧</a></li>
                <!--{/if}-->
                <li><a href="<!--{$smarty.const.TOP_URL}-->" class="<!--{if $tpl_mypageno == 'change'}--> selected<!--{/if}-->">
                    会員登録内容変更</a></li>
                <li><a href="<!--{$smarty.const.TOP_URL}-->" class="<!--{if $tpl_mypageno == 'delivery'}--> selected<!--{/if}-->">
                    お届け先追加・変更</a></li>
                <li><a href="<!--{$smarty.const.TOP_URL}-->" class="<!--{if $tpl_mypageno == 'refusal'}--> selected<!--{/if}-->">
                    退会手続き</a></li>
            <!--{/if}-->
        </ul>

        <!--▼現在のポイント-->
        <!--{if $point_disp !== false}-->
            <div class="point_announce clearfix">
                <p>ようこそ&nbsp;/&nbsp;
                    <span class="user_name"><!--{$CustomerName1|h}--> <!--{$CustomerName2|h}-->様</span>
                    <!--{if $smarty.const.USE_POINT !== false}-->&nbsp;
                        現在の所持ポイントは&nbsp;<span class="point st"><!--{$CustomerPoint|number_format|default:"0"|h}-->pt</span>&nbsp;です。
                    <!--{/if}-->
                </p>
            </div>
        <!--{/if}-->
        <!--▲現在のポイント-->
    <!--{/strip}-->

</div>
<!--▲NAVI-->

最後にデータベースに以下のデータを追加すれば完了です。

SET @page_id = (SELECT page_id FROM dtb_pagelayout WHERE device_type_id = 10 ORDER BY page_id DESC LIMIT 1);
INSERT INTO dtb_pagelayout (device_type_id, page_id, page_name, url, filename, header_chk, footer_chk, edit_flg, author, description, keyword, update_url, create_date, update_date, meta_robots) VALUES (10, (@page_id+1), 'お問い合わせ履歴', 'mypage/contact.php', 'mypage/contact', 1, 1, 2, NULL, NULL, NULL, NULL, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'noindex');

EC-CUBEってホント簡単に色々できますね。

 

 

コメントを頂いたので追記。

htmlフォルダに以下のファイルを作成する必要があるのをすっかり忘れていました。失礼しました。

html/mypage/contact.php

require_once '../require.php';
require_once CLASS_EX_REALDIR . 'page_extends/mypage/LC_Page_Mypage_Contact_Ex.php';

$objPage = new LC_Page_Mypage_Contact_Ex();
$objPage->init();
$objPage->process();

 

EC-CUBE(2.13)のパラメーター情報の初期化メソッドでフォームパラメーターの表示名を上書きする

$
0
0

EC-CUBE(2.13)のパラメーター情報の初期化メソッドでフォームパラメーターの表示名を上書きする方法です。

例えば、デフォルトでは「商品ID」と表記されますが、これを「製品ID」に変更します。

作業はシンプルで、変更が必要な各拡張クラスに以下のメソッドを追加するだけです。

/**
 * パラメーター情報の初期化を行う.
 *
 * @param  SC_FormParam $objFormParam SC_FormParam インスタンス
 * @return void
 */
public function lfInitParam(&$objFormParam)
{
    // 検索条件のパラメーターを初期化
    parent::lfInitParam($objFormParam);

    // 一旦product_idパラメーターを削除
    $objFormParam->removeParam('product_id');

    // product_idを追加
    $objFormParam->addParam('製品ID', 'product_id', INT_LEN, 'n', array('NUM_CHECK','EXIST_CHECK', 'MAX_LENGTH_CHECK'));
}

【EC-CUBE(2.13)】ユーザー権限によって管理画面のグローバルナビの表示項目を制限する

$
0
0

【EC-CUBE(2.13)】権限によって管理画面のグローバルナビの表示項目を制限する方法です。

EC-CUBEのデフォルトでは、ユーザー権限が「システム管理者」と「店舗オーナー」があります。

ユーザー権限が「システム管理者」では「基本情報管理」から「オーナーズストア」まですべての項目がグローバルナビに表示されますが、ユーザー権限を「店舗オーナー」に設定すると「システム設定」と「オーナーズストア」が表示されなくなります。

「店舗オーナー」権限の時グローバルナビからデザイン管理を非表示にしたい場合、以下のように追記すればOKです。

html/user_data/packages/admin/css/admin_contents.css

/* 権限 */
x-dummy,
.authority_1 #navi-basis-masterdata,
.authority_1 #navi-contents-file,
.authority_1 #navi-design-bloc,
.authority_1 #navi-design-template,
.authority_1 #navi-design-add,
.authority_1 #navi-system,
.authority_1 #navi-ownersstore 
.authority_1 #navi-design /* 追加:デザイン管理を非表示にする */
{
    /* display: none; --- IE で不具合 */
    border: none;
    width: 0;
    height: 0;
    overflow: hidden;
    visibility: hidden;
}

authority_1の数字の部分は権限のIDになります。

権限のIDは、システム設定>マスターデータ管理の「mtb_authority」のIDです。


【EC-CUBE(2.13)】関連商品登録の商品検索項目に商品コードを追加する

$
0
0

E(2.13)】関連商品登録の商品検索項目にはカテゴリと商品名のみですが、ここに商品コード検索項目を追加します。

継承クラスにメソッドを追加

以下の継承クラスにメソッドを追加して下さい。

data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_ProductSelect_Ex.php

public function lfGetProducts(&$objDb)
    {
        $where = 'del_flg = 0';
        $arrWhereVal = array();

        /* 入力エラーなし */
        foreach ($this->arrForm AS $key=>$val) {
            if ($val == '') continue;

            switch ($key) {
                case 'search_name':
                    $where .= ' AND name ILIKE ?';
                    $arrWhereVal[] = "%$val%";
                    break;
                case 'search_category_id':
                    list($tmp_where, $arrTmp) = $objDb->sfGetCatWhere($val);
                    if ($tmp_where != '') {
                        $where.= ' AND product_id IN (SELECT product_id FROM dtb_product_categories WHERE ' . $tmp_where . ')';
                        $arrWhereVal = array_merge((array) $arrWhereVal, (array) $arrTmp);
                    }
                    break;
                case 'search_product_code':
                    $where .= ' AND product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code LIKE ?)';
                    $arrWhereVal[] = "%$val%"; 
                    break;
                default:
                    break;
            }
        }

        $order = 'update_date DESC, product_id DESC ';

        $objQuery =& SC_Query_Ex::getSingletonInstance();
        // 行数の取得
        $linemax = $objQuery->count('dtb_products', $where, $arrWhereVal);
        $this->tpl_linemax = $linemax;              // 何件が該当しました。表示用

        // ページ送りの処理
        $page_max = SC_Utils_Ex::sfGetSearchPageMax($_POST['search_page_max']);

        // ページ送りの取得
        $objNavi = new SC_PageNavi_Ex($_POST['search_pageno'], $linemax, $page_max, 'eccube.moveSearchPage', NAVI_PMAX);
        $this->tpl_strnavi = $objNavi->strnavi;     // 表示文字列
        $startno = $objNavi->start_row;

        // 取得範囲の指定(開始行番号、行数のセット)
        $objQuery->setLimitOffset($page_max, $startno);
        // 表示順序
        $objQuery->setOrder($order);

        // 検索結果の取得
        // FIXME 商品コードの表示
        $arrProducts = $objQuery->select('*', SC_Product_Ex::alldtlSQL(), $where, $arrWhereVal);

        return $arrProducts;
    }

テンプレートを修正

以下のようにテンプレートを修正して下さい。

data/Smarty/templates/admin/products/product_select.tpl

<tr>
            <th>商品名</th>
            <td><input type="text" name="search_name" value="<!--{$arrForm.search_name|h}-->" size="35" class="box35" /></td>
        </tr>
		<!-- 商品コード項目を追加 -->
        <tr>
            <th>商品コード</th>
            <td><input type="text" name="search_product_code" value="<!--{$arrForm.search_product_code|h}-->" size="35" class="box35" /></td>
        </tr>
		<!-- /商品コード項目を追加 -->

以上です。

【EC-CUBE(2.13)】関連商品登録の検索項目に販売価格項目を追加する

$
0
0

【EC-CUBE(2.13)】関連商品登録の商品検索項目にはカテゴリと商品名のみですが、ここに販売価格検索項目を追加します。

継承クラスにメソッドを追加

以下の継承クラスにメソッドを追加して下さい。

data/class_extends/page_extends/admin/products/LC_Page_Admin_Products_ProductSelect_Ex.php

public function lfInitParam(&$objFormParam)
    {
        $objFormParam->addParam('カテゴリ', 'search_category_id', STEXT_LEN, 'n');
        $objFormParam->addParam('商品名', 'search_name', STEXT_LEN, 'KVa');
        $objFormParam->addParam('商品コード', 'search_product_code', STEXT_LEN, 'KVa');
        $objFormParam->addParam(SALE_PRICE_TITLE, 'search_product_price02', PRICE_LEN, 'n', array('EXIST_CHECK', 'NUM_CHECK', 'MAX_LENGTH_CHECK'));//追加
    }

    public function lfGetProducts(&$objDb)
    {
        $where = 'del_flg = 0';
        $arrWhereVal = array();

        /* 入力エラーなし */
        foreach ($this->arrForm AS $key=>$val) {
            if ($val == '') continue;
			
            switch ($key) {
                case 'search_name':
                    $where .= ' AND name ILIKE ?';
                    $arrWhereVal[] = "%$val%";
                    break;
                case 'search_category_id':
                    list($tmp_where, $arrTmp) = $objDb->sfGetCatWhere($val);
                    if ($tmp_where != '') {
                        $where.= ' AND product_id IN (SELECT product_id FROM dtb_product_categories WHERE ' . $tmp_where . ')';
                        $arrWhereVal = array_merge((array) $arrWhereVal, (array) $arrTmp);
                    }
                    break;
                case 'search_product_code':
                    $where .= ' AND product_id IN (SELECT product_id FROM dtb_products_class WHERE product_code LIKE ?)';
                    $arrWhereVal[] = "%$val%";
                    break;
                case 'search_product_price02': //販売価格帯検索処理を追加
                    if(empty($val[0]) && empty($val[1])) continue;
                    $where .= ' AND product_id IN (SELECT product_id FROM dtb_products_class WHERE price02 BETWEEN ? AND ? GROUP BY product_id)';
                    $arrWhereVal[] = (empty($val[0])) ? 0 : (int)$val[0];
                    $arrWhereVal[] = (empty($val[1])) ? 1000000 : (int)$val[1];
                    break;
                default:
                    break;
            }
        }

        $order = 'update_date DESC, product_id DESC ';

        $objQuery =& SC_Query_Ex::getSingletonInstance();
        // 行数の取得
        $linemax = $objQuery->count('dtb_products', $where, $arrWhereVal);
        $this->tpl_linemax = $linemax;              // 何件が該当しました。表示用

        // ページ送りの処理
        $page_max = SC_Utils_Ex::sfGetSearchPageMax($_POST['search_page_max']);

        // ページ送りの取得
        $objNavi = new SC_PageNavi_Ex($_POST['search_pageno'], $linemax, $page_max, 'eccube.moveSearchPage', NAVI_PMAX);
        $this->tpl_strnavi = $objNavi->strnavi;     // 表示文字列
        $startno = $objNavi->start_row;

        // 取得範囲の指定(開始行番号、行数のセット)
        $objQuery->setLimitOffset($page_max, $startno);
        // 表示順序
        $objQuery->setOrder($order);
		
        // 検索結果の取得
        // FIXME 商品コードの表示
        $arrProducts = $objQuery->select('*', SC_Product_Ex::alldtlSQL(), $where, $arrWhereVal);

        return $arrProducts;
    }

テンプレートを修正

以下のようにテンプレートを修正して下さい。

data/Smarty/templates/admin/products/product_select.tpl

<tr>
            <th>商品名</th>
            <td><input type="text" name="search_name" value="<!--{$arrForm.search_name|h}-->" size="35" class="box35" /></td>
        </tr>
        <!-- 販売価格帯項目を追加 -->
        <tr>
            <th>販売価格(下限)</th>
            <td><input type="text" name="search_product_price02[]" value="<!--{$arrForm.search_product_price02[0]|h}-->" size="35" class="box35" /></td>
        </tr>
        <tr>
            <th>販売価格(上限)</th>
            <td><input type="text" name="search_product_price02[]" value="<!--{$arrForm.search_product_price02[1]|h}-->" size="35" class="box35" /></td>
        </tr>
        <!-- /価格帯項目を追加 -->

以上です。

【EC-CUBE(2.13)】キャンセル処理以外でも使用ポイントを自動で返却させる方法

$
0
0

【EC-CUBE(2.13)】キャンセル処理以外でも使用ポイントを自動で返却させる方法です。

返品対応を把握するため受注管理の対応状況に返品処理を追加したのですが、返品処理に移動しても購入時にユーザーが使用したポイントが返却されなかったので以下のようにカスタマイズしました。

商品購入関連のヘルパークラスのポイント使用判定処理をカスタマイズ

カスタマイズファイルの場所は以下のとおりです。

data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php

以下のisUsePointメソッドを追加して下さい。

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

$
0
0

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

以上です。

【EC-CUBE2.13.1】EC-CUBE2.13.1で受注商品の数量変更を行うと異なる商品の数量が変更されるバグを修正する方法

$
0
0

【EC-CUBE2.13.1】EC-CUBE2.13.1の管理画面において受注商品の数量変更を行うと異なる商品の数量が変更されるバグを修正する方法です。

商品購入関連のヘルパークラスを修正する

商品購入関連ヘルパークラスの配送商品を取得する処理にバグがあるので、商品購入関連ヘルパーの拡張クラスに以下のメソッドを追加して下さい。

商品購入関連ヘルパーの拡張クラスの場所は以下のとおりです。

/data/class_extends/helper_extends/SC_Helper_Purchase_Ex.php

/**
     * 配送商品を取得する.
     *
     * @param  integer $order_id    受注ID
     * @param  integer $shipping_id 配送先ID
     * @param  boolean $has_detail  商品詳細も取得する場合 true
     * @return array   商品規格IDをキーにした配送商品の配列
     */
    public function getShipmentItems($order_id, $shipping_id, $has_detail = true)
    {
        $objQuery =& SC_Query_Ex::getSingletonInstance();
        $objProduct = new SC_Product_Ex();
        $arrResults = array();
		$objQuery->setOrder('order_detail_id');
		$arrItems = $objQuery->select('dtb_shipment_item.*',
										'dtb_shipment_item JOIN dtb_order_detail
											ON dtb_shipment_item.product_class_id = dtb_order_detail.product_class_id
											AND dtb_shipment_item.order_id = dtb_order_detail.order_id',
										'dtb_order_detail.order_id = ? AND shipping_id = ?',
										array($order_id, $shipping_id));

        foreach ($arrItems as $key => $arrItem) {
            $product_class_id = $arrItem['product_class_id'];

            foreach ($arrItem as $detailKey => $detailVal) {
                $arrResults[$key][$detailKey] = $detailVal;
            }
            // 商品詳細を関連づける
            if ($has_detail) {
                $arrResults[$key]['productsClass']
                    =& $objProduct->getDetailAndProductsClass($product_class_id);
            }
        }

        return $arrResults;
    }

以上です。

【EC-CUBE2.13】スマホからのアクセス以外の場合、トップページへリダイレクトさせる方法

$
0
0

【EC-CUBE2.13】スマホからのアクセスじゃなかった場合、トップページへリダイレクトさせる方法です。

if (SC_Display_Ex::detectDevice() != DEVICE_TYPE_SMARTPHONE) {
	SC_Response_Ex::sendRedirect(TOP_URL);
	SC_Response_Ex::actionExit();
}

 

【EC-CUBE2.13】商品ステータスで絞り込んで商品一覧を表示する方法

$
0
0

【EC-CUBE2.13】商品ステータスで絞り込んで商品一覧表示する方法です。

商品一覧ページクラスをカスタマイズ

編集するファイルは以下のとおりです。

data/class_extends/page_extends/products/LC_Page_Products_List_Ex.php

パラメーター情報に商品ステータスIDを追加

/**
 * パラメーター情報の初期化
 *
 * @param  SC_FormParam_Ex $objFormParam フォームパラメータークラス
 * @return void
 */
public function lfInitParam(&$objFormParam) {
	parent::lfInitParam($objFormParam);
	$objFormParam->addParam('商品ステータスID', 'product_status_id', INT_LEN, 'n', array('NUM_CHECK', 'MAX_LENGTH_CHECK'));
}

 検索条件を追加

/**
 * 検索条件のwhere文とかを取得
 *
 * @return array
 */
public function lfGetSearchCondition($arrSearchData) {
	$searchCondition = parent::lfGetSearchCondition($arrSearchData);

	// 商品ステータスの絞込み
	if ($arrSearchData['product_status_id']) {
		$searchCondition['where'] .= ' AND product_id IN (SELECT product_id FROM dtb_product_status WHERE product_status_id = ? AND del_flg = 0)';
		$searchCondition['arrval'][] = $arrSearchData['product_status_id'];
	}

	// 商品数カウント数を取得
	$searchCondition['where_for_count'] = $searchCondition['where'];

	return $searchCondition;
}

 ページタイトルの設定をカスタマイズ

/**
 * ページタイトルの設定
 *
 * @param string|null $mode
 * @return str
 */
public function lfGetPageTitle($mode, $arrSearchData) {
	if ($mode == 'search') {
		return '検索結果';
	} elseif ($arrSearchData['product_status_id'] > 0) {
		return $this->arrSTATUS[$arrSearchData['product_status_id']];
	} elseif ($arrSearchData['category_id'] == 0) {
		return '全商品';
	} else {
		$objCategory = new SC_Helper_Category_Ex();
		$arrCat = $objCategory->get($arrSearchData['category_id']);

		return $arrCat['category_name'];
	}
}

 actionメソッドをカスタマイズ

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

	$objProduct = new SC_Product_Ex();
	// パラメーター管理クラス
	$objFormParam = new SC_FormParam_Ex();

	// パラメーター情報の初期化
	$this->lfInitParam($objFormParam);

	// 値の設定
	$objFormParam->setParam($_REQUEST);

	// 入力値の変換
	$objFormParam->convParam();

	// 値の取得
	$this->arrForm = $objFormParam->getHashArray();

	//modeの取得
	$this->mode = $this->getMode();

	//表示条件の取得【カスタマイズ部分】
	$this->arrSearchData = array(
		'category_id' => $this->lfGetCategoryId(intval($this->arrForm['category_id'])),
		'maker_id' => intval($this->arrForm['maker_id']),
		'name' => $this->arrForm['name'],
		'product_status_id' => intval($this->arrForm['product_status_id'])
	);
	$this->orderby = $this->arrForm['orderby'];

	//ページング設定
	$this->tpl_pageno = $this->arrForm['pageno'];
	$this->disp_number = $this->lfGetDisplayNum($this->arrForm['disp_number']);

	// 画面に表示するサブタイトルの設定【カスタマイズ部分】
	$this->tpl_subtitle = $this->lfGetPageTitle($this->mode, $this->arrSearchData);

	// 画面に表示する検索条件を設定
	$this->arrSearch = $this->lfGetSearchConditionDisp($this->arrSearchData);

	// 商品一覧データの取得
	$arrSearchCondition = $this->lfGetSearchCondition($this->arrSearchData);
	$this->tpl_linemax = $this->lfGetProductAllNum($arrSearchCondition);
	$urlParam = "category_id={$this->arrSearchData['category_id']}&pageno=#page#";
	// モバイルの場合に検索条件をURLの引数に追加
	if (SC_Display_Ex::detectDevice() === DEVICE_TYPE_MOBILE) {
		$searchNameUrl = urlencode(mb_convert_encoding($this->arrSearchData['name'], 'SJIS-win', 'UTF-8'));
		$urlParam .= "&mode={$this->mode}&name={$searchNameUrl}&orderby={$this->orderby}";
	}
	$this->objNavi = new SC_PageNavi_Ex($this->tpl_pageno, $this->tpl_linemax, $this->disp_number, 'eccube.movePage', NAVI_PMAX, $urlParam, SC_Display_Ex::detectDevice() !== DEVICE_TYPE_MOBILE);
	$this->arrProducts = $this->lfGetProductsList($arrSearchCondition, $this->disp_number, $this->objNavi->start_row, $objProduct);

	switch ($this->getMode()) {
		case 'json':
			$this->doJson($objProduct);
			break;

		default:
			$this->doDefault($objProduct, $objFormParam);
			break;
	}

	$this->tpl_rnd = SC_Utils_Ex::sfGetRandomString(3);
}

 商品一覧テンプレートをカスタマイズ

編集するテンプレートファイルは以下のとおりです。

data/Smarty/templates/default/products/list.tpl

form1内にproduct_status_idのinputタグを追加

<input type="hidden" name="product_status_id" value="<!--{$arrSearchData.product_status_id|h}-->" />

以上です。


【EC-CUBE2.13】レコメンド機能の「この商品を買った人はこんな商品も買っています」機能をプラグインを使わずに実装する。

$
0
0

【EC-CUBE2.13】レコメンド機能の「この商品を買った人はこんな商品も買っています」機能をプラグインを使わずに実装してみます。


「この商品を買った人が買った他の商品」は以下のSQL文で集計できます。

上記メソッドをLC_Page_Products_Detail のページクラス(拡張)に貼り付けて、テンプレートにデータを渡すよう設定すればOKです。

【EC-CUBE2.13】商品ステータス名から商品データを取得

$
0
0

【EC-CUBE2.13】商品ステータス名から商品データを取得する方法です。

ページ拡張クラス(LC_Page_Ex.php)に追加

以下のメソッドをページ拡張クラス(LC_Page_Ex.php)に追加して下さい。

あとは、以下のようにしてテンプレートにデータを渡して下さい。

$this->arrNewProducts = $this->lfGetProductsFromProductStatus("NEW");

 

【EC-CUBE2.13】customer_idで会員ログインできるようにする方法

$
0
0

【EC-CUBE2.13】customer_idで会員ログインできるようにする方法です。

data/class_extends/SC_Customer_Ex.phpに以下のコードを追加して下さい。

上記コードはPC会員のみcustomer_idでログインできます。

【EC-CUBE2.13】更新日時順で商品一覧を表示する方法

$
0
0

【EC-CUBE2.13】更新日時順で商品一覧を表示する方法です。

data/class_extends/page_extends/products/LC_Page_Products_List_Ex.phpに以下のコードを追加して下さい。

以下のようにorderbyパラメータの値をupdateにすると更新日時順で表示されます。

domain.com/products/list.php?orderby=update

【EC-CUBE2.13】ポイント付与率が高い順で商品一覧を表示する方法

$
0
0

【EC-CUBE2.13】ポイント付与率が高い順で商品一覧を表示する方法です。

data/class_extends/page_extends/products/LC_Page_Products_List_Ex.phpに以下のコードを追加して下さい。

以下のようにorderbyパラメータの値をpoint_rataにすると更新日時順で表示されます。

domain.com/products/list.php?orderby=point_rate

Viewing all 271 articles
Browse latest View live