Bagaimana saya harus menerapkan hook_menu ()?


103

Apa dasar penerapannya hook_menu()?

Saya ingin melihat dasar-dasar yang tercakup dalam satu pertanyaan, untuk menghindari keharusan menjawab pertanyaan serupa yang sama tetapi berbeda berulang kali.

Jawaban:


148

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.

Langkah pertama

Buat modul kosong mengikuti instruksi di Cara membuat modul kosong . Dalam kode yang ditampilkan di sini, diasumsikan modul tersebut bernama helloworld .

Langkah dua

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!';
}

Langkah ketiga

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.

Argumen

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 worldkeluar 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, $argument1akan sama world.

Argumen autoloading

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));
}

Pemutakhiran otomatis tingkat lanjut

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));
}

Izin

'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.

Topik lebih lanjut

hook_menu()Dokumentasi resmi memberikan lebih banyak informasi tentang kasus penggunaan paling rumit untuk hook.


3
Luar biasa! Demi kelengkapan, titleproperti ini diperlukan untuk semua barang yang dikembalikan darihook_menu()
Clive

1
Saya tahu bahwa dokumen mengatakan demikian, tetapi ketika saya menguji di D7, itu tidak terjadi. Aku bisa menambahkannya ke contoh pertama saya kira, tapi aku ingin menjaga hal-hal yang mutlak minimum untuk membuatnya semudah mungkin.
Letharion

1
Saya akan mengatakan menambahkan judul ke halaman adalah salah satu hal minimum absolut yang ingin Anda lakukan dengan hook_menu () tapi itu adalah posting Anda: P Mungkin perlu memperbaiki kesalahan sintaks (contoh kode 2, 4, 5 & 6), sehingga orang dapat menyalin dan menempel
Clive

1
Argh, saya awalnya rajin benar-benar menjalankan kode, tetapi seiring berjalannya waktu saya menjadi lebih ceroboh dan mulai menyalin paste. Memperbaiki kesalahan sintaks, setidaknya yang saya lihat;) Ya, Anda benar bahwa seharusnya ada judul, jadi saya menambahkan satu ke contoh awal.
Letharion

1
Bagaimana saya bisa mendaftarkan file php ke path menggunakan hook_menu? Ini adalah file php tertulis khusus yang mencakup bootup drupal, menggunakan variabel sesi drupal dan menerima argumen yang merupakan id pengguna.
Елин Й.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.