これを行う確実で普遍的な方法はありますか?たとえば、Drupal.behaviours
?に付属の環境変数を使用します。
私はいくつかの調査を行いましたが、一般的な答えはないようです。
上記のように、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;
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);
デフォルト 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を解析できます。
私にとってうまくいったのは、次の行を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');
}
}