そもそも、なぜカテゴリーに説明文追加 【管理画面・データベース編】でカテゴリーの説明をつけたかったかというと。

という風に、デフォルトではカテゴリーを選択すると、そのカテゴリーの名前が出てきて、サブカテゴリーやサブサブカテゴリー・・・・・・子々孫々に登録されている商品を全部ひっぱってきちゃってるのを

ツꀀという風に、カテゴリーの説明後、サブカテゴリーの表示というようなことをしたいからです。

これは、ブロックを一つ作ってしまおう!と思いました。
既にあるカテゴリーブロックとは別に、新しくサブカテゴリーブロックを。

ここからは、本当、あんまりスマートなやり方ではないので、参考程度に。

ツꀀ

【1】ブロックを作る。
デザイン編集>ブロック編集より、「サブカテゴリー」ブロックを作る。subcategory.tplはひとまず、カテゴリを模倣。

【2】ブロックにいろいろとassignするphpを作る。
とりあえず、frontparts/bloc/のcategory.phpをコピーして、subcategory.phpを作る。

【3】作ったtplとコピーしたphpを紐付けるために、dtb_blocというデータベースを変更する。
このtpl_pathとphp_pathがキモ。

【4】subcategory.phpのために、page_extends/frontparts/bloc/LC_Page_FrontParts_Bloc_Subcategory.phpを作る。
ここで、現在いるカテゴリーページのidを取得し、カテゴリーのid、名前、説明。また、そのカテゴリーを親とするサブカテゴリーたちの情報をひっぱるプログラムを書く。

【5】それにあわせてsubcategory.tplを書く。cssも直しました。

ちなみにソースはこんな感じ。

subcategory.tpl

<!–商品カテゴリーここから–>
<div id=”maincate”>
<h2><!–{$maincate[0].category_name }–></h2>
<div>
<!–{$maincate[0].category_disp }–>
</div>
<table border=’0′ cellspacing=’5′ cellpadding=’0′ align=”center”>
<tr>
ツꀀ <!–{section name=cnt loop=$arrTree}–>
ツꀀ <td valign=”top”>
ツꀀツꀀツꀀツꀀツꀀ <!–{* 階層を level へ *}–>
ツꀀツꀀツꀀツꀀツꀀ <!–{assign var=level value=”`$arrTree[cnt].level`}–>

ツꀀツꀀツꀀツꀀツꀀ <!–{* カテゴリ名を disp_name へ *}–>
ツꀀツꀀツꀀツꀀツꀀ <!–{assign var=disp_name value=”`$arrTree[cnt].category_name`”}–>
ツꀀツꀀツꀀツꀀツꀀ <!–{assign var=disp_disp value=”`$arrTree[cnt].category_disp`”}–>

ツꀀツꀀツꀀツꀀツꀀ <!–{* 表示カテゴリのみ *}–>
ツꀀツꀀツꀀツꀀツꀀ <!–{if $arrTree[cnt].display == 1}–>

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <!–{* 選択したカテゴリ *}–>
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <!–{if in_array($arrTree[cnt].category_id, $tpl_category_id) }–>
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <a href=”<!–{$smarty.const.URL_DIR}–>products/list.php?category_id=<!–{$arrTree[cnt].category_id}–>”><!–{$disp_name|escape}–></a>

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <!–{* 未選択カテゴリ *}–>
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <!–{else}–>
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <a href=”<!–{$smarty.const.URL_DIR}–>products/list.php?category_id=<!–{$arrTree[cnt].category_id}–>”><!–{$disp_name|escape}–></a>
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <!–{/if}–>
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ <br /><!–{$disp_disp|sfCutString:40|escape}–>

ツꀀツꀀツꀀツꀀツꀀ <!–{/if}–>
ツꀀツꀀツꀀツꀀツꀀ <!–{cycle values=</td>,</td>,</td></tr><tr>}–>

ツꀀツꀀツꀀ <!–{/section}–>
</tr>
</table>
</div>
<!–商品カテゴリーここまで–>

LC_Page_FrontParts_Bloc_Subcategory.php

<?php

