如何从URL获取节点ID? -- 7 领域 和 uri 领域 drupal 相关 的问题

How do I get the node ID from the URL?


47
vote

问题

中文

到目前为止,我在Drupal 7中遇到了这3个功能,但我并不真正确定它们之间的区别是什么,并且更批准以在块预处理函数中获取节点ID。

  • menu_get_object()
  • menu_get_item()
  • drupal_lookup_path()

你能给我任何洞察力吗?

英文原文

So far, I came across these 3 functions in Drupal 7, but I am not really sure what the difference between them is, and which is more appropriated to get the node ID in a block preprocess function.

  • menu_get_object()
  • menu_get_item()
  • drupal_lookup_path()

Can you give me any insight?

     
   
   

回答列表

64
 
vote
vote
最佳答案
 

我并不真正确定它们之间的区别是什么?

  • menu_get_object()返回与当前显示的页面关联的对象。如果drupal显示页面示例,则执行代码,则 menu_get_object() 将返回其ID为1的节点的节点对象;如果显示的页面是example.com/user/1,则 menu_get_object('user') 将返回其ID为1.
  • 的用户的用户对象
  • menu_get_item()返回包含"Menu_Router" 表中包含的每个字段的索引的数组。这包括:
    • 路径:菜单回调的当前路径
    • load_functions:函数名称数组(如 node_load )要调用,以加载对应于当前路径的一部分的对象
    • access_callback:检查当前登录用户是否有权访问菜单项
    • page_callback:呈现页面
    • 的函数的名称
    • 标题:与菜单项相关的页面的标题
  • drupal_lookup_path()是返回与别名相关联的内部路径作为参数的函数。如果"主页" 是与example.com/node/1关联的别名,则 drupal_lookup_path("homepage") 将返回 "node/1" 。路径别名可以与任何内部路径相关联,不仅要向节点路径。

并且更批准以在块预处理功能中获取节点ID。

