Drupal - Получение идентификатора узла из представления для настройки ссылки в блоке

StackOverflow https://stackoverflow.com/questions/1668874

  •  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.

Есть несколько способов сделать это:

  1. Вы можете создавать свои блоки с помощью Views и передавать nid через аргумент.

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

Первый вариант намного проще, так что, если это соответствует вашим потребностям, я бы выбрал именно этот.

Новое о Drupal 7:Правильный способ получить идентификатор узла - это использовать функцию menu_get_object();

Пример:

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

В Drupal 8 есть другой метод.Зацени это:

arg() устарел

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top