class LC_Page_FrontParts_Bloc_Subcategory extends LC_Page_FrontParts_Bloc {

ツꀀツꀀツꀀ // }}}
ツꀀツꀀツꀀ // {{{ functions

ツꀀツꀀツꀀ /**
ツꀀツꀀツꀀツꀀ * Page を初期化する.
ツꀀツꀀツꀀツꀀ *
ツꀀツꀀツꀀツꀀ * @return void
ツꀀツꀀツꀀツꀀ */
ツꀀツꀀツꀀ function init() {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ parent::init();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $bloc_file = ‘subcategory.tpl’;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $this->setTplMainpage($bloc_file);
ツꀀツꀀツꀀ }

ツꀀツꀀツꀀ /**
ツꀀツꀀツꀀツꀀ * Page のプロセス.
ツꀀツꀀツꀀツꀀ *
ツꀀツꀀツꀀツꀀ * @return void
ツꀀツꀀツꀀツꀀ */
ツꀀツꀀツꀀ function process() {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubView = new SC_SiteView();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objDb = new SC_Helper_DB_Ex();

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ // 選択中のカテゴリIDを判定する
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrCategory_id = $objDb->sfGetCategoryId($_GET[‘product_id’], $_GET[‘category_id’]);

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ // 選択中のカテゴリID
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $this->tpl_category_id = empty($arrCategory_id) ? array(0) : $arrCategory_id;
ツꀀツꀀツꀀツꀀ if($arrCategory_id[0]){
ツꀀツꀀツꀀツꀀ ツꀀ$this->lfGetCatdate($arrCategory_id[0], true, $this);
ツꀀツꀀツꀀツꀀツꀀツꀀ ツꀀツꀀ $this->lfGetCatTree($this->tpl_category_id, true, $this);
ツꀀツꀀツꀀ ツꀀ} //注)太字は2008/1/7に追加。ない場合は、「登録ページ」などでエラーが発生する

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubView->assignobj($this);
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubView->display($this->tpl_mainpage);
ツꀀツꀀツꀀ }

ツꀀツꀀツꀀ /**
ツꀀツꀀツꀀツꀀ * モバイルページを初期化する.
ツꀀツꀀツꀀツꀀ *
ツꀀツꀀツꀀツꀀ * @return void
ツꀀツꀀツꀀツꀀ */
ツꀀツꀀツꀀ function mobileInit() {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $this->tpl_mainpage = MOBILE_TEMPLATE_DIR . “frontparts/”
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ . BLOC_DIR . ‘category.tpl’;
ツꀀツꀀツꀀ }

ツꀀツꀀツꀀ /**
ツꀀツꀀツꀀツꀀ * Page のプロセス(モバイル).
ツꀀツꀀツꀀツꀀ *
ツꀀツꀀツꀀツꀀ * @return void
ツꀀツꀀツꀀツꀀ */
ツꀀツꀀツꀀ function mobileProcess() {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubView = new SC_MobileView();

ツꀀツꀀツꀀツꀀツꀀツꀀ $this->lfGetMainCat(true, $this);

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubView->assignobj($this);
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubView->display($this->tpl_mainpage);
ツꀀツꀀツꀀ }

ツꀀツꀀツꀀ /**
ツꀀツꀀツꀀツꀀ * デストラクタ.
ツꀀツꀀツꀀツꀀ *
ツꀀツꀀツꀀツꀀ * @return void
ツꀀツꀀツꀀツꀀ */
ツꀀツꀀツꀀ function destroy() {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ parent::destroy();
ツꀀツꀀツꀀ }

ツꀀツꀀツꀀ // カテゴリツリーの取得
ツꀀツꀀツꀀ function lfGetCatTree($arrParent_category_id, $count_check = false) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objQuery = new SC_Query();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objDb = new SC_Helper_DB_Ex();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $col = “*”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $from = “dtb_category”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $where = “del_flg = 0 AND parent_category_id =”.$arrParent_category_id[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) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ if($array[‘category_id’] == $val) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrRet[$key][‘display’] = 1;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ break;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $this->arrTree = $arrRet;
ツꀀツꀀツꀀ }

ツꀀツꀀツꀀ // メインカテゴリーの取得
ツꀀツꀀツꀀ function lfGetMainCat($count_check = false, &$objSubPage) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objQuery = new SC_Query();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $col = “*”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $from = “dtb_category left join dtb_category_total_count using (category_id)”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ // メインカテゴリーとその直下のカテゴリーを取得する。
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $where = ‘level <= 2 AND del_flg = 0’;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ // 登録商品数のチェック
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ if($count_check) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $where .= ” AND product_count > 0″;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objQuery->setoption(“ORDER BY rank DESC”);
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrRet = $objQuery->select($col, $from, $where);

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ // メインカテゴリーを抽出する。
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrMainCat = array();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ foreach ($arrRet as $cat) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ if ($cat[‘level’] != 1) {
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ continue;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ // 子カテゴリーを持つかどうかを調べる。
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrChildrenID = SC_Utils_Ex::sfGetUnderChildrenArray($arrRet, ‘parent_category_id’, ‘category_id’, $cat[‘category_id’]);
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $cat[‘has_children’] = count($arrChildrenID) > 0;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrMainCat[] = $cat;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ }

ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objSubPage->arrCat = $arrMainCat;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ return $objSubPage;
ツꀀツꀀツꀀ }
ツꀀ
ツꀀ//メインカテゴリのデータ取得
ツꀀfunction lfGetCatdate($arrCategory_id, $count_check = false){
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objQuery = new SC_Query();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objDb = new SC_Helper_DB_Ex();
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $col = “*”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $from = “dtb_category”;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $where = “del_flg = 0 AND category_id = “.$arrCategory_id;
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $objQuery->setoption(“ORDER BY rank DESC”);
ツꀀツꀀツꀀツꀀツꀀツꀀツꀀ $arrRet = $objQuery->select($col, $from, $where);
ツꀀツꀀ$this->maincate = $arrRet;
ツꀀ}
}
?>

いらないところもたくさんあるけど削ってないです。ちょっと時間がないのと、オーバーワーク気味で頭痛くて・・・・・・。

ツꀀ