如果您想要得到的只是当前显示的节点的节点ID,那么您只需使用以下代码:

  function brochure_client_form_submit($form, &$form_state) {    // Setup the user account array to programatically create a new user.   $account = array(     'name' => YOUR_NAME,     'pass' => YOUR_PASS,     'mail' => YOUR_MAIL,     'status' => 1,     'init' => 'install profile', // Just an example   );   $account = user_save(null, $account); } 0  

如果需要获取节点对象,那么您可以使用以下代码:

  function brochure_client_form_submit($form, &$form_state) {    // Setup the user account array to programatically create a new user.   $account = array(     'name' => YOUR_NAME,     'pass' => YOUR_PASS,     'mail' => YOUR_MAIL,     'status' => 1,     'init' => 'install profile', // Just an example   );   $account = user_save(null, $account); } 1  
这些片段的

,第二个是更好的,因为它返回了用于内部路径的正确节点对象,例如节点/ 1 /修订/ 3/3 /视图。

请记住,一些预处理函数,例如页面的函数,或节点,具有 function brochure_client_form_submit($form, &$form_state) { // Setup the user account array to programatically create a new user. $account = array( 'name' => YOUR_NAME, 'pass' => YOUR_PASS, 'mail' => YOUR_MAIL, 'status' => 1, 'init' => 'install profile', // Just an example ); $account = user_save(null, $account); } 2 。这意味着在这些情况下,您只需在预处理函数中使用以下代码段,而不担心使用该功能。

  function brochure_client_form_submit($form, &$form_state) {    // Setup the user account array to programatically create a new user.   $account = array(     'name' => YOUR_NAME,     'pass' => YOUR_PASS,     'mail' => YOUR_MAIL,     'status' => 1,     'init' => 'install profile', // Just an example   );   $account = user_save(null, $account); } 3  

对于其他预处理函数,请检查文档以查看是否有包含节点对象的任何变量。例如,它是 <代码> function brochure_client_form_submit($form, &$form_state) { // Setup the user account array to programatically create a new user. $account = array( 'name' => YOUR_NAME, 'pass' => YOUR_PASS, 'mail' => YOUR_MAIL, 'status' => 1, 'init' => 'install profile', // Just an example ); $account = user_save(null, $account); } 4 ,它使 function brochure_client_form_submit($form, &$form_state) { // Setup the user account array to programatically create a new user. $account = array( 'name' => YOUR_NAME, 'pass' => YOUR_PASS, 'mail' => YOUR_MAIL, 'status' => 1, 'init' => 'install profile', // Just an example ); $account = user_save(null, $account); } 5 可用于注释的预处理函数。

 

I am not really sure what the difference between them is

  • menu_get_object() returns the object associated with the page currently shown. If the code is executed when Drupal is showing the page example.com/node/1, then menu_get_object() will return the node object for the node whose ID is 1; if the page being shown is example.com/user/1, then menu_get_object('user') will return the user object for the user whose ID is 1.
  • menu_get_item() returns an array containing an index for each field contained in the "menu_router" table. This includes:
    • path: the current path of the menu callback
    • load_functions: an array of function names (like node_load) to be called to load an object corresponding to a part of the current path
    • access_callback: the callback that checks if the currently logged in user has access to the menu item
    • page_callback: the name of the function that renders the page
    • title: the title for the page associated to the menu item
  • drupal_lookup_path() is the function that returns you the internal path associated with the alias passed as argument. If "homepage" is the alias associated to example.com/node/1, then drupal_lookup_path("homepage") will return "node/1". Path aliases can be associated to any internal paths, not only to node paths.

and which is more appropriated to get the node ID in a block preprocess function.

If all you want to get is the node ID of the node currently shown, then you just need to use the following code:

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

If you need to get the node object, then you can use the following code:

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

Of those snippets, the second is better, as it returns the correct node object for internal paths such as node/1/revisions/3/view.

Keep in mind that some preprocess functions, such as the ones for the page, or the node, have already a $variables['node']. This means that in those cases, you just need to use the following snippet in your preprocess function, without worrying about which function to use.

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

For other preprocess functions, check the documentation to see if there is any variable containing the node object. For example, that is the case for template_preprocess_comment() which makes $variables['node'] available to the preprocess functions for comments.

 
 
7
 
vote

如何在drupal core的 template_preprocess_page

theme.inc 和向后:

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

template_preprocess_page使用 menu_get_object 。之后,它只是检查节点是否定义并获得$ node - &gt; nid。

 

How it's done in Drupal Core's template_preprocess_page:

Line 2267 of theme.inc and onwards:

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

template_preprocess_page uses menu_get_object. After that it's just a matter of checking if the node is defined and getting $node->nid.

 
 
4
 
vote

一件事你必须小心是路径别名。

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];   
 

One thing you have to be careful of is path alias.

drupal_get_normal_path($path)

to get the current path use the system variable $_SERVER["REQUEST_URI"]

(If you are on the node page you can call $node->uri['path'], this will return a non-alias path. Then again if you are on the node page, you can just use $node->nid.)

this will return node/XXXX

so try something like

  $node_path = explode('/', drupal_get_normal_path($path));   $nid = $node_path[1]; 
 
 
4
 
vote

在Drupal 8中,您可以根据路由中的内容获取URL参数。

要单独获取ID:

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

如果打算加载节点对象,可以简单地通过以这种方式获得:

  $node = Drupal::routeMatch()->getParameter('node');   
要查找参数名称,可以使用:
  $possible_parameters = Drupal::routeMatch()->getParameters();   
 

In Drupal 8, you can get url arguments based on what's in the routing.

To get the id alone:

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

If you plan to load the node object, you can simply get it this way:

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

To find the parameter names, you can use:

$possible_parameters = \Drupal::routeMatch()->getParameters(); 
 
 
3
 
vote
  arg(1);   

不是一种糟糕的方式。 arg()在内部路径上工作,因此它不会受到路径别名的影响。

 
arg(1); 

Is not a bad way of doing it. arg() works on the internal path, so it won't be affected by path aliases.

 
 
       
       

相关问题

17  将JavaScript文件添加到管理页面  ( Add javascript files to the administrative pages ) 
如何使用模块在每个管理页面中添加JavaScript / CSS文件? ...

4  通过代码将文件附加到节点  ( Attach file to a node by code ) 
我想将文件关联到节点。到目前为止,一切都很好。创建CCK类型文件,问题已解决。但我不能这样做,我不希望用户选择文件。有问题的文件已经在系统中。 我试图将文件放在#default_value字段中,并将其隐藏使用hook_form_form_id_alter,但失败。 function my_module_form...

2  查看与日期范围字段匹配单一日期的参数  ( Views argument to match single date with date range field ) 
我的内容类型有一个具有结束日期的日期字段。因此,示例节点具有日期范围,例如从2011-01-01到2011-01-30。 在我的视图中,我想添加一个参数/上下文过滤器,显示一个涵盖特定日期的任何节点。因此,如果参数值为2011-01-15,则节点显示(它在其范围内)。如果参数值为2011-02-01,则节点不会显示。...

2  我无法更改临时目录  ( I cannot change the temporary directory ) 
我无法在文件设置下更改临时目录。每当我更改它时,它都会说已经进行了更改,但它恢复到以前所拥有的设置。 我甚至删除了数据库中的'dbo.variable.file_temporary_path'值,但它仍然无法正常工作。 您是否知道这是存储的位置? ...

47  如何以编程方式发送电子邮件?  ( How to programmatically send an email ) 
我想使用Drupal的电子邮件系统从我的自定义模块编程发送电子邮件。是可能的吗? ...

5  自定义视图筛选多级分类系统  ( Custom views filter for multi level taxonomy ) 
我正在努力设置两种看法,以显示多级分类。一个人会列出最终节点的术语,另一个将列出有孩子的节点。不知何故,我不能。 我说我真正需要的是过滤标准"内容:有分类术语(带有深度= 1),有孩子" 。有谁知道模块/加载项会添加这样的过滤标准,或者也许知道如何定义当地视图(我仍然太鲜幸地说,如果可能的话)。 谢谢 artur ...

1  日期模块年份提交表单 - 删除下拉菜单  ( Date module year submission form remove drop down menu ) 
我想知道是否有办法改变日期模块中输入的格式。默认情况下,它将设置为下拉。我希望用户通过密钥笔划输入。或者,我可以设置一个整数字段,因为我只需要四位数。 ...

1  创建有机组时如何自动创建Web表单?  ( How can i create a web form automatically when an organic group is created ) 
我想在创建新的有机组节点时自动创建WebForm。 WebForm应该具有预定义的字段,并将电子邮件触发到组管理员或具有预定角色的组中的用户。或者,它可以通过电子邮件在组内容类型上的CCK字段中填写的地址。 我尝试使用og_webform,但无法弄清楚如何让它为每个组创建WebForms。 ...

1  向徽标添加可点击区域  ( Adding a clickable area to the logo ) 
在我的drupal 7.4网站上有默认的bartik主题和没有贡献的模块,我有一个大徽标(715 x 280 px)和没有口号。这些是我的设置: 我正试图弄清楚将赞助的链接添加到矩形橙色区域的最佳方式(使用白色示例文本"Plastikovie Okna !!" )在下面的屏幕截图上: 如果无法倾斜的矩形,...

2  强制模块“合法”在路径/用户/寄存器上显示“form_set_error”  ( Force the module legal to show a form set error on path user register ) 
我正在使用"合法" 模块6.x-8.5。 这是一个很棒的模块,但我认为需要 form_set_error() 消息,以显示尝试注册的用户,如果他忘记单击所需的复选框,则无法应用注册。 我正在寻找能够实现这一工作的可能性。 有人知道模块中是否有解决此功能的位置(如果没有其他解决方案,则硬编码)? 我还尝试用规则表格进行...

1  如何实现字段升级  ( How to implement upgrade for fields ) 
我写了一个模块,定义了自己的节点类型,添加了相应的字段等。如果我想更改,删除或添加字段,我如何编写升级功能? ...

2  template_preprocess_comment()覆盖template.php  ( Template preprocess comment overrides template php ) 
我试图在drupal 7中的template.php中覆盖此函数;我复制了在 template_preprocess_comment() 第一行包含 function themename_preprocess_comment($variables) 。 它包含以下代码,不起作用。 $variables['su...

1  来自内容类型的内容条目的字段  ( Field with content entries from a content type ) 
我想将字段(列表文本)添加到内容类型,用作其他内容类型的条目的值。 我应该使用引用模块? ...

2  设置目录分类  ( Setting up catalog taxonomy ) 
我正在与特定内容类型的守则模式与往返模式进行战斗。内容类型绑定到分类(产品目录)。我认为分类树应该只容纳容器项目(类别,子类别,子提包等)但不是最终节点(产品),并且它可以具有以下URL模式,由容器节点URL组成+产品别名+扩展,如在[分类 - 别名] / [node-alias] .html中。 这似乎是错误的假设...

1  表格上的Ajax提交帮助  ( Ajax on form submit help ) 
此工作如果您实际单击按钮: $form['submit'] = array( '#type' => 'image_button', '#src' => drupal_get_path('module', 'contact_block') . '/images/send_button.png', ...

15  如何获取“选择”字段的所有选项?  ( How to get all options of a select field ) 
如何获得CCK字段的所有选项? 例如,允许值中有一个字段,允许值为3个选项,如option1,option2,option3.is有任何接收字段名称的函数,并将选项1返回到option3? ...

2  前端滑块  ( Front end slider ) 
我正在尝试在我的模板的前页上创建一个滑块我一直在努力。我使用视图模块创建块。我为此视图创建了一个自定义块。 我正在尝试使用jQuery Coda在块幻灯片中制作帖子。我毫不犹豫地失败了。有没有人设法为Drupal 7创建一个工作帖子滑块? ...

3  迁移后的Settings.php  ( Settings php after migration ) 
我通过ftp和数据库将我的文件传输到托管服务。我编辑了两个文件,settings.php和sites / default / setture.php,其内容最初是以下内容。 poll_metatags_info()3 我在两个文件中更改了数据库名称,用户名,密码和主机(至是addainname.com)。 可...

4  通过参数通过ajax查看视图  ( Pass parameters to views via ajax ) 
在查看视图时生成的页面,如例如一个分类术语页面,有没有方法可以通过使其传递一些参数来更新生成的内容,例如新的分类项。 这将是通过ajax请求更新视图页面内容。 感谢 ...

3  有没有办法了解被视图的节点?  ( Is there a way to know the node being viewed ) 
我有一个上下文,我将一个块放到wiki页面上。无论如何,块知道Wiki页面的节点ID? 我想在块的视图中编写一些代码 - 查看 - block - field.tpl.php模板文件,以显示仅用于Wiki页面的所有者的东西。通过通过上下文将块放在Wiki的页面上,块需要它显示的节点(Wiki)页面以及节点的所...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.