web-gelistirme-sc.com

Hook_menu () 'i nasıl uygulamalıyım?

hook_menu() uygulamanın temelleri nelerdir?

Aynı ama farklı soruları tekrar tekrar cevaplamaktan kaçınmak için temelleri tek bir soruda ele almak istiyorum.

102
Letharion

Bu bilgi Drupal 6 ve 7 için geçerlidir. Drupal 8, hook_menu() ile değiştirildi yeni yönlendirme sistemi . Aşağıda üç basit adımda hook_menu() uyguluyoruz.

Adım bir

Boş modül nasıl oluşturulur bölümündeki 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

Aşağıdaki kodu modül dosyasına 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!" Mesajını görmelisin. Bu kadar! Tamamen çalışan bir hook_menu() uygulamanız var. Aşağıda, hook_menu() ile ilgili daha ileri düzey konular yer almaktadır. Özellikle, yukarıdaki sayfa herkes tarafından görülebileceğinden, izinler hakkında bilgi edinmek isteyebilirsiniz.

Argümanlar

Sayfa geri aramasına daha fazla veri iletmek istiyorsanız, bunu başarmak için sayfa bağımsız değişkenlerini kullanabilirsiniz. Sayfa bağımsız değişkenleri, sayfa geri aramasına iletilecek bir bağımsız değişkenler dizisi olmalıdır. Bağımsız değişken olarak bir tamsayı kullanılırsa, 0'dan başlayarak her eğik çizgi (/) için bir kez artırılan URL'nin bir bölümünü temsil eder. Aşağıdaki örnekte bu, 0'ın 'merhaba' haline getirileceği 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;
}

Dizeler kelimesi kelimesine gönderilecektir, bu nedenle array(0, 'world'), hello world Öğesinin tekrar dışarı çıkması için kullanılabilir.

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

"Joker karakterler", URL'den rastgele verileri kabul etmek için 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ünya ziyaret edildiğinde, $argument1world değerine eşit olacaktır.

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

Genellikle bir URL bağımsız değişkeni, örneğin bir varlığı tanımlayan sayı olacaktır. Bu kimliği karşılık gelen nesneye dönüştüren kodun kopyalanmasını önlemek için Drupal otomatik yüklemeyi destekler. Adlandırılmış bir joker karakter kullanıldığında, Drupal _load ile eklenmiş joker karakterle aynı ada sahip bir işlev için. Böyle bir işlev bulunursa, URL'deki değerin değeri ile çağrılır ve loader işlevi tarafından döndürülen her şey orijinal değer yerine sayfa geri çağrısına aktarılacak. Drupal zaten düğümleri yüklemek için böyle bir işlevi var, node_load() , düğümleri otomatik olarak yükleyip sayfanın geri aramasına aktarılır.

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 yapılması gerekebilir. Varsayılan olarak yalnızca adlandırılmış argüman yükleyiciye iletildiğinden, yükleyiciye hangi ek yük argümanlarının iletilmesi gerektiğini açıkça Drupal) belirtmek gerekir. Örneğin, düğümünde, node_load() düğüm düğümüne ve revizyon kimliğine geçmek gerekir, bu aşağıdaki kodla 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ç görüntülenebilir hale getirmek için gereklidir, ancak hiçbir şeyi kontrol etmesine izin vermediğinden neredeyse hiç ideal değildir. Ziyaret etmeye/merhaba etmeye çalışan herkese erişim izni verilir. Bir miktar kontrol ölçüsü sağlamanın en kolay yolu, yukarıdan sayfa geri araması gibi bir erişim geri araması sağlamaktır. Aşağıdaki kod hala herkese erişime izin verir, ancak mantığın erişim zamanında çağrılan bir işleve nasıl taşınacağını gösterir, böylece daha karmaşık mantığa izin verir.

/**
 * 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 genellikle gereksiz kodları çoğaltacağından, bu mutlaka en iyi yol değildir. Daha iyi bir yol, çoğu zaman user_access() kullanmaktır. Erişim geri araması ile erişim bağımsız değişkenleri ayarlamak mümkündür. Aşağıdaki kodla erişim kullanıcı profilleri iznine sahip sayfanın kullanıcılardan görüntülenmesini zorunlu kılmak 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 erişim geri araması user_access olduğundan, yukarıdaki kodda olduğu gibi dışarıda bırakılabilir.

Daha gelişmiş konular

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

147
Letharion