如何在jQuery / JavaScript中获取节点ID


8

有确定的通用方法吗?例如,使用某些附带的环境变量Drupal.behaviours

我已经做了一些研究,似乎没有共同的答案。


没有这样的环境变量...“获取drupal节点ID”到底是什么意思?在这种情况下,您将什么分类为“ drupal节点ID”?您正在其整个页面上的节点的ID?
克莱夫(Clive)

是的,我要访问其整个页面的节点的ID,例如在mysite.com/node/6中,我希望从该页面执行的jquery能够获取节点ID并将其放入变量中,在该示例中,这将具有6中的值
therobyouknow

如果您想要一个健壮的方法,则必须使用手动从服务器端传递节点ID drupal_add_js()。nid从来没有在客户端被内核使用过,因此通常不需要将其添加为设置
Clive

Answers:


13

如上所述,Drupal核心在客户端没有使用节点ID,因此不会通过它。如果要访问它,则需要手动添加它:

function MYMODULE_node_view($node, $view_mode, $langcode) {
  if ($view_mode == 'full') {
    $setting = array('MYMODULE' => array('currentNid' => $node->nid));
    $node->content['#attached']['js'][] = array(
      'data' => $setting,
      'type' => 'setting',
    );
  }
} 

然后在客户端,您将可以通过Drupal.settings以下方式访问它:

var currentNid = Drupal.settings.MYMODULE.currentNid;

感谢@Clive-非常满意此解决方案!我会尝试的。它可以帮助我解决pop_links模块问题:版本7不记录链接。我会在您的帮助下为您效劳,也可以随时加入。到目前为止,我对该模块的发现是,他们提供的javascript并非“触发”,而一位同事已根据classbootstrap主题中的属性提供了临时修复。最终,我们旨在实现主题独立的解决方案。
therobyouknow

我可能会提到一个工作校正代码:应改为:$setting = array('MYMODULE' => array('currentNid' => $node->nid));=是多余的。这样就可以将您的代码添加到该功能中,pop_links并在其中添加了JavaScript pop_links.js
therobyouknow

糟糕,错别字-对此表示抱歉:)
Clive

1
+1为您的答案。它有效并且使我能够为以下pop_links问题提供临时修复:drupal.org/node/1269290#comment-7625019
therobyouknow

1
PS将您归功于解决方案。
therobyouknow

5

正如MPD在他的回答中所提到的,使用Drupal为该元素生成的默认CSS类是一种简单的解决方案,无需自定义PHP代码即可工作。

这是我们的实现:

(function($) {

  /**
   * Find Drupal Node ID based on <body> element classes.
   *
   * @return Node ID or false
   **/
  function getCurrentNodeId() {
    var $body = $('body.page-node');
    if ( ! $body.length )
      return false;
    var bodyClasses = $body.attr('class').split(/\s+/);
    for ( i in bodyClasses ) {
      var c = bodyClasses[i];
      if ( c.length > 10 && c.substring(0, 10) === "page-node-" )
        return parseInt(c.substring(10), 10);
    }
    return false;
  }


  /**
   * Example usage...
   *
   **/
  Drupal.behaviors.yourModuleNameHere = {
    var nodeId = getCurrentNodeId();
    if ( nodeId ) {
      // Node ID found.
      // ...do something with it.
    } else {
      // Node ID not found. Guess we are not on a node page
      // ...handle this case with care too. 
    }
  }

}(jQuery);

如果您将行更改为var $body = $('body.path-node');(使用zurb_foundation测试了8.x-6.x),这也适用于Drupal 8
HongPong

3

默认template_preprocess_html()

if ($suggestions = theme_get_suggestions(arg(), 'page', '-')) {
  foreach ($suggestions as $suggestion) {
    if ($suggestion != 'page-front') {
      // Add current suggestion to page classes to make it possible to theme
      // the page depending on the current page type (e.g. node, admin, user,
      // etc.) as well as more specific data like node-12 or node-edit.
      $variables['classes_array'][] = drupal_html_class($suggestion);
    }
  }
}

这将在类上粘贴到<body>元素行page-node-123。如果您不想在自定义模块中使用自己的代码,则可以通过jQuery获取类,找到page-node-与之匹配的类,然后解析出nid。


+1感谢您的输入@MPD值得了解。就我而言,向模块中添加内容非常适合我正在修复pop_links模块中的错误-请参阅Clive答案下方的评论。毫无疑问,您的答案将在其他情况下有用。
therobyouknow 2013年

1

对我有用的是将以下行添加到我的page.tpl.php模板中。这将添加window.Drupal.settings.nid您可以在JavaScript中随意使用的节点ID 。

drupal_add_js(array('nid' => $node->nid), 'setting');

如注释中所建议,这是用于从添加节点ID的代码template.php

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

    drupal_add_js(array('nid' => $node->nid),'setting'); 
  } 
}

也许最好在其中添加该行template_preprocess_page(如果您在页面级别需要它)。避免混淆,并保持模板尽可能整洁和可读。模板应用于标记。
leymannx

我在其他版本上也做到了。将其添加到page.tpl.php中对于受主题吓到的人们来说是一个相当简单的“ hack”。好建议,谢谢您:)
Daniel Lefebvre

那是一个有错字settingssetting
leymannx

它不是……它使我投入了几次……但在drupal_add_js中进行了“设置”,并创建了window.Drupal.settings.whatever
Daniel Lefebvre
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.