web-dev-qa-db-fra.com

Comment obtenir l'ID de nœud dans jQuery / JavaScript

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.

8
therobyouknow

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;
13
Clive

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);
5
gue

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.

3
mpdonadio

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'); 
  } 
}
1
Daniel Lefebvre