So erhalten Sie die Knoten-ID in jQuery / JavaScript

8

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.

Therobyouknow
quelle
Nein, es gibt keine solche Umgebungsvariable ... was genau meinst du mit 'die Drupal-Knoten-ID abrufen'? Was klassifizieren Sie in diesem Zusammenhang als "Drupal-Knoten-ID"? Die ID eines Knotens, auf dessen vollständiger Seite Sie sich befinden?
Clive
Ja, die ID eines Knotens, auf dessen vollständiger Seite ich mich befinde , z. B. wie in mysite.com/node/6. Ich möchte, dass die von dieser Seite ausgeführte Abfrage die Knoten-ID abruft und in eine Variable einfügt. im Beispiel hätte dies den Wert 6.
wissen,
Wenn Sie eine robuste Methode wünschen, müssen Sie die Knoten-ID von der Serverseite manuell mit übergeben drupal_add_js(). Die NID wird auf der Clientseite nie vom Kern verwendet, daher muss sie normalerweise nicht als Einstellung hinzugefügt werden
Clive

Antworten:

13

Wie oben erwähnt, hat der Drupal-Kern keine Verwendung für die Knoten-ID auf der Clientseite, sodass sie nicht weitergeleitet wird. Wenn Sie darauf zugreifen möchten, müssen Sie es 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 Zugriff auf Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;
Clive
quelle
Danke @Clive - sehr zufrieden mit dieser Lösung! Ich werde es ausprobieren. Dies hilft mir bei meinem Versuch, das Problem mit dem Modul pop_links zu beheben : Version 7 Not Recording Links . Ich werde Ihnen die Hilfe gutschreiben, zögern Sie nicht, auch mitzumachen. Meine bisherigen Erkenntnisse mit diesem Modul sind, dass das von ihnen bereitgestellte Javascript nicht "ausgelöst" wird und ein Kollege eine vorläufige Korrektur basierend auf einem classAttribut aus dem Bootstrap-Thema bereitgestellt hat . Letztendlich streben wir eine themenunabhängige Lösung an.
Therobyouknow
Darf ich eine funktionierende Korrektur Ihres Codes erwähnen: Es sollte lauten: $setting = array('MYMODULE' => array('currentNid' => $node->nid));Das =ist irrelevant. Das hat den Job gemacht - Ihren Code an diese Funktion angeheftet, die bereits in vorhanden war, pop_linksund Ihr Javascript hinzugefügt pop_links.js.
Therobyouknow
Ups, Tippfehler - Entschuldigung :)
Clive
1
+1 übrigens für deine Antwort. Es funktioniert und hat es mir ermöglicht, eine vorläufige Lösung für das Problem pop_links hier bereitzustellen
therobyouknow
1
PS hat Ihnen die Lösung gutgeschrieben.
Therobyouknow
5

Wie von MPD in seiner Antwort erwähnt, ist die Arbeit mit den Standard-CSS-Klassen, die Drupal für das Element generiert, 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);
gue
quelle
Dies funktioniert auch auf Drupal 8, wenn Sie eine Zeile ändern in var $body = $('body.path-node');(getestet mit zurb_foundation für 8.x-6.x)
HongPong
3

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

Dadurch bleiben Klassen an der <body>Elementzeile haften page-node-123. Wenn Sie keinen eigenen Code in einem benutzerdefinierten Modul verwenden möchten, können Sie die Klassen über jQuerypage-node- abrufen, die passende finden und dann die NID analysieren.

mpdonadio
quelle
+1 Vielen Dank für Ihre wissenswerte Eingabe @MPD. In meinem Fall passt das Hinzufügen von Inhalten zu einem Modul zu mir, da ich einen Fehler im Modul pop_links behebe - siehe meinen Kommentar unter Clives Antwort. Ihre Antwort wird zweifellos in anderen Szenarien nützlich sein.
Therobyouknow
1

Was für mich funktioniert hat, ist das Hinzufügen der folgenden Zeile zu meiner page.tpl.phpVorlage. Dadurch wird die Knoten-ID hinzugefügt, window.Drupal.settings.niddie 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 von template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

    drupal_add_js(array('nid' => $node->nid),'setting'); 
  } 
}
Daniel Lefebvre
quelle
Fügen Sie diese Zeile möglicherweise besser hinzu template_preprocess_page(wenn Sie sie auf Seitenebene benötigen). Um die Dinge nicht zu verwechseln und die Vorlagen so sauber und lesbar wie möglich zu halten. Vorlagen sollten für das Markup verwendet werden.
Leymannx
Ich habe das auch bei anderen Builds gemacht. Das Hinzufügen zu page.tpl.php ist ein ziemlich einfacher "Hack" für Leute, die von dem Thema eingeschüchtert sind. Guter Vorschlag, danke :)
Daniel Lefebvre
Ist das ein Tippfehler da settingsund setting?
Leymannx
es ist nicht ... es hat mich ein paar Mal geworfen ... aber "Einstellung" geht in die drupal_add_js und es erstellt window.Drupal.settings.whatever
Daniel Lefebvre