Hook_menu () uygulamasını nasıl uygulamalıyım?


103

Uygulamanın temelleri nelerdir hook_menu()?

Aynı, ancak farklı soruları tekrar tekrar cevaplamak zorunda kalmamak için tek bir soruda ele alınan temel konuları görmek isterim.

Yanıtlar:


148

Bu bilgiler Drupal 6 ve 7 için geçerlidir. Drupal 8'de yeni yönlendirme sistemi ilehook_menu() değiştirilmiştir . Aşağıda üç basit adımda uyguluyoruz .hook_menu()

Adım bir

Boş bir modül nasıl oluşturulur? Konusundaki talimatları izleyerek boş bir modül oluşturun . Burada gösterilen kodda, modülün helloworld olarak adlandırıldığı varsayılmaktadır .

İkinci adım

Modül dosyasına aşağıdaki kodu ekleyin.

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

Adım üç

Modülü etkinleştirin ve http://example.com/hello adresini ziyaret edin . (Example.com'u sunucunuzun etki alanı adıyla değiştirin.)
"Merhaba dünya!" İletisini görmelisiniz. Bu kadar! Tamamen çalışan bir hook_menu()uygulamanız var. Aşağıda, ilgili daha gelişmiş konular bulunmaktadır hook_menu(). Özellikle, yukarıdaki sayfa herkes tarafından görüntülenebileceği için izinleri okumak isteyebilirsiniz.

Argümanlar

Sayfa geri aramasına daha fazla veri iletmek istiyorsanız, bunu başarmak için sayfa değişkenlerini kullanabilirsiniz. Sayfa argümanları, sayfa geri aramasına iletilecek bir argüman dizisi olmalıdır. Bir tamsayı argüman olarak kullanılırsa, 0'dan başlayarak her eğik çizgi (/) için bir kez artan, URL'nin bir bölümünü temsil eder. Aşağıdaki örnekte, bu 0'ın 'merhaba' olacağı anlamına gelir.

function helloworld_menu() {
  $items['hello'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(0),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

İpler sözlü olarak gönderilecektir, bu yüzden tekrar array(0, 'world')çıkmak için kullanılabilir hello world.

function helloworld_page($argument1, $argument2) {
  return $argument1 . ' ' . $argument2;
}

URL’den rasgele verileri kabul etmek için "Joker karakterler" kullanılabilir.

function helloworld_menu() {
  $items['hello/%'] = array(
    'page callback' => 'helloworld_page',
    'page arguments' => array(1),
  );

  return $items;
}

function helloworld_page($argument1) {
  return $argument1;
}

Merhaba / dünyayı ziyaret etmek $argument1eşit olacaktır world.

Bağımsız değişken otomatik yükleme

Genellikle bir URL argümanı, örneğin bir varlığı tanımlayan numara olacaktır. Bu kimliği karşılık gelen nesnesine dönüştüren kodu kopyalamaktan kaçınmak için Drupal, "adlandırılmış" joker karakterleri otomatik olarak yükler. Adlandırılmış bir joker karakter kullanıldığında, Drupal, joker karakterle aynı adı taşıyan bir işlevi kontrol eder _load. Böyle bir işlev bulunursa, URL'deki değerin değeriyle çağrılır ve yükleyici işlevi tarafından döndürülen her şey, orijinal değer yerine geri arama sayfasına iletilir. Drupal, düğüm yükleme için zaten böyle bir işleve sahip olduğundan node_load(), düğümleri otomatik olarak yükleyip sayfa geri aramasına geçirebiliriz.

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

Gelişmiş otomatik yükleme

Bazen birden fazla argümana dayanarak daha fazla otomatik yükleme yapmak gerekebilir. Yalnızca adlandırılmış değişken varsayılan olarak yükleyiciye iletildiğinden, açıkça Drupal'a hangi ek yük değişkenlerinin yükleyiciye iletilmesi gerektiğini söylemesi gerekir. Örneğin, bir düğümün belirli bir revizyonunu yüklemek için, node_load()bir düğüm kimliğine ve bir revizyon kimliğine geçmek gerekir . Bu, aşağıdaki kod ile gerçekleştirilebilir.

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

İzinler

'access callback' => TRUE,Yukarıdaki basit örneği hiçbir zaman görülebilir kılmak için gereklidir, ancak hiçbir zaman kontrol edemediği için pek ideal değildir. Ziyaret etmeye / merhaba girişmeye çalışan herkese erişim hakkı verilecek. Bir miktar kontrol önlemi sağlamanın en kolay yolu, yukarıdan sayfa geri çağırma gibi bir erişim geri çağrısı sağlamaktır. Aşağıdaki kod, yine de herkese erişime izin verir, ancak mantığın erişim zamanında çağrılan bir işleve nasıl taşınacağını ve böylece daha karmaşık bir mantığa izin verildiğini gösterir.

/**
 * 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;
}

Özel bir işlev kullanmak çoğu zaman gereksiz yere kod kopyalayacağından, bu en iyi yol değildir. Çoğu zaman kullanmak için daha iyi bir yol olacaktır user_access(). Birlikte, geri arama erişimi, erişim argümanlarını ayarlamak mümkündür. Aşağıdaki kod ile sayfanın erişim kullanıcı profilleri iznine sahip kullanıcılar tarafından görüntülenebilmesini istemek mümkündür .

/**
 * 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;
}

Varsayılan olarak geri arama erişimi user_access olduğundan, yukarıdaki koddaki gibi bırakılabilir.

Daha ileri konular

Resmi hook_menu()belgeler, kanca için en karmaşık kullanım durumları hakkında daha fazla bilgi sağlar.


3
Korku veren! Tamamen iyiliği için titlemülk, iade edilen tüm ürünler için gereklidirhook_menu()
Clive

1
Doktorların söylediğini biliyorum, ama D7'de test ettiğimde, durum böyle değildi. Tahmin edebileceğim ilk örneğe ekleyebilirdim, ancak olabildiğince kolay hale getirmek için işleri mutlak düzeyde tutmak istedim .
Letharion

1
Bir sayfaya başlık eklemek, hook_menu () ile yapmak isteyebileceğiniz en düşük minimum şeylerden biri olduğunu söyleyebilirim, ancak bu senin görevin: P 6), böylece insanlar kopyalayıp yapıştırabilir
Clive

1
Argh, başlangıçta kodu çalıştırmakta gayretli davrandım, ancak zaman geçtikçe daha da uçuklaştı ve kopya yapıştırmaya başladım. En azından gördüğüm sözdizimi hataları düzeltildi;) Eh, elbette bir başlık olması doğru , bu yüzden ilk örneğe bir tane ekledim.
Letharion

1
Hook_menu kullanarak bir php dosyasını bir yola nasıl kaydedebilirim? Bu drupal bootstrap içeren, drupal oturum değişkenlerini kullanan ve bir kullanıcı kimliği olan bir argümanı kabul eden özel bir yazılı php dosyasıdır.
Елин Й.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.