Menu Horizontal Multi Level Menggunakan jQuery & PHP

Drop Down Menu
Di dalam sebuah website, seringkali kita menemukan penggunaan menu bertingkat seperti pada gambar di atas. Menu yang bertingkat tersebut sebenarnya adalah sebuah struktur pohon/tree di mana suatu menu bisa memiliki anak (submenu), dan submenu tersebut juga bisa memiliki anak lagi dan seterusnya sampai level tak terbatas.

Berikut ini adalah contoh struktur html menu yang terdiri dari 3 level (menggunakan tag html <ul> dan <li>):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<ul>
    <li><a href="menu1.html">Menu 1</a></li>
    <li><a href="menu2.html">Menu 2</a></li>
    <li><a href="menu3.html">Menu 3</a>
        <ul>
            <li><a href="menu31.html">Sub Menu 3.1</a></li>
            <li><a href="menu32.html">Sub Menu 3.2</a>
                <ul>
                    <li><a href="menu321.html">Sub Menu 3.2.1</a></li>
                    <li><a href="menu322.html">Sub Menu 3.2.2</a></li>
                    <li><a href="menu323.html">Sub Menu 3.2.3</a></li>
                </ul>
            </li>
            <li><a href="menu33.html">Sub Menu 3.3</a></li>
        </ul>
    </li>
    <li><a href="menu4.html">Menu 4</a></li>
</ul>

Kode html tersebut akan menghasilkan tampilan seperti ini:
menu-list

Dengan menggunakan jquery dan plugin jquerycssmenu, menu tersebut bisa kita ubah menjadi sebuah menu dropdown yang lebih menghemat tempat. Tinggal tambahkan script berikut ini di dalam head:

1
2
3
4
<link rel="stylesheet" type="text/css" href="jquerycssmenu.css" />
 
<script type="text/javascript" src="jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="jquerycssmenu.js"></script>

Membuat menu dinamis dari database

Untuk membuat menu secara dinamis, kita bisa menggunakan database untuk menyimpan data menunya. Di bawah ini adalah struktur tabel untuk menyimpan menu:

1
2
3
4
5
6
7
8
CREATE TABLE `menu` (
  `id` tinyint(3) UNSIGNED NOT NULL AUTO_INCREMENT,
  `parent_id` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  `title` varchar(100) NOT NULL DEFAULT '',
  `url` varchar(100) NOT NULL DEFAULT '',
  `menu_order` tinyint(3) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM;

Kemudian gunakan script php ini untuk membuat list secara dinamis dari database tersebut. Script ini menggunakan sebuah fungsi rekursif untuk mengambil menu sampai ke level tak terbatas.

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
<?php
function get_menu($data, $parent = 0) {
	static $i = 1;
	$tab = str_repeat("\t\t", $i);
	if (isset($data[$parent])) {
		$html = "\n$tab<ul>";
		$i++;
		foreach ($data[$parent] as $v) {
			$child = get_menu($data, $v->id);
			$html .= "\n\t$tab<li>";
			$html .= '<a href="'.$v->url.'">'.$v->title.'</a>';
			if ($child) {
				$i--;
				$html .= $child;
				$html .= "\n\t$tab";
			}
			$html .= '</li>';
		}
		$html .= "\n$tab</ul>";
		return $html;
	} else {
		return false;
	}
}
 
mysql_connect('localhost', 'root', '');
mysql_select_db('tes');
 
$result = mysql_query("SELECT * FROM menu ORDER BY menu_order");
while ($row = mysql_fetch_object($result)) {
	$data[$row->parent_id][] = $row;
}
 
$menu = get_menu($data);
?>

Lihat demonya di sini

Download script ini:
Download jQuery Multi Level Horizontal Menu

Comments RSS | Trackback URI

81 Responses to “Menu Horizontal Multi Level Menggunakan jQuery & PHP”

  1. rifqi says:

    bener bener ajiiiiib … sedot disin ah

  2. WeW says:

    pengin nyobo.. nek nggo wordpress bs jg ga ya?

    mbok blog ini, nyoba.. ntar tak liat e :D

    jadi jelas ssh nya mo ngapain.. -_-’

    -w-

  3. Danie says:

    tak coba ah mas :D

  4. yayan says:

    Wah terima kasih banget nih Mas Bowo, kebetulan saya lagi nyari2 menu seperti ini. Pernah buat tapi ga jalan di IE 6.

  5. jharrvis says:

    wah ini dia yg gw cari2.., selama ini gw baru bisa bikin 2 level menu aja, yang ini unlimited to ga? btw makasih gan atas share nya. keep up da good work

  6. amin says:

    terimakasih bnyak atas artikelnya mas,,,
    oya saya mau tanya,bisa jelasin tentang id_parent yang ada di database itu ,terus penomeranya itu gman….??

    • gawibowo says:

      menu level pertama memiliki parent_id = 0
      menu level 2 memiliki parent_id = id menu di atasnya
      dst…
      contohnya:
      menu Products (id = 11, parent_id = 0)
      memiliki submenu:
      - Hardware
      - Software
      masing2 memiliki parent_id = 11
      11 = id dari menu Products

  7. irwans says:

    Thx.
    Tapi di IE 6 tampilannya agak rusak:
    1. border bawah di menu level 2 kadang muncul kadang hilang
    2. saat kursor ditunjuk ke menu level 2 yang mempunyai level 3 tinggi kotaknya bertambah shg tampilan jadi rusak.

    • gawibowo says:

      terimakasih infonya.. ternyata kemarin saya lupa mencoba di browser tsb hehe
      yg nomer 1 saya blm nemu masalahnya..mungkin anda bisa membantu? :D
      yg nomer 2 sudah saya perbaiki di file css nya saya tambahkan ini:

      * html .jquerycssmenu ul li ul li a {
      	display: inline-block;
      }
  8. Rivai says:

    Wow! menu ala facebook
    langsung sedot..

  9. sleting_dol says:

    terimakasih bos, tutorialnya.

  10. DeLorenzo says:

    Kerennn abizzzzzzzzzzzz …….. Keep RocKin Mas Bowo … hehehe

  11. aji says:

    muantabbbb… sedoot… thanks tutorialnya buagus

  12. codot says:

    mas thanx sebelumnya atas postingan ini..
    sangat bermanfaat bgt..
    tapi waktu saya coba, kok ada strip atasnya ya (warna putih….)
    jadi menu-nya g bisa mepet ama header website…

    tolong bantuin saya dong mas…
    apa yang harus di modif di css nya biar bisa mepet ke header…
    udah saya coba tapi kok belum berhasil

    thanx ya mas

  13. mariotegoeh says:

    tengkyu…..
    sedot ahhhh,,,,
    mau coba…

  14. Rius says:

    asekk… akhirnya nemu menu dropdown multi level,
    thanks mas :)

  15. basar says:

    waaah keren mzzz tutor menu nyaaaaa….
    oh iya variable untuk meletakkan atas bawah menu nya dmana yaa tak cari2 varibale “top” nya di css k tidak ada yaa mz?
    maklum mzh newbie :D

    • gawibowo says:

      Untuk mengatur letak/urutan menunya bukan lewat css mas, tetapi di database nya. Di tabel tsb ada field menu_order yang digunakan untuk urutan menu.

  16. newbiebanget says:

    Mas aku newbie niy masalah kaya gini, aku mau tanya kalo script yang mas kasih bisa ga di buat onmouseover jadi tampilannya kalo kita geser ke menu ini maka sub menu akan kelihatan…
    Aku tunggu balasannya ya mas…

    • gawibowo says:

      Bisa saja ditambahi onmouseover, tapi menu tsb sudah bisa menampilkan submenunya saat mouse kita arahkan ke atas menu nya. Tidak perlu ditambahi onmouseover lagi.

  17. Kuda says:

    wah.. keren-keren mas ari…
    btw mas,,. saya ada pertanyaan ni di php
    gimana membuat user login di php dan dia hanya boleh akses table user misalnya, dan user kedua bisa hanya bisa membuka table user dan data,

    gimana mas buatnya di php?

    Thanks

  18. charisma says:

    duh menunya kalo pakai

    //yang ini untuk menunya

    //yang ini select table database untuk content

    rupanya menunya conflic ama kiri.php jadi kalo child menunya kena tulisan file kiri.php yang contentnya dari database juga,menunya langsung ketutup jadi nggak bisa di klik..tapi kalo file kiri.php di gabungkan di div menu menunya jadi normal…

  19. Sugix says:

    wah mas makasih banyak dng tutornya… bener2 bagus & membantu sekali….

  20. tooricg says:

    bener2 muaaantep bos… gw simpen ilmunya ya, thanks

  21. gede surya says:

    terima kaih mas atas ilmunya, tapi bagaimana ya caranya agar menunya muncul ditengah-tengah bukan dikiri, saya coba pakai tabel mau tapi fontnya tambah besar n menunya gak mau ditengah2 table?
    mohon bimbingannya
    trim’s

  22. decent says:

    Kok Jadi error line 30
    kekurangannya apa mas ???

    Fatal error: Call to undefined function mysql_tchfe_object() in C:\xampp\htdocs\ajax\index.php on line 30

  23. test says:

    mysql_tchfe_object() <—
    mysql_fetch_object()

  24. rius says:

    mas, ada treeview?
    load datanya dari mysql

    thanks

  25. sony says:

    bos tolong donk di kasih script “nsert into table nya ” ,..thanks

  26. heru hidayat says:

    mas kalo menu vertical piye carannya
    thanks ilmunya

  27. Gie says:

    Wahh… keren bgt mas tutorialnya. Sangat membantu.. thanks ya.

  28. modd says:

    post super

  29. Eky adhiputra says:

    mas , klo di setiap sub menu,saya kasih link, dimana di ubahnya

    maaf saya masih pemula

  30. ridwan says:

    udah di update menu untuk IE6 nya blm?
    jadi biar download ga usah edit lagi hehe..
    btw thx udah share :)

  31. angga says:

    matur thank you pak lek…..

  32. chaluvdy says:

    tengkyu bgt mas ari..
    sangat membantu nih..

  33. ghprod says:

    Wow … mantaaabb bgt Om :D

    makasih y ….. :)

  34. indra says:

    Bagai mana jika saya hanya ingin menapilkan salah satu menu saja? misal menu dari “produk”
    saya telah mencoba

    $result = mysql_query(“SELECT * FROM menu where parent_id=xxx”);

    xxx=parent_id dari “produk”

  35. Fany says:

    mau tanya kalau buat linknya gimana ya??
    :)

  36. ilham says:

    mas sedot yah …. uh mantap

  37. rudy idur says:

    mantap Mas suwun
    emang pas lagi nyari php menu cek gak report :))

    suwun

  38. Abdul Adhim says:

    Pak gimana cara buat, kode php pada posting seperti punya anda ada list angka dan kalo bisa yang bisa di print, maklum masih awam

  39. ewa says:

    ..mantabbbbbbb……

  40. haq says:

    wah hatur nuhun mas……….

    saya jd bisa bikin get menu…..

  41. wanabe rocker says:

    Keren banget, disampaikan dengan bahasa yang
    mudah di mengerti, sangat membantu buat saya yang sedang belajar, makasih banyak…

  42. deden says:

    hello…thanks ya
    cuman mau tanya nih…untuk masing masing links nya dimana ya? bisa dicontoin ngak?

  43. chandra says:

    mas mau tanya ni

    while ($row = mysql_fetch_object($result)) {
    $data[$row->parent_id][] = $row;
    }
    klo pake koneksi oci tu gmn ya??
    krn sy pake db oracle 8.1.7

    • chandra says:

      $query(“SELECT * FROM menu ORDER BY menu_order”);
      $statement = oci_parse ($connection, $query);
      oci_execute ($statement);
      //echo $query;
      while ($row = oci_fetch_object($statement)) {
      $data[$row->parent_id][] = $row;
      }

      pas di run kok kosong ya???
      bantuanx pliss…..

      • gawibowo says:

        wah maaf mas, saya belum pernah pake oracle.. mungkin teman2 yg lain ada yg bisa membantu

        • chandra says:

          thx mas

          mungkin temen2 ada yang bisa ga????

          • gawibowo says:

            mungkin bisa membantu mas: coba menggunakan library abstraksi database, supaya scriptnya sama untuk semua jenis database
            kalo saya biasanya menggunakan adodb:

            include('adodb.inc.php'); 
            $db = ADONewConnection($db_type);
            $db->Connect($server, $user, $password, $database); 
             
            $rows = $db->GetAll("SELECT * FROM menu ORDER BY menu_order");
            foreach ($rows as $row) {
            	$data[$row['parent_id']][] = $row;
            }
  44. heroo says:

    Ijin sedot Mas.
    BTW ada referensi belajar buat template dengan css gak Mas??

    Oya template menu horizontalnya keren Mas, bisa gak ditambahin file lain seperti, file header, rightcontent, leftcontent, footer, dll

    Tolong dibantuin mas(kirim via email ya :&#68;), saya lagi belajar buat template dgn css.
    Thanks you

  45. ache says:

    mas ada yg menu vertikalnya ga???

  46. dekan says:

    agak rumit nih. apa ada yang lebih sederhana untuk wordpress ?

  47. s. wahyudi says:

    infonya bagus, tapi mau tanya apa untuk blogspot bisa bos

  48. azul says:

    dicoba dulu gan script nya :)
    trims

  49. Risanum says:

    wahhh…
    yang di cari² ternyata ada disini.
    Mantab bos..

    Likes this!!!

  50. mantap, source code dan penjelasannya,.. thanks yah..

  51. neng ucrit says:

    keren nih.. bs dipake juga buat yang model tree view.. :)
    sangat berguna

  52. adi says:

    mas,,,maw tanya nih…
    gmn caranya buat pemberitahuan???
    pada PHP..
    makasih.

  53. Multha says:

    Thanks mas Bowo…
    Saya udah coba menunya….
    Tap kenana muncul
    Notice: Undefined index: 1 in C:\\wamp\\www\\jquery\\menu\\index.php on line 5

    Notice: Undefined index: 2 in C:\\wamp\\www\\jquery\\menu\\index.php on line 5

    dst……….s/d index:23

    Makasih atas jawabannya….

  54. Habib says:

    makasi ya kak, saya benar2 terbantu dengan artikel kakak ini…
    nantinya akan saya gunakan untuk bisnis saya di http://habibnurrahman.com/tugupaypal/

  55. ilham says:

    ini yang saya cari untuk menu atas, bisa dinamis juga :D

  56. adi bowo says:

    saya mau tanya nie bozz,
    gini, saya mau pasang FadeSlideShow
    contohnya ada di http://www.dynamicdrive.com/dynamicindex14/fadeinslideshow.htm

    itukan ada 3 file bozz.
    fadeslideshow.js
    index.html
    dan
    jquery.min.js

    saya ada probelm di file “jquery.min.js”
    kalo online bisa. tp kalo off line kok gak bisa??

    padahal saya sudah copy source codenya.
    dan sya simpan difolder yang sama.

    saat offline saya pake web server Xampp
    mohon bantuannya ya bozz :)
    maa panjang… :)

  57. Mau tanya asp.net di buka di windows bisa gak sih.. kapan hari q ada script tapi tak buka pake xampp gak bisa..

    mohon pencerahannya..

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">

CAPTCHA