概要
メニューブロックの「カテゴリ」に表示させたくは無いけど、自分で作成したメニュー(ヘッダメニューとかね)からはアクセスできるカテゴリを作りたいと思って、カテゴリテーブル(dtb_category)に表示・非表示のフラグを設けました。メモ程度に記事にしておきます。
※フラグON・OFFの編集機能(管理画面の機能)は作っていない(とりあえずデータベースを直に編集してます)ので注意してください。
dtb_categoryにview_flagを追加
dtb_categoryにフィールドview_flag:tinyint 1を追加します。
NULL禁止、規定値は1としました。
そして、表示させたくないカテゴリのview_flagは0にします。
LC_Page_FrontParts_Block_Category.phpの編集
IfGetCatTree()メソッドを編集します。例によって親クラスから子クラスにメソッドをコピーですね。
ここからはソースで説明しますね。
LC_Page_FrontParts_Block_Category_EX.php
function IfGetCatTree($arrParent_category_id, $count_check = false)
// カテゴリツリーの取得
function lfGetCatTree($arrParent_category_id, $count_check = false) {
$objQuery = new SC_Query();
$objDb = new SC_Helper_DB_Ex();
$col = "*";
$from = "dtb_category left join dtb_category_total_count using (category_id)";
// 登録商品数のチェック
if($count_check) {
$where = "del_flg = 0 AND product_count > 0";
} else {
$where = "del_flg = 0";
}
$objQuery->setoption("ORDER BY rank DESC");
$arrRet = $objQuery->select($col, $from, $where);
foreach ($arrParent_category_id as $category_id) {
$arrParentID = $objDb->sfGetParents($objQuery, 'dtb_category', 'parent_category_id', 'category_id', $category_id);
$arrBrothersID = SC_Utils_Ex::sfGetBrothersArray($arrRet, 'parent_category_id', 'category_id', $arrParentID);
$arrChildrenID = SC_Utils_Ex::sfGetUnderChildrenArray($arrRet, 'parent_category_id', 'category_id', $category_id);
$this->root_parent_id[] = $arrParentID[0];
$arrDispID = array_merge($arrBrothersID, $arrChildrenID);
foreach($arrRet as $key => $array) {
foreach($arrDispID as $val) {
// $valが$array("category_id")と同じなら$arrRet[$key]['display']に1を代入しているところを、
// $arrRet[$key]['display'] = $arrRet[$key]['view_flag']でview_flagを代入してください。
if($array['category_id'] == $val) {
$arrRet[$key]['display'] = $arrRet[$key]['view_flag'];
break;
}
}
}
}
$this->arrTree = $arrRet;
}
変更点はこの一箇所だけです。カテゴリブロックのビューは何もしなくても大丈夫なはず。たぶん。
最後におまけで管理画面のカテゴリ管理をちょっと見やすくしてあげましょう。
カテゴリ管理ページの編集
カテゴリ管理ページで、view_flagが0のカテゴリは色が薄く表示されるようにしたいと思います。そう、これは完全なおまけです。*1
SC_Helper_DB.phpの編集
sfGetCatTree()メソッドの$colの取得フィールドを定義している箇所に”cat.view_flag”を追加
?略?
$col = "";
$col .= " cat.category_id,";
$col .= " cat.category_name,";
$col .= " cat.parent_category_id,";
$col .= " cat.view_flag,";
$col .= " cat.level,";
$col .= " cat.rank,";
$col .= " cat.creator_id,";
$col .= " cat.create_date,";
$col .= " cat.update_date,";
$col .= " cat.del_flg, ";
$col .= " ttl.product_count";
?略?
LC_Page_Admin_Products_Category.phpの編集
IfGetCat()メソッドの$colの取得フィールドを定義している箇所に”view_flag”を追加。
例によって親クラスから子クラスにメソッドコピー推奨。
?略? $col = "category_id, category_name, view_flag, level, rank"; ?略?
category.tplを編集
/data/Smarty/templates/default/admin/products/category.tplを2箇所編集します。
1箇所目
// 変更前
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrTree[cnt].category_id}-->); return false;">
↓
// 変更後
<!--{if $arrTree[cnt].view_flag > 0}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrTree[cnt].category_id}-->); return false;">
<!--{else}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrTree[cnt].category_id}-->); return false;" style=" color: #B4D4E4;">
<!--{/if}-->
2箇所目
// 変更前
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrList[cnt].category_id}-->); return false"><!--{$arrList[cnt].category_name|escape}--></td>
↓
// 変更後
<!--{if $arrList[cnt].view_flag > 0}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrList[cnt].category_id}-->); return false"><!--{$arrList[cnt].category_name|escape}--></td>
<!--{else}-->
<a href="<!--{$smarty.server.PHP_SELF|escape}-->" onclick="fnModeSubmit('tree', 'parent_category_id', <!--{$arrList[cnt].category_id}-->); return false" style=" color: #B4D4E4;"><!--{$arrList[cnt].category_name|escape}--></td>
<!--{/if}-->
あとがき
雑な記事でごめんなさい。時間が無い上に、自分のためのメモというスタンスで書いたのでこんな感じになりました*2 。需要もなさそうだし*3 。
管理画面まで作りこみたいという方は「HappyQuality ? [EC-CUBE]カテゴリにコンテンツを登録できるようにする」あたりを参考にしていただけば簡単に実装できると思います。
何かありましたらコメント・チャットなどでお問い合わせください。
コメント
ずっと、探していたカテゴリの表示・非表示フラグ追加、ありがとうございます。
きっとどこか勘違いしていると思うのですが、うまくいきません。
上記のDBにview_flag追加、LC_Page_FrontParts_Block_Category_EX.php
1を代入しているところを、$arrRet[$key][‘view_flag’]; 変更しました。
それでも、表示させたくないカテゴリが出てきます。
EC-CUBEコミュニティで質問
http://xoops.ec-cube.net/modules/newbb/viewtopic.php?topic_id=6423&forum=10
html/user_data/packages/default/bloc/category.tplの制御部分に問題があるのでは、という回答をいただいたのですが、初心者なので、どこに制御を追加すればいいのかわかりません。
どうしても必要な機能で 是非是非、アドバイスをお願い出来ないでしょうか。
Miyoshiさんこんにちは。そしてごめんなさい。
よくEC-CUBE関連のご質問をいただくのですが、実はもう1年以上EC?CUBEに触っていないので、ご質問の件にお答えすることができません。
自分の記事を読み返しましたが、雑でひどいですね^^;
バージョンも2.3系の頃のTipsなので、もしかすると今のバージョンと違うところもあるかもしれません。
でも、表題の機能を実現する「ヒント」には、なりそうな感じです。
「何のために、何をしているか?」を読んでいただければ、最新バージョンでソースが変わっていても、きっと応用できるはず。
お役に立てなくて申し訳ありませんが、Miyoshiさん、頑張ってくださいね。
絶対やる!って決めたら絶対できますよ^^