Jawaban:
Informasi ini berlaku untuk Drupal 6 dan 7. Dalam Drupal 8, hook_menu()
telah digantikan oleh sistem perutean baru . Di bawah ini kami terapkan hook_menu()
dalam tiga langkah sederhana.
Buat modul kosong mengikuti instruksi di Cara membuat modul kosong . Dalam kode yang ditampilkan di sini, diasumsikan modul tersebut bernama helloworld .
Tambahkan kode berikut ke file modul.
/**
* Implements hook_menu().
*/
function helloworld_menu() {
$items['hello'] = array(
'title' => 'Hello world!',
'page callback' => 'helloworld_page',
'access callback' => TRUE,
);
return $items;
}
/**
* Page callback for /hello.
*/
function helloworld_page() {
return 'Hello world!';
}
Aktifkan modul, dan kunjungi http://example.com/hello . (Ganti example.com dengan nama domain untuk server Anda.)
Anda akan melihat pesan "Halo dunia!". Itu dia! Anda memiliki hook_menu()
implementasi yang berfungsi penuh . Berikut ini adalah berbagai topik lanjutan lainnya hook_menu()
. Secara khusus, Anda mungkin ingin membaca tentang izin, karena halaman di atas dapat dilihat oleh siapa saja.
Jika Anda ingin meneruskan lebih banyak data ke panggilan balik halaman, Anda dapat menggunakan argumen halaman untuk mencapai ini. Argumen halaman harus berupa array argumen untuk diteruskan ke halaman panggilan balik. Jika integer digunakan sebagai argumen, ia akan mewakili bagian dari URL, mulai dari 0, bertambah satu kali untuk setiap garis miring (/). Pada contoh berikut, ini berarti 0 akan berubah menjadi 'halo'.
function helloworld_menu() {
$items['hello'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(0),
);
return $items;
}
function helloworld_page($argument1) {
return $argument1;
}
String akan dikirim pada kata demi kata, sehingga array(0, 'world')
dapat digunakan untuk hello world
keluar lagi.
function helloworld_page($argument1, $argument2) {
return $argument1 . ' ' . $argument2;
}
"Wildcard" dapat digunakan untuk menerima data sewenang-wenang dari URL.
function helloworld_menu() {
$items['hello/%'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(1),
);
return $items;
}
function helloworld_page($argument1) {
return $argument1;
}
Mengunjungi halo / dunia, $argument1
akan sama world
.
Seringkali argumen URL akan menjadi nomor yang mengidentifikasi, misalnya, suatu entitas. Untuk menghindari duplikasi kode yang mengubah ID ini menjadi objek yang sesuai, Drupal mendukung autoloading untuk wildcard "bernama". Ketika wildcard bernama digunakan, Drupal akan memeriksa suatu fungsi dengan nama yang sama dengan wildcard, yang diakhiri dengan _load
. Jika fungsi seperti itu ditemukan, itu akan dipanggil dengan nilai nilai dalam URL, dan apa pun yang dikembalikan oleh fungsi loader akan diteruskan ke halaman panggilan balik di tempat nilai aslinya. Karena Drupal sudah memiliki fungsi seperti itu untuk memuat node node_load()
, kita bisa mendapatkan node yang otomatis dimuat dan diteruskan ke halaman panggilan balik.
function helloworld_menu() {
$items['hello/%node'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(1),
);
return $items;
}
function helloworld_page($node) {
return t('Hello node (ID = !nid)', array('!nid' => $node->nid));
}
Terkadang, perlu memuat secara otomatis lebih dari satu argumen. Karena hanya argumen yang dinamai yang dilewatkan ke loader secara default, seseorang perlu secara eksplisit memberi tahu Drupal mana argumen beban tambahan yang harus diteruskan ke loader. Misalnya, untuk memuat revisi tertentu dari sebuah simpul, perlu untuk meneruskan ke node_load()
ID simpul dan ID revisi. Itu bisa dicapai dengan kode berikut.
function helloworld_menu() {
$items['hello/%node/revision/%'] = array(
'page callback' => 'helloworld_page',
'page arguments' => array(1),
'load arguments' => array(3),
);
return $items;
}
function helloworld_page($node) {
return t('Hello node (ID = !nid, revision ID = !rid)', array('!nid' => $node->nid, '!rid' => $node->vid));
}
'access callback' => TRUE,
diperlukan untuk membuat contoh sederhana di atas dapat dilihat sama sekali, tetapi itu hampir tidak ideal, karena tidak memungkinkan kontrol apa pun. Siapa pun yang mencoba mengunjungi / halo akan diberikan akses. Cara termudah untuk memberikan beberapa ukuran kontrol, adalah dengan memberikan akses panggilan balik, seperti halnya panggilan balik halaman dari atas. Kode berikut masih memungkinkan akses ke siapa pun, tetapi menunjukkan cara memindahkan logika ke fungsi yang disebut pada waktu akses, sehingga memungkinkan logika yang lebih kompleks.
/**
* Implements hook_menu().
*/
function helloworld_menu() {
$items['hello'] = array(
'page callback' => 'helloworld_page',
'access callback' => 'helloworld_access',
);
return $items;
}
/**
* Access callback for /hello.
*/
function helloworld_access() {
return TRUE;
}
Ini belum tentu cara terbaik, karena menggunakan fungsi kustom akan sering menduplikasi kode. Cara yang lebih baik adalah, sebagian besar waktu, untuk digunakan user_access()
. Bersama dengan callback akses dimungkinkan untuk mengatur argumen akses. Dimungkinkan untuk meminta halaman agar dapat dilihat dari pengguna dengan izin akses profil pengguna dengan kode berikut.
/**
* Implements hook_menu().
*/
function helloworld_menu() {
$items['hello'] = array(
'page callback' => 'helloworld_page',
'access callback' => 'user_access',
'access arguments' => array('access user profiles'),
);
return $items;
}
Karena akses panggilan balik secara default adalah user_access, itu dapat ditinggalkan, seperti dalam kode di atas.
hook_menu()
Dokumentasi resmi memberikan lebih banyak informasi tentang kasus penggunaan paling rumit untuk hook.
title
properti ini diperlukan untuk semua barang yang dikembalikan darihook_menu()