以前は列が少なかったので、ブラインド方式 (ホームページ -> 列名) を使用していましたが、現在は列が増え、徐々に第 2 レベルの列、第 3 レベルの列も追加されています。明らかにこの方法は適切ではないので、ちょっと改良しました。それほど難しいことではありません。再帰関数を使用するだけです。
使用例:
実装コード:
//説明します。列テーブル カテゴリの catid は列 ID、catname は列名、asmenu は列の親の ID、それがトップレベルの列の場合、asmenu は 0 です。
保護された関数 now_here($catid,$ext=''){
$cat = M("カテゴリ");
$here = 'ホームページ';
$uplevels = $cat->field("catid,catname,asmenu")->where("catid=$catid")->find();
if($uplevels ['asmenu'] != 0)
$here .= $this->get_up_levels($uplevels['asmenu']);
$here .= ' -> a href="/cat_'.$ uplevels['catid'].'.html">'.$uplevels['catname']."";
if($ext != '') $here .= ' -> ' .$ext;
return $here;
}
保護関数 get_up_levels($id){
$cat = M("カテゴリ");
$here = '';
$uplevels = $cat->field(" catid,catname,asmenu")->where("catid=$id")->find();
$here .= ' -> '.$uplevels['catname']."";
if($uplevels['asmenu'] != 0){
$here = $this-> ;get_up_levels($uplevels['asmenu']).$here;
}
return $here;
}
添付ファイル: 別の例
public function cat() {
load('extend'); // extend.php ファイルをロードします
// すべてのカテゴリを取り出します
$Catalog = M('Categories')->select();
$nav_array = array();
$this->getNavCrumbs($Categories, 2120, $nav_array);
dump($nav_array);
// すべてのカテゴリを取り出します (そしてそれらをツリーに構築します)
// $CategoryTree = list_to_tree($Categories, 'categories_id', 'parent_id');
}
/**
* カテゴリ ID に基づいてパンくずリストを逆方向に構築します
* @param $Categories すべてのカテゴリで構成される配列
* @param $categoryId 上向きトレースに使用されるカテゴリ ID
* @param $navCrumbs 結果の保存に使用される配列、渡すだけ空の配列
*/
public function getNavCrumbs($Categories, $categoryId, &$navCrumbs) {
$category = list_search( $Categories, array('categories_id'=>$categoryId) ) ;
$category = $category[0];
$parent_id = $category['parent_id'];
$categories_id = $category['categories_id'];
if( $parent_id != 0 ) { // 0 はルート ノード ID (ルート ノード ID) です
$this->getNavCrumbs($Categories, $parent_id, $navCrumbs);
}
$navCrumbs[$categories_id] = $category;
}
}