2009-11-03 3 views
6

Как я могу создать блок в Drupal, который может отображать идентификатор узла страницы просмотра, на котором в данный момент находится блок?Drupal - Получение идентификатора узла из представления для настройки ссылки в блоке

Я использую представления для создания большого фрагмента моего сайта, но мне нужно иметь возможность создавать «интеллектуальные» блоки в режиме PHP, которые будут иметь динамический контент в зависимости от того, что отображается на экране.

Как найти $ nid, отображаемый в настоящее время?

+0

Я немного смущен относительно того, что вы подразумеваете под «представлением» здесь - вы имеете в виду виды из модуля views? Если да, то почему у них только один идентификатор узла? (Большинство представлений представляют собой коллекции узлов, но, возможно, у вас есть специальный сценарий использования) –

+0

Hiya - вы правы - я использую модуль views для поиска узлов, а затем корректно отформатируйте их. Вся информация об этих представлениях относится к одному узлу, хотя - мне просто нужно получить этот NID. – MrFidge

ответ

14

Вот более-надежный способ получения идентификатора узла:

<?php 
    // Check that the current URL is for a specific node: 
    if(arg(0) == 'node' && is_numeric(arg(1))) { 
     return arg(1); // Return the NID 
    } 
    else { // Whatever it is we're looking at, it's not a node 
     return NULL; // Return an invalid NID 
    } 
?> 

Этот метод работает, даже если у вас есть собственный путь для вашего узла w с модулями path и/или pathauto.

Просто для справки, если вы сделать не поворота на path модуле, URL по умолчанию, которые генерируют Drupal называется «системные путями» в документации. Если вы do включите модуль path, вы можете установить настраиваемые пути, которые называются «псевдонимами» в документации.

Так как у меня всегда включен модуль path, то первое, что меня смутило, было то, что функция arg всегда могла возвращать часть псевдонима, а не часть пути к системе.

Как оказалось, функция arg всегда будет возвращать системный путь, потому что the arg function is based on $_GET['q'] ... После небольшого исследования кажется, что $_GET['q'] всегда будет возвращать системный путь.

Если вы хотите получить путь от фактического запроса страницы, вам необходимо использовать $_REQUEST['q']. Если модуль path включен, $_REQUEST['q'] может возвращать либо псевдоним, либо системный путь.

+2

В соответствующем примечании, позволяющий модулю 'path' даст вам доступ к функции, называемой« drupal_lookup_path », которую вы можете использовать для поиска системного пути из псевдонима и наоборот. Дополнительную информацию см. В документации 'drupal_lookup_path': mparker17

+1

Кроме того, как только у вас есть идентификатор узла, вы можете использовать функцию node_load, чтобы получить всю информацию о этот узел: mparker17

+1

В зависимости от того, в каком контексте вы вставляете мой код, операторы 'return' могут не всегда иметь смысл ...вы можете заменить их '$ display_node =', если вам нужно вернуть что-то еще; но вам нужно получить NID для чего-то. – mparker17

1

Есть несколько способов, чтобы идти по этому поводу:

  1. Вы можете сделать ваши блоки с представлениями и проходят НИД через аргумент.

  2. Вы можете вручную передать нидер, обратившись к объекту $ view, используя следующий код. Это массив в $ view-> result. Каждая строка в представлении представляет собой объект в этом массиве, а нид - в этом объекте для каждого из них. Таким образом, вы можете запустить foreach на этом и легко получить весь из всех строк в представлении.

Первый вариант намного проще, поэтому, если это соответствует вашим потребностям, я бы пошел с этим. Надеюсь, это поможет!

+0

Вариант 1 не работает, я боюсь - он мог бы выбрать аргумент вверх, но аргумент был отформатирован неправильно для того, что мне нужно - он продолжал использовать псевдоним, а не nodeID. – MrFidge

+0

. Вы можете проверить параметр под аргументом передать идентификатор узла из URL-адреса, если аргумент отсутствует. Или вы можете проверить код PHP-кода и ввести что-то вроде: $ url = explode ('/', $ _ GET ['q']); return $ url [1]; – theunraveler

1

Вы должны рассмотреть модуль панелей. Это очень большой модуль и требует некоторой работы, прежде чем вы действительно сможете использовать его потенциал. Поэтому возьмите это в соображение.

Вы можете использовать его для настройки страницы, содержащей несколько видов/блоков, которые могут быть размещены в разных регионах. Он использует концепцию, называемую контекстом, которая может быть чем-то связанным с тем, что вы просматриваете. Вы можете использовать этот контекст, чтобы определить, какой узел просматривается, и не только изменять блоки, но и макет. Это также немного более чисто, так как вы можете переместить код PHP из интерфейса администратора.

На боковой ноте это также написано автором взглядов.

+0

Я смотрел на панели раньше, не очень понял, возможно, это могло быть время ^^ – MrFidge

2

В конце концов этот сниппет выполнил эту работу - он просто лишил чистый URL и сообщил последний аргумент.

<?php 
    $refer= $_SERVER ['REQUEST_URI']; 
    $nid = explode("/", $refer); 
    $nid = $nid[3]; 
?> 

Учитывая комментарий ответ, выше, вероятно, сводится к этому, с помощью функции Drupal arg(), чтобы получить часть пути запроса:

<?php 
    $nid = arg(3); 
?> 
+0

Вы должны взглянуть на функцию arg() для извлечения аргументов из пути drupal - см .: http: // api.drupal.org/api/function/arg/6 –

+0

Henrik - это идеальный! Проработал сон. – MrFidge

+0

+1 для публикации с найденным решением. –

0

Эта тема довольно старая, я вижу. Чтобы немного освежить что-то новое о Drupal 7, правильный способ получить идентификатор узла использует функцию menu_get_object();

examp:

$node = menu_get_object(); 
$contentType = node_type_get_name($node); 

Drupal 8 имеет другой метод. Проверьте это

arg() is deprecated

Надеется, что это помогает!