Я посмотрел на эту старую ветку на drupal.org, и это как бы заставляет мою голову крутиться. Срывать путь и пытаться разобрать NID изнутри? Там должен быть лучший путь.
И такие решения, как
global $node;
$nid = $node->nid;
не работают в моем пользовательском модуле (хотя мне сказали, что они работают в шаблонах?). Нет ошибок или чего-то еще, он просто $node
создается со NULL
значением.
Такое ощущение, что должно быть что-то действительно очевидное, что я скучаю.
Итак, как получить NID текущего узла без шаблона, следуя рекомендациям и создавая достаточно надежный модуль?
node/1
, иnode/2
т.д. Если вы все еще возникают проблемы , что может быть стоит размещение еще один вопрос с точным кодом , который вы используете, и обеспечить немного контекста. Тогда мы сможем точно определить, где происходит проблема$nid = ($node = menu_get_object()) ? $node->nid : NULL;
menu_get_object()
(или дажеnode_load()
), просто получает его из статического кэша. Даже если вы вызываете его на раннем этапе, он все равно будет загружен основным модулем позже в сборке страницы (поскольку это страница узла), в этом случае вы просто нагреваете статический кеш для следующего процессаСамый простой способ сделать это в Drupal 8, так как arg () больше не работает:
Изменить запись
источник
arg(0)
возвращает «узел» иarg(1)
возвращает нод.источник
Эта ссылка помогла мне: http://www.webomelette.com/node-id-nid-url-path-alias - Перейти к содержанию и отфильтровать вниз, чтобы найти содержимое, для которого вы хотите видеть идентификатор узла, и навести курсор на него. ссылка. Посмотрите вниз, чтобы увидеть гиперссылку, которую ваш браузер сообщает, что будет следовать, если вы нажмете на Изменить.
источник
Второй метод в принятом на данный момент ответе - самый чистый в D7. Первый ответ:
только визуально чище. На самом деле,
menu_get_object()
вызывает довольно много кода и может привести к непредвиденным ошибкам. Я использовал его внутриhook_node_grants()
функции и столкнулся с PHP-фатальной ошибкой:Объяснение можно найти по адресу /drupal//a/69232/9158.
Это было решено с помощью второго метода:
источник
В D8:
источник
Еще один вариант, в D7:
Если вы планируете использовать функцию за пределами вашего модуля, не используйте начальный _ в начале имени функции.
источник
источник