Düğüm kimliğini URL’den nasıl alabilirim?


47

Şimdiye kadar Drupal 7'de bu 3 fonksiyonla karşılaştım, ancak aralarındaki farkın ne olduğundan ve düğüm kimliğini blok ön işleme fonksiyonunda almak için daha uygun olduğundan emin değilim.

Bana bir fikir verebilir misin?


Bunu node.tpl.php dosyasında mı yapıyorsunuz? Evetse, $ node-> nid kullanabilirsiniz.
Bart

Hayır, bunu blok ön işleme işlevinde yapıyorum, ancak blok düğüm sayfasında yazdırılıyor.
silkAdmin

Yanıtlar:


63

Aralarındaki farkın ne olduğundan emin değilim.

  • menu_get_object () , gösterilen sayfa ile ilişkilendirilmiş nesneyi döndürür. Drupal, example.com/node/1 sayfasını gösterirken kod çalıştırılırsa menu_get_object(), kimliği 1 olan düğüm için düğüm nesnesini döndürür; Gösterilen sayfa example.com/user/1 ise, menu_get_object('user')kimliği 1 olan kullanıcı için kullanıcı nesnesini döndürecektir.
  • menu_get_item () , "menu_router" tablosundaki her alan için bir dizin içeren bir dizi döndürür. Bu içerir:
    • yol: Menü geri aramasının geçerli yolu
    • load_functions: node_loadgeçerli yolun bir kısmına karşılık gelen bir nesneyi yüklemek için çağrılacak bir işlev isimleri dizisi (benzeri )
    • access_callback: giriş yapmış olan kullanıcının menü öğesine erişip erişmediğini kontrol eden geri arama
    • page_callback: sayfayı oluşturan işlevin ismi
    • başlık: menü öğesiyle ilişkilendirilmiş sayfanın başlığı
  • drupal_lookup_path () , bağımsız değişken olarak iletilen diğer adla ilişkilendirilmiş dahili yolu döndüren işlevdir. "Ana sayfa" example.com/node/1 ile ilişkilendirilmiş diğer ad ise, drupal_lookup_path("homepage")geri dönecektir "node/1". Yol takma adları, yalnızca düğüm yollarıyla değil, herhangi bir iç yolla ilişkilendirilebilir.

ve bir blok ön işleme fonksiyonunda düğüm kimliğinin elde edilmesi için daha uygundur.

Tüm almak istediğiniz şu anda gösterilen düğümün düğüm kimliği ise, aşağıdaki kodu kullanmanız yeterlidir:

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

Düğüm nesnesini almanız gerekirse, aşağıdaki kodu kullanabilirsiniz:

if ($node = menu_get_object()) {
  // Use the node object.
}

Bu parçacıklardan ikincisi daha iyidir çünkü node / 1 / revisions / 3 / view gibi dahili yollar için doğru node nesnesini döndürür.

Sayfa veya düğüm gibi bazı önişleme işlevlerinin zaten bir a'ya sahip olduğunu unutmayın $variables['node']. Bunun anlamı, bu durumlarda, sadece önişleme işlevinizde, hangi işlevi kullanacağınız konusunda endişelenmeden aşağıdaki pasajı kullanmanız gerektiğidir.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

Diğer ön işleme işlevleri için, düğüm nesnesini içeren herhangi bir değişken olup olmadığını görmek için belgelere bakın. Örneğin, bunun için böyledir template_preprocess_comment()yapan $variables['node']yorumlar için önişlem fonksiyonları için kullanılabilir.



4

Dikkat etmeniz gereken tek şey yol takma adıdır.

drupal_get_normal_path($path)

Geçerli yolu almak için sistem değişkenini kullanın. $_SERVER["REQUEST_URI"]

(Çağırabileceğiniz düğüm sayfasındaysanız $node->uri['path'], bu bir takma ad olmayan yolu döndürür. Sonra yine düğüm sayfasındaysanız, sadece kullanabilirsiniz $node->nid.)

bu, düğüm / XXXX döndürür

öyleyse bir şey dene

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];

3
arg(1);

Bunu yapmanın kötü bir yolu değil. arg () dahili yolda çalışır, bu nedenle yolun diğer adından etkilenmez.


Bu doğrudur, yol takma adlarından etkilenmez. Fakat eğer XXXXX düğümündeyseniz, $ node-> nid komutunu kullanabilirsiniz. @French, başka nerede arg (1) kullanırdınız ve istediğinizi geri verirdi?
iStryker

Bir modül kancasındaysanız, düğüme erişiminiz olmaz. Gösterim argümanları da bir örnek olabilir.
Jeremy French,

teşekkürler jeremy ve istryker, sorumu daha da açıklığa kavuşturarak sorumu güncelleştirdim .. Her iki çözümünüzü de deneyeceğim, teşekkürler
silkAdmin

1
Arg () kullanmak çok kötü bir fikirdir, kendinizi bir yola bağlarsınız, kullanırsınız menu_get_object(sadece sarılıdır, menu_get_itemböylece eşit derecede iyidir).

if (arg(0) == 'node' && is_numeric(arg(1)))o arg(1)zaman neredeyse% 99'u size bir düğüm kimliği döndürür. Ama bir tek kişi arg(1)size birçok başka kimlik de verebilir.
leymannx

2

Drupal 8’de, rotadakilere göre url argümanları alabilirsiniz.

Kimliği tek başına almak için:

$nid = \Drupal::routeMatch()->getRawParameter('node');

Düğüm nesnesini yüklemeyi planlıyorsanız, onu şu şekilde elde edebilirsiniz:

$node = \Drupal::routeMatch()->getParameter('node');

Parametre adlarını bulmak için kullanabilirsiniz:

$possible_parameters = \Drupal::routeMatch()->getParameters();
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.