Geçerli düğümün NID'sini programlı olarak alma


26

Ben üzerinde gözenekli ettik drupal.org bu eski iplik ve sadece biraz başım döner etrafta yapar. Yolu aşağı çekmek ve içindeki NID'yi ayrıştırmaya çalışmak? Daha iyi bir yol olmalı.

Ve benzeri çözümler

global $node;
$nid = $node->nid;

Özel modülümde çalışmıyor (şablonlarda çalıştıkları söylenmeme rağmen). Hata veya hiçbir şey yok, sadece $nodebir NULLdeğeri ile başlatır .

Kaybettiğim gerçekten bariz bir şey olmalı gibi hissediyor.

Peki, mevcut düğümün NID'sini şablonsuz, en iyi uygulamaları takip ederken ve oldukça sağlam bir modül oluştururken nasıl elde edersiniz?

Yanıtlar:


50

Kodunuzun bir düğüm sayfası için çalıştığını varsayalım, çekirdek / Contrib modüllerinde en sık kullandığım yöntemleri ya menu_get_object()da arg():

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

veya

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}

Şahsen ilk metodu tercih ediyorum (şartlı atama bazı insanlar tarafından iyi bir fikir olarak görülmese de), fakat ikisi de mükemmel şekilde geçerli.


1
@Letharion Evet, her yaptığımda kendimi biraz suçlu hissediyorum;)
Clive

1
@ Hangi fonksiyondan çağırıyorsunuz? Ve bu kesinlikle sizin çağırdığınız bir düğüm sayfası mı?
Clive

1
@beth Onlar% 100 yol takma adı etkinleştirilmiş olarak çalışacaktır. Yol örtüşme ile ilgisi yoktur yönlendirici yolu olan menü öğesi, bir node/1, node/2hala sorun yaşıyorsanız o kullandığınız tam koduyla başka bir soru değerinde gönderme olabilir ve bağlamın biraz sağlayabilir vb. O zaman problemin nerede olduğunu tespit edebiliriz
Clive

1
Tek satırlı bir çözüm$nid = ($node = menu_get_object()) ? $node->nid : NULL;
timofey.com

3
@ sheldonkreger Düğüm zaten o noktadan yüklenmiş, menu_get_object()(veya hatta node_load()) statik önbellekten alıyor. Daha önce çağırmış olsanız bile, daha sonra sayfa yapısında (bu bir düğüm sayfası olduğu gibi) çekirdek bir modül tarafından yüklenecek, bu durumda bir sonraki işlem için statik önbelleği ısıtıyor olacaksınız
Clive

5

Arg () artık çalışmadığından, bunu Drupal 8'de yapmanın en kolay yolu:

$path_args = explode('/', current_path());
print $path_args[1];

Kayıt değiştir


2
Bu ayrıca Drupal 7'de de çalışır. Ancak, admin / yapı / bloklar gibi bir düğüm olmayan bir sayfadaysanız, geçersiz bir değer alırsınız (bu durumda, 'yapı'). Basitçe, path_args [1] 'in bir tamsayı olup olmadığını kontrol edin ve muhtemelen sorun değil.
sheldonkreger 15:14


1
@RobLoach ama arg () D8'de mevcut değil
Pouya Sanooei

4

arg(0)'node' ve ' arg(1)nid ' döndürür.

if (arg(0) == 'node' && is_numeric(arg(1))) {
  $nid = arg(1);
}

1

Bu bağlantılı bana yardımcı oldu: http://www.webomelette.com/node-id-nid-url-path-alias - İçeriğe gidin ve Düzenleme için Düğüm Kimliğini görmek istediğiniz içeriği bulmak için downt'a filtre uygulayın bağlantı. Tarayıcınızın Düzenle'yi tıklarsanız izleyeceğini söylediği köprüyü görmek için aşağıya bakın.


Merhaba Ana, Drupal Cevaplarına hoş geldiniz. Cevabınız iyi (ve girişim için oy kullandım), ancak soru nid'in programda nasıl alınacağını soruyor çünkü başlıkta 'bir modülden' yer alıyor.
Darvanen

1

Halihazırda kabul görmüş cevaptaki ikinci yöntem D7'deki en temiz yöntemdir . İlk cevap:

if ($node = menu_get_object()) {
  // Get the nid
  $nid = $node->nid;
}

sadece görsel olarak daha temiz. Aslında, menu_get_object()çok fazla kod çağırıyor ve öngörülemeyen hatalara neden olabilir. Bir hook_node_grants()fonksiyonun içinde kullanıyordum ve bir PHP Ölümcül hatayla karşılaştım:

'256' maksimum işlev yuvalama seviyesine ulaşıldı, iptal edildi!

Açıklama, https://drupal.stackexchange.com/a/69232/9158 adresinde bulunabilir.

Farkında olduğunuz sonsuz döngü, Drupal'ın menu_get_object()şu anda oturum açan kullanıcının düğüme erişimi olduğunu doğrulamasına neden olur; bu, uygulamanızın hook_node_grants()yeniden başlatılmasına menu_get_object()neden olur; bu, uygulamanızın hook_node_grants()tekrar başlatılmasına neden olur , hangi...

Bu ikinci yöntem kullanılarak çözüldü:

if (arg(0) == 'node' && is_numeric(arg(1))) {
  // Get the nid
  $nid = arg(1);

  // Load the node if you need to
  $node = node_load($nid);
}


-1

D7'deki başka bir seçenek:

function _my_module_get_nid() {
  $path_args = explode('/', current_path());
  //$nid = $path_args[1];
  if(is_int($path_args)) {
    return($path_args[1]);
  }
  // Log that we failed to load a NID.
  else {
    watchdog('my_module', 'Unable to gather NID at: ' . current_path(),  WATCHDOG_WARNING, NULL);
  return FALSE;
  }
}

Fonksiyonu modülünüzün dışında kullanmayı planlıyorsanız, fonksiyon adının başında öncüyü _ kullanmayın.


1
Bu aynı şeydir, ancak düğüm olmayan tüm yollarda pahalı bir bekçi çağrısı yapılır.
Beth

Kodumun beklenmedik bir şekilde başarısız olup olmadığını bilmek istiyorum. Bu kodun düğümler dışında çalıştırılmasını istemem, bekçi bana bunun nerede olduğunu gösterecek, böylece düzeltebilirim. Aksi takdirde, bu kodun sebepsiz bir şekilde çalıştığını izleyemem (düğüm dışı). Aksi halde yukarıda belirtilen D8 yöntemiyle aynıdır.
sheldonkreger 17:14

-1
<?php
if (isset($node->nid) && count($node->nid) > 0){
  $mynodeid = $node->nid;
}
?>

Lütfen cevabınıza biraz "neden" ve "nasıl" ekler misiniz?
Mołot

Çalıştırmadan önce düğümün tanımlanmış olup olmadığını kontrol eder.
cptstarling,
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.