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


8

これを行うための確実で普遍的な方法はありますか?たとえば、Drupal.behaviours

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


いいえ、そのような環境変数はありません...「drupalノードIDを取得する」とはどういう意味ですか?このコンテキストで「drupalノードID」として何を分類していますか?全ページを表示しているノードのID?
クライブ

はい、ページ全体が表示されているノードのID。たとえば、mysite.com / node / 6のように、このページから実行するjqueryでノードIDを取得して変数に挿入したい一例では、これは6の値がなければなりません
therobyouknow

堅牢な方法が必要な場合は、を使用してサーバー側から手動でノードIDを渡す必要がありますdrupal_add_js()。nidがクライアント側でコアによって使用されることはないため、通常は設定として追加する必要はありません
Clive

回答:


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が「起動」されておらず、同僚がclassブートストラップテーマの属性に基づく暫定修正を提供していることです。最終的には、テーマに依存しないソリューションを目指しています。
therobyouknow 2013

私はあなたのコードに取り組んで補正を挙げることができる:それは読んでください:余分です。それは仕事をしました-あなたのコードをこの関数にすでに存在し、JavaScriptを追加しました。$setting = array('MYMODULE' => array('currentNid' => $node->nid));=pop_linkspop_links.js
therobyouknow 2013

おっと、タイプミス-すみません:)
クライヴ

1
ところであなたの答えのために+1。これが機能し、pop_linksの問題に対する暫定修正をここで提供できるようになりました:drupal.org/node/1269290#comment-7625019
therobyouknow 2013

1
PSがソリューションを評価しました。
therobyouknow 2013

5

MPDの回答で述べたように、Drupalが要素に対して生成するデフォルトのcss-classesを使用することは、カスタム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');(8.x-6.xのzurb_foundationでテスト済み)に変更した場合、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.nidJavaScriptで自由に使用できるノード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に追加することは、テーマに怯えている人々にとってはかなり簡単な「ハック」です。良い提案、ありがとうございました:)
Daniel Lefebvre

その誤植があるsettingssetting
leymannx

それは...それは私を数回投げました...ではありません...しかし、「設定」はdrupal_add_jsに入れられ、それがwindow.Drupal.settings.whateverを作成します
Daniel Lefebvre
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.