Как получить идентификатор узла из URL-адреса?

До сих пор я сталкивался с этими 3 функциями в Drupal 7, но я не совсем уверен, что такое разница между ними, и что больше подходит для получения идентификатора узла в функции препроцессора блока.

Можете ли вы дать мне представление?

45 голосов | спросил silkAdmin 8 J000000Friday11 2011, 16:15:14

5 ответов


61
  

Я не уверен, что разница между ними

  • menu_get_object () возвращает связанный с объектом объект с отображаемой в настоящее время страницей. Если код выполняется, когда Drupal показывает страницу example.com/node/1, то menu_get_object() вернет объект узла для узла, чей идентификатор равен 1; если отображаемая страница - example.com/user/1, то menu_get_object('user') вернет объект пользователя для пользователя с идентификатором 1.
  • menu_get_item () возвращает массив, содержащий индекс для каждого поля, содержащегося в таблице «menu_router». Это включает:
    • путь: текущий путь обратного вызова меню
    • load_functions: массив имен функций (например, node_load), который вызывается для загрузки объекта, соответствующего части текущего пути
    • access_callback: обратный вызов, который проверяет, имеет ли пользователь, который в настоящий момент вошел в систему, элемент меню
    • page_callback: имя функции, отображающей страницу
    • title: заголовок страницы, связанной с пунктом меню
  • drupal_lookup_path () - это функция, которая возвращает вам внутренний путь, связанный с псевдонимом, переданным как аргумент. Если «домашняя страница» является псевдонимом, связанным с example.com/node/1, то drupal_lookup_path("homepage") возвращает "node/1". Пути-псевдонимы могут быть связаны с любыми внутренними путями, а не только с путями узлов.
  

и который более подходит для получения идентификатора узла в функции препроцессора блока.

Если все, что вы хотите получить, - это идентификатор узла текущего узла, то вам просто нужно использовать следующий код:

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

Если вам нужно получить объект узла, вы можете использовать следующий код:

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

Из этих фрагментов второй лучше, поскольку он возвращает правильный объект узла для внутренних путей, таких как node /1 /revisions /3 /view.

Имейте в виду, что некоторые функции препроцесса, такие как те, что для страницы, или узел, уже имеют $variables['node']. Это означает, что в этих случаях вам просто нужно использовать следующий фрагмент в вашей функции препроцесса, не беспокоясь о том, какую функцию использовать.

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

Для других функций препроцесса проверьте документацию, чтобы увидеть, есть ли какая-либо переменная, содержащая объект узла. Например, это относится к template_preprocess_comment() , который делает $variables['node'] доступными для функций препроцесса для комментариев.

ответил kiamlaluno 8 J000000Friday11 2011, 23:44:11
7

Как это делается в Drupal Core template_preprocess_page :

Линия 2267 theme.inc и далее:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page использует menu_get_object . После этого нужно только проверить, определен ли узел и получить $ node-> nid.

ответил Bart 8 J000000Friday11 2011, 19:09:48
4

Одна вещь, которую вы должны быть осторожны, - это псевдоним пути.

drupal_get_normal_path($path)

, чтобы получить текущий путь, используйте системную переменную $_SERVER["REQUEST_URI"]

(Если вы находитесь на странице узла, вы можете вызвать $node->uri['path'], это вернет путь без псевдонима. Затем снова, если вы находитесь на узле страницы, вы можете просто использовать $node->nid.)

это приведет к возврату узла /XXXX

, попробуйте что-то вроде

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];
ответил iStryker 8 J000000Friday11 2011, 16:34:52
3
arg(1);

Неплохой способ сделать это. arg () работает на внутреннем пути , поэтому на него не будут влиять псевдонимы путей.

ответил Jeremy French 8 J000000Friday11 2011, 17:17:38
1

В Drupal 8 вы можете получить аргументы url на основе того, что находится в маршрутизации.

Чтобы получить только один:

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

Если вы планируете загрузить объект узла, вы можете просто получить его следующим образом:

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

Чтобы найти имена параметров, вы можете использовать:

$possible_parameters = \Drupal::routeMatch()->getParameters();
ответил oknate 25 Maypm16 2016, 22:37:35

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132