Existe-t-il une manière définitive et universelle de procéder? Par exemple, en utilisant une variable d'environnement fournie avec Drupal.behaviours
?
J'ai fait quelques recherches et il ne semble pas y avoir de réponse commune.
Comme mentionné ci-dessus, Drupal core n'a aucune utilité pour l'ID de nœud du côté client, donc il ne le transmet pas. Si vous voulez y accéder, vous devrez l'ajouter manuellement:
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',
);
}
}
Du côté client, vous y aurez accès via Drupal.settings
:
var currentNid = Drupal.settings.MYMODULE.currentNid;
Comme mentionné par MPD dans sa réponse, travailler avec les classes css par défaut Drupal génère pour l'élément est une solution simple qui fonctionne sans code PHP PHP personnalisé).
Voici notre implémentation:
(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);
La valeur par défaut template_preprocess_html()
contient ce bit de code dans
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);
}
}
}
Cela collera sur les classes au <body>
ligne d'élément page-node-123
. Si vous ne voulez pas utiliser votre propre code dans un module personnalisé, vous pouvez obtenir les classes via jQuery , trouver celui qui correspond à page-node-
, puis analyse le nid.
Ce qui a fonctionné pour moi, c'est d'ajouter la ligne suivante à mon page.tpl.php
modèle. Cela ajoute l'ID de nœud à window.Drupal.settings.nid
que vous pouvez utiliser à volonté en JavaScript.
drupal_add_js(array('nid' => $node->nid), 'setting');
Comme suggéré dans les commentaires, voici le code pour ajouter l'ID de nœud à partir de template.php
:
function MYTHEME_preprocess_page(&$variables, $hook) {
if ($node = menu_get_object()) {
drupal_add_js(array('nid' => $node->nid),'setting');
}
}