До сих пор я сталкивался с этими тремя функциями в Drupal 7, но я не совсем уверен, в чем разница между ними, и какая из них больше подходит для получения идентификатора узла в функции предварительной обработки блока.
Можете ли вы дать мне какое-либо понимание?
Ответы:
menu_get_object()
вернет объект узла для узла, чей ID равен 1; если отображается страница example.com/user/1, тоmenu_get_object('user')
будет возвращен объект пользователя для пользователя, чей ID равен 1.node_load
), которые будут вызваны для загрузки объекта, соответствующего части текущего путиdrupal_lookup_path("homepage")
вернется"node/1"
. Псевдонимы путей могут быть связаны с любыми внутренними путями, а не только с путями узлов.Если все, что вы хотите получить - это идентификатор узла, показанного в данный момент, вам просто нужно использовать следующий код:
Если вам нужно получить объект узла, то вы можете использовать следующий код:
Из этих фрагментов второй лучше, так как он возвращает правильный объект узла для внутренних путей, таких как представление узла / 1 / revisions / 3 /.
Имейте в виду, что некоторые функции предварительной обработки, такие как функции для страницы или узла, уже имеют
$variables['node']
. Это означает, что в этих случаях вам просто нужно использовать следующий фрагмент в функции предварительной обработки, не беспокоясь о том, какую функцию использовать.Для других функций предварительной обработки, проверьте документацию, чтобы видеть, есть ли какая-либо переменная, содержащая объект узла. Например, это тот случай,
template_preprocess_comment()
когда$variables['node']
для функций предварительной обработки доступны комментарии.источник
Как это сделать на странице template_preprocess_page в Drupal Core :
Строка 2267 из theme.inc и далее:
template_preprocess_page использует menu_get_object . После этого нужно просто проверить, определен ли узел, и получить $ node-> nid.
источник
Вы должны быть осторожны с псевдонимом пути.
drupal_get_normal_path($path)
чтобы получить текущий путь, используйте системную переменную
$_SERVER["REQUEST_URI"]
(Если вы находитесь на странице узла, которую можете вызвать
$node->uri['path']
, это вернет путь без псевдонима. С другой стороны, если вы находитесь на странице узла, вы можете просто использовать$node->nid
.)это вернет узел / XXXX
так что попробуйте что-то вроде
источник
Это не плохой способ сделать это. arg () работает с внутренним путем, поэтому псевдонимы пути на него не влияют.
источник
menu_get_object
(который просто оборачивается,menu_get_item
так что это одинаково хорошо).if (arg(0) == 'node' && is_numeric(arg(1)))
тогдаarg(1)
почти до 99% вернет вам идентификатор узла. Но толькоarg(1)
может также вернуть вам много других удостоверений личности.В Drupal 8 вы можете получить URL-аргументы, основанные на маршрутизации.
Чтобы получить идентификатор один:
Если вы планируете загрузить объект узла, вы можете просто получить его следующим образом:
Чтобы найти имена параметров, вы можете использовать:
источник