【EC-CUBE】会員種別で表示・非表示になる商品カテゴリーを作成する。

会員に「本会員(status:2)」が既にありますが、これに「A会員(status:3)」「B会員(status:4)」を追加して、「A会員」や「B会員」にしか買えないカテゴリーを作りたい。

0.「A会員(status:3)」「B会員(status:4)」の人がログインできるように修正します。
data\class\SC_Customer.phpのL44に

$sql = “SELECT * FROM dtb_customer WHERE (email = ?” . $sql_mobile . “) AND del_flg = 0 AND (status = 2 || status = 3 || status = 4)”;

という風に、statusを追加する必要があります。

1.カテゴリーテーブルに「taiou_status」のカラムを追加します。
2.カテゴリー登録ページに「taiou_status」を登録できるようなカスタマイズをします。

data\class\pages\admin\products\LC_Page_Admin_Products_Category.php
function init() {
の中に

       $masterData = new SC_DB_MasterData_Ex();#add グループ判定のため
        $this->arrCUST = $masterData->getMasterData("mtb_customer_status");#add グループ判定のため

を追加して、グループ(会員種別)を取得する

L238あたりの「 function doPreEdit(&$objFormParam) 」に

       // 編集対象のカテゴリ名をDBより取得する
        $where = "category_id = ?";
        $category_name = $objQuery->get("category_name", "dtb_category", $where, array($category_id));
        $taiou_status = $objQuery->get("taiou_status", "dtb_category", $where, array($category_id));#add グループ判定のため

という風に「$taiou_status」を追加。

        // 対応グループを取得#add グループ判定のため
        $this->arrForm['taiou_status']   = $taiou_status;#add グループ判定のため

も「$this->arrForm[‘category_id’]」の下に追加

L266 あたりの「function doEdit(&$objFormParam) {」に

            $this->arrForm['category_name'] = $objFormParam->getValue('category_name');
            $this->arrForm['taiou_status'] = $objFormParam->getValue('taiou_status');#add グループ判定のため

という風に
「function doEdit」の中で、

this->arrForm['category_name'] = $objFormParam->getValue('category_name');

となっているところの次の行にとにかくつける。(3か所)


L313あたりの「function doRegister(&$objFormParam)」に

       // カテゴリー登録
        $this->registerCategory($objFormParam->getValue('parent_category_id'),
                                $objFormParam->getValue('category_name'),
                                $objFormParam->getValue('taiou_status'),#add グループ判定のため
                                $_SESSION['member_id']);

という風に1行追加。

L418あたりの「 function initParam(&$objFormParam) {」に

       $objFormParam->addParam("対応グループ", "taiou_status", STEXT_LEN, 'KVa', array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));#add グループ判定のため

を追加。

L469あたりの「function registerCategory」
これは引数を変えてしまったから、ちょっといかんかもしれませんが。(function registerCategoryは2か所あって、もう一か所はCSVでのカテゴリー登録のところ。だけど、共有してこちらのfunctionを使用しているような感じではないので大丈夫だと思う)

function registerCategory($parent_category_id, $category_name,$taiou_status,  $creator_id) {#edit add taiou_status グループ判定のため

という風に「,$taiou_status」を追加しました。

そして、

$arrCategory['taiou_status'] = $taiou_status;#add グループ判定のため

を追加。

data\Smarty\templates\admin\products\category.tpl には

<input type="text" name="category_name" value="<!--{$arrForm.category_name|h}-->" size="30" class="box30" maxlength="<!--{$smarty.const.STEXT_LEN}-->" /><span class="attention">&nbsp;(上限<!--{$smarty.const.STEXT_LEN}-->文字)</span><br />
                対象グループ:<!--{html_radios name="taiou_status" options=$arrCUST selected=$arrForm.taiou_status separator='&nbsp;&nbsp;'}--><span class="attention">&nbsp;(全対象の場合は、「仮会員」を選んでください。)</span>

という風に登録項目を追加しました。

3.ブロックのカテゴリーリストに「taiou_status」でなければ表示しない仕組みを追加。(サブは出てしまう)
data\class_extends\page_extends\frontparts\bloc\LC_Page_FrontParts_Bloc_Category_Ex.php

で、ログインの判定と、ログインしたときのその方所属の会員種別IDを取得

function init() {に

		// ログイン判定 add グループ判定のため
		$objCustomer = new SC_Customer_Ex();
		if ($objCustomer->isLoginSuccess() === true) {
		//お気に入りボタン表示
		$this->tpl_login = true;
        $this->tpl_status = $objCustomer->getValue('status');
		}
		//end

を追加

テンプレートに「←」のついている4行を追加

<h3>商品一覧</h3>
<!--{strip}-->
    <ul id="product-menu">
        <!--{assign var=preLev value=1}-->
        <!--{assign var=firstdone value=0}-->
        <!--{section name=cnt loop=$arrTree}-->
            <!--{* 表示フラグがTRUEなら表示 *}-->
            <!--{*if $arrTree[cnt].display == 1*}-->
                <!--{assign var=level value=`$arrTree[cnt].level`}-->
                <!--{assign var=taiou_status value=`$arrTree[cnt].taiou_status`}-->←
                <!--{assign var=levdiff value=`$level-$preLev`}-->
                <!--{* カテゴリーのtaiou_statusが2以上だったら、 $tpl_statusと比べて同じ値なら表示*}-->←
                <!--{if $taiou_status < 3 || $taiou_status == $tpl_status}-->←
                    <!--{if $levdiff > 0}-->
                        <ul>
                    <!--{elseif $levdiff == 0 && $firstdone == 1}-->
                        </li>
                    <!--{elseif $levdiff < 0}-->
                        <!--{section name=d loop=`$levdiff*-1`}-->
                                </li>
                            </ul>
                        <!--{/section}-->
                        </li>
                    <!--{/if}-->
                <li class="level<!--{$level}--><!--{if in_array($arrTree[cnt].category_id, $tpl_category_id)}--> onmark<!--{/if}-->">
                        <a href="<!--{$smarty.const.ROOT_URLPATH}-->products/list.php?category_id=<!--{$arrTree[cnt].category_id}-->"<!--{if in_array($arrTree[cnt].category_id, $tpl_category_id)}--> class="onlink"<!--{/if}-->><!--{$arrTree[cnt].category_name|h}-->(<!--{$arrTree[cnt].product_count|default:0}-->)</a>
                <!--{if $firstdone == 0}--><!--{assign var=firstdone value=1}--><!--{/if}-->
                <!--{assign var=preLev value=`$level`}-->
                <!--{/if}-->←
            <!--{*/if*}-->
            <!--{* セクションの最後に閉じタグを追加 *}-->
            <!--{if $smarty.section.cnt.last}-->
                <!--{if $preLev-1 > 0}-->
                    <!--{section name=d loop=`$preLev-1`}-->
                        </li>
                    </ul>
                    <!--{/section}-->
                    </li>
                <!--{else}-->
                    </li>
                <!--{/if}-->
            <!--{/if}-->
        <!--{/section}-->
    </ul>
<!--{/strip}-->

4.一覧を表示させない。
まずカテゴリーのtaiou_statusを取得。ここでややこしいのは、search結果の一覧も同じファイルで処理されていることです。
だけど、今回はとりあえずsearchは無視することにしました。

data\class\pages\products\LC_Page_Products_List.php

L96の「function action() {」に以下を追加

		// ログイン判定 add ▼
		$objCustomer = new SC_Customer_Ex();
		if ($objCustomer->isLoginSuccess() === true) {
		$this->tpl_login = true;
	        $this->tpl_status = $objCustomer->getValue('status');
	        $user_status = $objCustomer->getValue('status');
		}
		// ログイン判定 add ▲

ログインしている場合はログインしているということと、あと会員種別IDを取得します。

L127移行の
$this->tpl_subtitle = $this->lfGetPageTitle($this->mode, $this->arrSearchData[‘category_id’]);

のすぐ下あたりに、このカテゴリーが許可している会員種別IDを取得します。

        // カテゴリー対応している会員種別 add
        $this->taiou_status = $this->lfGetTaiouStatus($this->mode, $this->arrSearchData['category_id']);

この「lfGetTaiouStatus」っていうのは、新しく追加したものです。
data\class_extends\page_extends\products\LC_Page_Products_List_Ex.php に入れます。

   /**
     * 対応種別 add
     *
     * @return str
     */
    function lfGetTaiouStatus($mode, $category_id = 0){
        if ($mode == 'search') {
            return "0";
        } elseif ($category_id == 0) {
            return "0";
        } else {
            $arrCat = SC_Helper_DB_Ex::sfGetCatTaiou($category_id);
            return $arrCat['taiou_status'];
        }
    }

を追加。またまた、この中の「sfGetCatTaiou」は新しく追加したものです。

data\class_extends\helper_extends\SC_Helper_DB_Ex.php に

    /**
     * 指定したカテゴリーIDの対応会員種別を取得する。add
     *
     * @param integer $category_id カテゴリID
     * @return array 指定したカテゴリーIDのカテゴリー
     */
    function sfGetCatTaiou($category_id){
        $objQuery =& SC_Query_Ex::getSingletonInstance();

        // カテゴリーを取得する
        $arrVal = array($category_id);
        $res = $objQuery->select('category_id AS id, taiou_status AS taiou_status', 'dtb_category', 'category_id = ?', $arrVal);

        return $res[0];
    }

を追加します。

これで、ログインしている会員の会員種別「tpl_status(user_status)」とカテゴリーが許可している会員種別「taiou_status」が出そろいました。

テンプレートも変更

<!--{if $taiou_status < 3 || $taiou_status == $tpl_status}-->
ここに商品詳細のソースを記入
<!--{else}-->
この商品は、他の会員種別でないと購入できません。申し訳ございません。
<!--{/if}-->

5.商品を表示させない。

data\class\pages\products\LC_Page_Products_Detail.php

に、


        // ログイン判定//add by
        if ($objCustomer->isLoginSuccess() === true) {
            //お気に入りボタン表示
            $this->tpl_login = true;
            $this->is_favorite = SC_Helper_DB_Ex::sfDataExists('dtb_customer_favorite_products', 'customer_id = ? AND product_id = ?', array($objCustomer->getValue('customer_id'), $product_id));
	        $this->tpl_status = $objCustomer->getValue('status');
        }

を追加。

関連カテゴリーの中から、関連種別を取り出したかった。関連カテゴリーは
L298あたりの

// 関連カテゴリを取得
        $this->arrRelativeCat = SC_Helper_DB_Ex::sfGetMultiCatTree($product_id);

で取得している。SC_Helper_DB_Ex::sfGetMultiCatTreeをちょっと改造してみることにする。

data\class\helper\SC_Helper_DB.php

の「function sfGetMultiCatTree($product_id, $count_check = false) 」に

$col .= " cat.taiou_status, ";//add

をしかるべきところに追加。

$this->arrRelativeCatの中から「taiou_status」をとりだす。一番大きな値をtaiou_statusとして

 $this->taiou_status = $this->IfTaiouStatus($this->arrRelativeCat,$this->tpl_status);

IfTaiouStatusは新しく追加。
data\class_extends\page_extends\products\LC_Page_Products_Detail_Ex.php

/*
     * 会員種別に対応しているカテゴリーがあるかどうか add
     * @return int
     */
    function IfTaiouStatus($arrcategory, $tpl_status){
    	$taiou_status = 0;
    	foreach($arrcategory as $categories){
    		foreach($categories as $category){
    			if($category[taiou_status] > $taiou_status){
    				$taiou_status = $category[taiou_status];
    				continue;
    			}
    		}
    	}
    	return $taiou_status;
    }

テンプレートも変更

<!--{if $taiou_status < 3 || $taiou_status == $tpl_status}-->
ここに商品詳細のソースを記入
<!--{else}-->
この商品は、他の会員種別でないと購入できません。申し訳ございません。
<!--{/if}-->

こんな感じ。

6.検索結果で表示させない。

検索結果を取得する時点でいろいろするのは、ややこしくてよくわからなかったので、テンプレート上で表示しないようにする。
data\class\pages\products\LC_Page_Products_List.php の
$arrProductsに商品のデータがすべて詰まっているので、ここに対象商品のカテゴリーの対象会員種別のIDを追加させることにしました。

「5.」で作成した「function IfTaiouStatus」を使用するために

require_once CLASS_EX_REALDIR . 'page_extends/products/LC_Page_Products_Detail_Ex.php';#add

を追加しました。

あとは、「function lfGetProductsList」の中に下記のように「←」のついた行を追加


        foreach($arrProductId as $product_id) {
        	$category = SC_Helper_DB_Ex::sfGetMultiCatTree($product_id);
        	$products_detail = new LC_Page_Products_Detail_Ex();#add ←
        	$taiou_status = LC_Page_Products_Detail_Ex::IfTaiouStatus($category);#add ←
        	$arrProducts2[$product_id][taiou_status] = $taiou_status;#add ←
            $arrProducts[] = $arrProducts2[$product_id];
        }

テンプレートの、商品表示部分を


で囲みました。

ただ、これ、消すだけなので、
例えば検索結果10個でページ送りとかしているときに、11個検索して、表示する商品が8個とかでも、8個表示して10個になってないのに次のページ送りが出て、次のページにも何も表示されないみたいな現象がおこるのでどうしようかなぁと思う。
ある程度「この会員グループでは購入できない商品です」みたいな表示が必要なのかもしれません。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です