Membuat menu dinamis bertingkat dengan cara parent_id sebagai key

Ada beberapa programmer yang kesulitan ketika membuat menu bertinggal secara dinamis. Untuk membuat menu bertingkat dinamis ini dengan cara parent_id sebagai key cukup mudah. Berikut saya coba catet caranya:

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
26
27
28
29
30
31
32
function build_menu($menu, $roleid_list) {
    $menu = array();
    if(count($menu) > 0) {
        $i=0;
        foreach ($menu as $item_menu) {
            $menu[$i]['menu_id'] = $item_menu->menu_id;
            $menu[$i]['name'] = $item_menu->name;
            $menu[$i]['link'] = $item_menu->link;
            if( $this->menu_has_child($item_menu->menu_id, $roleid_list) ) {
                $menu[$i]['child'] = $this->build_menu( $this->menu_get_child($item_menu->menu_id, $roleid_list), $roleid_list );
            }
            $i++;
        }
        return $menu;
    }
}

function menu_has_child($menu_id, $roleid_list) {
    $MenuroleRepository = new MenuroleRepository();
    $menu = $MenuroleRepository->getMenuListByParent($menu_id, $roleid_list);
   
    if (count($menu) > 0) {
        return true;
    } else {
        return false;
    }
}

function menu_get_child($menu_id, $roleid_list) {
    $MenuroleRepository = new MenuroleRepository();
    return $MenuroleRepository->getMenuListByParent($menu_id, $roleid_list);
}

Code diatas asumsinya adalah dalam salah satu class lalu saya gunakan get data menu berdasarkan roleID dari salah satu user. Makanya terlihat $roleid_list, variable yang berisi role dari user tertentu.

Lalu bagian Repo/Model/Query untuk get data menu by parent id query nya seperti ini:

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
26
27
28
public function getMenuListByParent($parent_id, $roleid_array) {
    $bindingsString = implode(',', array_fill(0, count($roleid_array), '?'));
    $sql = "
        select
            mr.menu_id,
            mr.role_id,
            m.id,
            m.name,
            m.link,
            m.alias,
            m.icon,
            m.is_link,
            m.parent_id,
            m.position
        from
            menu_role mr
        join menus m on m.id = mr.menu_id
        where
        m.parent_id = ? and
        mr.role_id in ({$bindingsString})
        group by m.id
        order by m.position
    "
;

    $databinding = array_merge(array($parent_id), $roleid_array);
    $results = DB::select($sql, $databinding);
    return $results;
}

Untuk jalanin, tinggal panggil $this->build_menu() saja. Kasus disini, parameter yang wajib sebenernya cukup list dari menu yang paling tinggi (asumsi parent_id = 0). Lalu secara otomatis mendapatkan menu-menu child nya dalam bentuk array.

Jika ingin langsung mendapatkan dalam bentuk list, bisa seperti kode dibawah ini.

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
26
27
28
29
30
31
32
33
34
35
function build_menu($menu) {
    $html = "";
    if(count($menu) > 0) {
        foreach ($menu as $item_menu) {
            if( $this->menu_has_child($item_menu->id) ) {
                $html .= "<li class='dropdown'>
                                <a href="
. url('/'.$item_menu->link) ." class='dropdown-toggle' data-toggle='dropdown'>
                                    "
. $item_menu->name ." <span class='caret'></span>
                                </a>
                                <ul class='dropdown-menu' role='menu'>"
;
                    $html .= $this->build_menu( $this->menu_get_child($item_menu->id), 1 );
                $html .= "</ul>";
            } else {
                $html .= "<li><a href=". url('/'.$item_menu->link) .">". $item_menu->name ."</a>";
            }
        }
        return $html;
    }
}

function menu_has_child($menu_id) {
    $roleid_list =\Session::get('roleid_list');
    $menu = $this->MenuroleRepository->getMenuListByParent($menu_id, $roleid_list);
   
    if (count($menu) > 0) {
        return true;
    } else {
        return false;
    }
}

function menu_get_child($menu_id) {
    $roleid_list =\Session::get('roleid_list');
    return $this->MenuroleRepository->getMenuListByParent($menu_id, $roleid_list);
}

Mudah2an bermanfaat 🙂

2 comments

Leave a Reply

Your email address will not be published. Required fields are marked *

%d bloggers like this: