Ada 5 (lima) tipe menu yang bisa dipakai ketika membuat menu pada custom module Drupal 6 dengan menggunakan hook_menu(), yaitu MENU_NORMAL_ITEM, MENU_CALLBACK, MENU_DEFAULT_LOCAL_TASK, MENU_LOCAL_TASK, dan MENU_SUGGESTED_ITEM. Masing-masing punya kegunaan sendiri-sendiri (lihat http://api.drupal.org/api/function/hook_menu/6 untuk penjelasan lebih lanjut). Kali ini saya coba membuat contoh untuk masing-masing menu tersebut.
Pertama kita buat dulu module drupalnya. Buat folder (untuk custom module kali ini saya pakai nama MyModule) mymodule di folder <drupal installation root>\Sites\drupal\sites\all\modules.

Lalu buat 2 (dua) buah file yaitu <nama module>.info dan <nama module>.module. Pada tulisan kali ini saya buat mymodule.info dan mymodule.module.

Buka mymodule.info dengan menggunakan text editor favorite anda (kebetulan saya pakai Notepad++), lalu ketik dan simpan code berikut:
name = My Module description = This is my custom module named My Module core = 6.x
Kemudian buka file mymodule.module untuk memulai coding custom module kali ini. Sebagai permulaan, ketikkan kode berikut pada file mymodule.module:
<?php
function mymodule_perm() {
return array('access mymodule', 'administer mymodule');
}
MENU_NORMAL_ITEM
Seperti pada tulisan sebelumnya, MENU_NORMAL_ITEM adalah menu standar yang tampil pada blok navigasi. Menu ini bisa dibuat sendiri-sendiri atau nested. Contoh kode:
...
function mymodule_menu() {
$items['normal-item'] = array(
'title' => t('Menu Normal Item'),
'page callback' => 'mymodule_function_1',
'access arguments' => array('access mymodule'),
'type' => MENU_NORMAL_ITEM
);
$items['normal-item/child-1'] = array(
'title' => t('Child 1'),
'page callback' => 'mymodule_function_child_1',
'access arguments' => array('access mymodule'),
'type' => MENU_NORMAL_ITEM
);
return $items;
}
function mymodule_function_1() {
return 'Hello from mymodule_function_1';
}
function mymodule_function_child_1() {
return 'Hello from mymodule_function_child_1';
}
...
Pada kode diatas, saya membuat 2 (dua) buah menu dengan tipe MENU_NORMAL_ITEM. Menu pertama menjadi parent dari menu kedua dan masing-masing menu memanggil function PHP yang dapat menjalankan tugas-tugas tertentu. Jika kita aktifkan mymodule, maka menu tersebut akan muncul secara otomatis di blok navigasi Drupal. Untuk user selain administrator, aktifkan permission access mymodule agar user tersebut dapat melihat menu ini.



MENU_CALLBACK
Hampir sama dengan MENU_NORMAL_ITEM, menu dengan tipe MENU_CALLBACK juga digunakan untuk memanggil fungsi-fungsi tertentu pada custom module. Perbedaannya adalah, MENU_CALLBACK tidak muncul secara otomatis di blok navigasi. Menu ini dapat diakses dengan menuliskan URL pada address bar browser.
Buat newbie seperti saya, biasanya MENU_CALLBACK saya pakai kalau saya ingin mengakses fungsi-fungsi pada module yang membutuhkan parameter. Kode berikut mungkin bisa menunjukkan bagaimana penggunaan MENU_CALLBACK:
...
$items['callback-item-1'] = array(
'title' => t('Menu Callback Item 1'),
'page callback' => 'mymodule_callback_function',
'access arguments' => array('access mymodule'),
'type' => MENU_CALLBACK
);
...
function mymodule_callback_function() {
return 'Hello from callback menu';
}
...
Untuk mengakses menu tersebut, ketikkan URL menu tersebut pada address bar browser. Asumsi Drupal diakses di http://localhost/drupal, maka untuk mengakses menu diatas dapat mengetikkan http://localhost/drupal/callback-item-1.
![]()

Contoh berikutnya adalah menu callback dengan parameter. Pada kode berikut ini saya akan membuat sebuah form untuk memasukkan nama yang kemudian nanti akan ditampilkan dengan menggunakan menu callback. Untuk mengakses form, saya membuat 1 (satu) menu normal dengan URL normal-item-2.
Pertama, buat menu normal untuk mengakses form dan menu callback untuk menampilkan sebuah halaman.
...
$items['normal-item-2'] = array(
'title' => t('Menu Normal Item 2'),
'page callback' => 'drupal_get_form',
'page arguments' => array('mymodule_callback_form'),
'access arguments' => array('access mymodule'),
'type' => MENU_NORMAL_ITEM
);
$items['callback-item-2/%'] = array(
'title' => t('Hello'),
'page callback' => 'mymodule_say_hi',
'access arguments' => array('access mymodule'),
'type' => MENU_CALLBACK
);
...
Lalu buat fungsi untuk menampilkan form.
...
function mymodule_callback_form() {
$form['nama'] = array(
'#type' => 'textfield',
'#title' => t('Type your name please'),
'#description' => t('E.g. Ekajati Winarmo'),
'#required' => TRUE
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Say Hi!')
);
return $form;
}
function mymodule_callback_form_submit($form, &amp;amp;amp;$form_state) {
$form_state['redirect'] = 'callback-item-2/'. $form_state['values']['nama'];
}
...
Setelah itu buat fungsi untuk menampilkan parameter dari form yang telah dibuat diatas.
...
function mymodule_say_hi() {
return 'Hi, ' . arg(1). ', welcome to Drupal 6';
}
...
Simpan kode diatas, lalu akses menu-normal-item-2. Bila menu belum muncul, clear dulu cache website dengan mengakses http://<drupal root>/admin/settings/performance dan klik tombol clear cache.
Bila menu-normal-item-2 diakses, maka Drupal akan menampilkan sebuah form dengan 1 (satu) buah textfield dan 1 (satu) buah tombol. Bila tombol di-klik, maka Drupal secara akan menampilkan halaman salam. Tanda % pada menu callback digunakan untuk menampung variable dari form. Sedangkan arg(1) digunakan untuk mengakses variable pada URL.

![]()

Bila tombol Say Hi! ditekan, maka Drupal akan menampilkan halaman seperti screenshot berikut.

MENU_DEFAULT_LOCAL_TASK & MENU_LOCAL_TASK
Menu tipe ini biasanya digunakan berpasangan. MENU_LOCAL_TASK digunakan untuk menampilkan menu dengan bentuk tab seperti contoh gambar berikut:

Ketika MENU_LOCAL_TASK digunakan sebagai menu, maka wajib ada satu menu default. Menu default ini menggunakan tipe MENU_DEFAULT_LOCAL_TASK dimana menu ini dengan tipe ini memiliki path yang sama dengan parent menu. Pada gambar diatas, View adalah menu default di menu My Account. Jadi ribet nih jelasinnya :D hehe mendingan liat contoh kode berikut:
...
$items['menu-tab'] = array(
'title' => t('Tabbed menu'),
'page callback' => 'mymodule_tabbed_menu',
'access arguments' => array('access mymodule'),
'type' => MENU_NORMAL_ITEM
);
$items['menu-tab/view'] = array(
'title' =>t('Tabbed menu'),
'type' => MENU_DEFAULT_LOCAL_TASK,
'weight' => 0
);
$items['menu-tab/admin'] = array(
'title' => t('Administer'),
'page callback' => 'mymodule_tabbed_admin',
'access arguments' => array('access mymodule'),
'type' => MENU_LOCAL_TASK,
'weight' => 1
);
...
function mymodule_tabbed_menu() {
return 'Hello from tabbed menu';
}
function mymodule_tabbed_admin() {
return 'Hello from admin tabbed menu';
}
Kode diatas akan menghasilkan tampilan seperti berikut ini:

Tampak Tabbed Menu otomatis terpilih sebagai default menu.
MENU_SUGGESTED_ITEM
Tipe menu ini hampir sama dengan MENU_NORMAL_ITEM. Perbedaannya adalah kalau MENU_NORMAL_ITEM akan muncul secara otomatis di blok navigasi, maka MENU_SUGGESTED_ITEM secara default disabled atau non-aktif. Menu tipe ini dapat diaktifkan atau enabled oleh admin (atau user yang memiliki hak) melalui halaman administer.
...
$items['suggested-item'] = array(
'title' => t('This is suggested menu'),
'page callback' => 'mymodule_suggested_item',
'access arguments' => array('access mymodule'),
'type' => MENU_SUGGESTED_ITEM
);
...
function mymodule_suggested_item() {
return 'Hello from suggested menu';
}
...
Menu tersebut akan tampak pada halaman administrasi menu (administer->site building->menu->navigation) seperti pada gambar berikut:

Yup, itu tadi cara membuat menu di custom module Drupal 6. Kalo ada kode-kode yang kurang efisien atau salah mohon dikoreksi soalnya saya juga masih newbie di Drupal :). Semoga bermanfaat.
Referensi: http://api.drupal.org
Full source code download di sini.
Thx infonya pak, saya sendiri juga penggemar drupal. Belajarnya sulit, tapi extensibilitasnya luar biasa ^^
Posted by Jiewa | October 15, 2009, 9:16 amsama2 jie :D saya juga masi blajar nih.. karena extensibilitasnya mantap ini lah makanya saya seneng :D
Posted by ojat | October 15, 2009, 9:44 aminfo sgt bagus… nyari kemana2 soal menu drupal akhirnya ketemu disini,terimakasih banyak pak… pengen selingkuh lebih dalam sama drupal nih hehe kayaknya dasyat banget.. jgn capek share ya pak :) :thumbs up:
Posted by fajar | June 27, 2010, 2:35 amdrupal memang dahsyat bro… syg saya lagi dipaksa selingkuh sama yg lain :( .. thx dah mampir
Posted by ojat | July 1, 2010, 10:56 ammau tanya, kalo bikin tabbed menu di dalam tabbed menu gmn..? thanks before..
Posted by hhh | October 29, 2009, 2:42 pm