Drupal - Получение идентификатора узла из представления для настройки ссылки в блоке
-
13-09-2019 - |
Вопрос
Как я могу создать блок в Drupal, который способен отображать идентификатор узла страницы просмотра, на которой в данный момент находится блок?
Я использую представления для создания большого фрагмента моего сайта, но мне нужно иметь возможность создавать "интеллектуальные" блоки в режиме PHP, которые будут иметь динамическое содержимое в зависимости от того, что отображается в представлении.
Как я могу найти $ nid, который в данный момент отображается в представлении?
Решение
Вот более надежный способ получения идентификатора узла:
<?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
}
?>
Этот метод работает, даже если у вас есть пользовательский путь для вашего узла с path
и/или pathauto
модули.
Просто для справки, если вы не надо включите path
модуль, URL-адреса по умолчанию, которые генерирует Drupal, в документации называются "системными путями".Если вы делай включите path
модуль, вы можете установить пользовательские пути, которые в документации называются "псевдонимами".
Поскольку у меня всегда есть path
модуль включен, одна вещь, которая поначалу меня смутила, заключалась в том, было ли когда-либо возможно для arg
функция для возврата части псевдонима, а не части системного пути.
Как выясняется, в arg
функция всегда будет возвращать системный путь, потому что в arg
функция основана на $_GET['q']
...После небольшого исследования кажется, что $_GET['q']
всегда будет возвращать системный путь.
Если вы хотите получить путь из фактического запроса страницы, вам нужно использовать $_REQUEST['q']
.Если в path
модуль включен, $_REQUEST['q']
может возвращать либо псевдоним, либо системный путь.
Другие советы
Для решения, особенно такого, которое включает аргумент view в середине пути, подобного department/%/list
, смотрите запись в блоге Идентификатор узла в качестве аргумента просмотра из URL-адреса, удобного для SEO.
В конце концов, этот фрагмент сделал свое дело - он просто очистил URL - АДРЕС и доложил о самом последнем аргументе.
<?php
$refer= $_SERVER ['REQUEST_URI'];
$nid = explode("/", $refer);
$nid = $nid[3];
?>
Учитывая ответ на комментарий, вышесказанное, вероятно, было сведено к этому, используя Drupal arg()
функция для получения части пути запроса:
<?php
$nid = arg(3);
?>
Вам следует рассмотреть модуль panels.Это очень большой модуль, и требуется некоторая работа, прежде чем вы действительно сможете раскрыть его потенциал.Так что примите это во внимание.
Вы можете использовать его для настройки страницы, содержащей несколько представлений / блоков, которые могут быть размещены в разных регионах.Он использует концепцию, называемую контекстом, которая может быть чем угодно, связанным с тем, что вы просматриваете.Вы можете использовать этот контекст, чтобы определить, какой узел просматривается, и изменять не только блоки, но и макет.Это также немного более чисто, так как вы можете убрать PHP-код из интерфейса администратора.
Кстати, это также написано автором views.
Есть несколько способов сделать это:
Вы можете создавать свои блоки с помощью Views и передавать nid через аргумент.
Вы можете вручную ввести nid, обратившись к
$view
возразите, используя приведенный ниже код.Это массив в$view->result
.Каждая строка в представлении является объектом в этом массиве, и nid находится в этом объекте для каждого из них.Таким образом, вы могли бы запустить foreach для этого и довольно легко получить все nid всех строк в представлении.
Первый вариант намного проще, так что, если это соответствует вашим потребностям, я бы выбрал именно этот.
Новое о Drupal 7:Правильный способ получить идентификатор узла - это использовать функцию menu_get_object();
Пример:
$node = menu_get_object();
$contentType = node_type_get_name($node);
В Drupal 8 есть другой метод.Зацени это: