EC-CUBEのカスタマイズで、特別な人にだけ商品を見れるページを作ってほしいと要望があった。
会員専用商品とはまた違う、EC-CUBE内の商品検索には引っかからず、URLを知ってる人だけ入れるページ・・・みたいな感じだそうです。

という訳で、そういう風にカスタマイズしました。

EC-CUBEのバージョンは2.4.1と2.12でやりました。

1.管理画面のシステム設定->マスターデータ管理(バージョンによっては、基本情報管理->マスターデータ管理)
の、mtb_dispに3 シークレット商品として追加。


2.商品管理->カテゴリー管理でシークレット商品としてカテゴリーを追加。
※この時自動的にふられるカテゴリーIDは毎回違うので、注意。今回はカテゴリーIDを1とします。


3./data/Smarty/templates/default/admin/products/product.tplの146行目付近

<td bgcolor="#ffffff" width="557" class="fs12n"><input type="radio" name="status" value="1" <!--{if $arrForm.status == "1"}-->checked<!--{/if}-->/>公開 <input type="radio" name="status" value="2" <!--{if $arrForm.status == "2"}-->checked<!--{/if}--> />非公開</td>



<td bgcolor="#ffffff" width="557" class="fs12n"><input type="radio" name="status" value="1" <!--{if $arrForm.status == "1"}-->checked<!--{/if}-->/>公開 <input type="radio" name="status" value="2" <!--{if $arrForm.status == "2"}-->checked<!--{/if}--> />非公開 <inputtype="radio" name="status" value="3" <!--{if $arrForm.status =="3"}-->checked<!--{/if}--> /> シークレット商品</td>

色がついているところを追加。


4./data/class/pages/products/LC_Page_Products_List.phpの156行目付近

// 値の正当性チェック
if(!SC_Utils_Ex::sfIsInt($_POST['product_id']) || !$objDb->sfIsRecord("dtb_products", "product_id", $_POST['product_id'], "del_flg = 0 AND status = 1 ")) {
SC_Utils_Ex::sfDispSiteError(PRODUCT_NOT_FOUND);
} else {



// 値の正当性チェック
if(!SC_Utils_Ex::sfIsInt($_POST['product_id']) || !$objDb->sfIsRecord("dtb_products", "product_id", $_POST['product_id'], "del_flg = 0 AND status = 1 OR status = 3 ")) {
SC_Utils_Ex::sfDispSiteError(PRODUCT_NOT_FOUND);
} else {

色がついているところを追加。


5.同じく/data/class/pages/products/LC_Page_Products_List.phpの435行目付近

// 商品検索条件の作成(未削除、表示)
$where = "del_flg = 0 AND status = 1 ";


// 商品検索条件の作成(未削除、表示)
switch($category_id){
case 1 :
$where = "del_flg = 0 AND status = 3 ";
break;
default :
$where = "del_flg = 0 AND status = 1 ";
}

色がついているプログラムに変更。
※この時caseの「1」はカテゴリーIDなので、環境によって変動。



6./data/class/pages/products/LC_Page_Products_Detail.phpの123行目付近

} else {
$status = false;
$where = "del_flg = 0 AND status = 1 ";
}

} else {
$status = false;
$where = "del_flg = 0 AND status = 1 OR status = 3 ";
}

色がついているところを追加。


7./data/class/pages/products/LC_Page_Products_Detail.phpの335行目付近
モバイルサイト対応用。バージョンによってあったりなかったり。2009/07/15現在の最新Ver2.4.1ではあった。2.1.2ではなかった。
// 値の正当性チェック

if(!SC_Utils_Ex::sfIsInt($tmp_id)|| !$objDb->sfIsRecord("dtb_products", "product_id", $tmp_id, 'del_flg = 0 AND status = 1)) {
SC_Utils_Ex::sfDispSiteError(PRODUCT_NOT_FOUND);

}
 
// 値の正当性チェック
if(!SC_Utils_Ex::sfIsInt($tmp_id)|| !$objDb->sfIsRecord("dtb_products", "product_id", $tmp_id, 'del_flg = 0 AND status = 1 OR status = 3')) {
SC_Utils_Ex::sfDispSiteError(PRODUCT_NOT_FOUND);

}


8./data/class/pages/products/LC_Page_Products_DetailImage.phpの62行目付近

} else {
$where = "del_flg = 0 AND status = 1";
}

} else {
$where = "del_flg = 0 AND status = 1 OR status = 3 ";
}

色がついているところ追加。



以上で、プログラム修正は終わり。
あとは、商品登録の時の公開・非公開のラジオボタンをシークレット商品にチェックして、
http://www.hogehoge.com/products/detail.php?product_id=1
URLのproduct_idを商品IDで指定する。

カテゴリでまとめたい場合は、シークレット商品のカテゴリーにいれて、
http://www.
hogehoge.com/products/list.php?category_id=1
URLのcategory_idをカテゴリーIDで指定する。

そんな感じで全部終わり。