web-dev-qa-db-ja.com

jQuery / JavaScriptでノードIDを取得する方法

これを行う確実で普遍的な方法はありますか?たとえば、Drupal.behaviours?に付属の環境変数を使用します。

私はいくつかの調査を行いましたが、一般的な答えはないようです。

8
therobyouknow

上記のように、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;
13
Clive

MPDが彼の回答で述べたように、デフォルトのcss-classes Drupal generates for the elementを使用することは、カスタム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);
5
gue

デフォルト 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を解析できます。

3
mpdonadio

私にとってうまくいったのは、次の行をpage.tpl.phpテンプレートに追加することです。これにより、ノードIDがwindow.Drupal.settings.nidに追加され、JavaScriptで自由に使用できます。

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

コメントで示唆されているように、template.phpからノードIDを追加するためのコードは次のとおりです。

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

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