PHP でセレクトボックスでカテゴリの階層をインデントを使って表現するサンプルコード

カテゴリを管理する機能を構築する際にセレクトボックスで親カテゴリを選択させる場合があると思います。WordPress の新規カテゴリー追加の際などもこのような形式ですね。

これを表現するには、カテゴリを階層ごとに取り出しつつ、階層ごとに取り出す際にインデントを付ける必要があります。CakePHP のコードそのままで恐縮ですが、以下のように再帰的にカテゴリをインデント情報を送りつつ取り出します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function select($parent_id = 0, $indent = '', $recursively = true)
{
    $data = $this->find('all', Array('conditions' => Array('parent_id' => $parent_id)));
    if($data) {
        $array = Array();
        foreach($data as $datum) {
            $array[] = Array(
                'id' => $datum[$this->alias]['id'],
                'name' => $indent . $datum[$this->alias]['name']
            );
            if($recursively) {
                $inner_indent = $indent . ' ';
                $result = $this->select($datum[$this->alias]['id'], $inner_indent);
                if($result) {
                    foreach($result as $res) {
                        $array[] = $res;
                    }
                }
            }
        }
        return $array;
    } else {
        return false;
    }
}

いまいち実装方法を思いつくことができない人は参考にしてください。

コメント

コメントは受け付けていません。