it-swarm.com.de

So erhalten Sie die Knoten-ID in jQuery / JavaScript

Gibt es einen endgültigen, universellen Weg, dies zu tun? Verwenden Sie beispielsweise eine Umgebungsvariable, die mit Drupal.behaviours?

Ich habe einige Nachforschungen angestellt und es scheint keine gemeinsame Antwort zu geben.

8
therobyouknow

Wie oben erwähnt, hat Drupal core keine Verwendung für die Knoten-ID auf der Clientseite, sodass sie nicht weitergeleitet wird. Wenn Sie darauf zugreifen möchten, müssen Sie sie manuell hinzufügen:

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',
    );
  }
} 

Auf der Client-Seite haben Sie dann über Drupal.settings Zugriff darauf:

var currentNid = Drupal.settings.MYMODULE.currentNid;
13
Clive

Wie von MPD in seiner Antwort erwähnt, ist die Arbeit mit den Standard-CSS-Klassen Drupal generiert für das Element eine einfache Lösung, die ohne benutzerdefinierten PHP Code) funktioniert.

Hier ist unsere Implementierung:

(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

Der Standardwert template_preprocess_html() enthält dieses Codebit in

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);
    }
  }
}

Dies bleibt bei Klassen in der Elementzeile <body>page-node-123. Wenn Sie keinen eigenen Code in einem benutzerdefinierten Modul verwenden möchten, können Sie die Klassen über jQuery abrufen diejenige finden, die mit page-node- Übereinstimmt, und dann die nid analysieren.

3
mpdonadio

Was für mich funktioniert hat, ist das Hinzufügen der folgenden Zeile zu meiner page.tpl.php - Vorlage. Dadurch wird die Knoten-ID zu window.Drupal.settings.nid Hinzugefügt, die Sie nach Belieben in JavaScript verwenden können.

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

Wie in den Kommentaren vorgeschlagen, ist hier der Code zum Hinzufügen der Knoten-ID aus template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

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