Come ottenere l'ID nodo in jQuery / JavaScript


8

Esiste un modo definitivo e universale per farlo? Ad esempio, usando alcune variabili d'ambiente fornite Drupal.behaviours?

Ho fatto qualche ricerca e non sembra esserci una risposta comune.


No, non esiste una variabile d'ambiente come quella ... cosa intendi esattamente per "ottenere l'ID nodo drupal"? Cosa stai classificando come "ID nodo drupal" in questo contesto? L'ID di un nodo di cui sei sulla pagina intera?
Clive

sì, l'ID di un nodo la cui pagina intera è aperta , ad es. come in mysite.com/node/6 Vorrei che il jquery che eseguo da questa pagina fosse in grado di ottenere l'ID del nodo e inserirlo in una variabile, nell'esempio, questo avrebbe il valore di 6.
therobyouknow l'

Se si desidera un metodo affidabile, è necessario passare manualmente l'ID nodo dal lato server utilizzando drupal_add_js(); il nid non viene mai utilizzato sul lato client dal core quindi non è necessario che venga aggiunto come impostazione di solito
Clive

Risposte:


13

Come accennato in precedenza, Drupal core non ha alcuna utilità per l'ID nodo sul lato client, quindi non lo attraversa. se si desidera accedervi, è necessario aggiungerlo manualmente:

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

Quindi sul lato client avrai accesso tramite Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;

Grazie @Clive - molto soddisfatto di questa soluzione! Lo proverò. Mi aiuterà nel mio tentativo di risolvere il problema del modulo pop_links : Versione 7 Non registrare collegamenti . Ti darò credito per l'aiuto, sentiti anche libero di entrare. Le mie scoperte finora con questo modulo sono che il javascript che forniscono non sta "sparando" e un collega ha fornito una correzione temporanea basata su un classattributo dal tema bootstrap. Alla fine puntiamo verso una soluzione indipendente dal tema.
therobyouknow

Posso citare una correzione di lavoro per il codice: si dovrebbe leggere: $setting = array('MYMODULE' => array('currentNid' => $node->nid));il =è estranea. Questo ha fatto il lavoro - ha pop_linksinserito il tuo codice in questa funzione già esistente e ha aggiunto il tuo javascript pop_links.js.
therobyouknow, l'

Spiacenti, errore di battitura - dispiace :)
Clive

1
+1 a proposito per la tua risposta. Funziona e mi ha permesso di fornire una soluzione temporanea per il problema pop_links qui: drupal.org/node/1269290#comment-7625019
therobyouknow

1
PS ti ha accreditato sulla soluzione.
therobyouknow

5

Come menzionato da MPD nella sua risposta, lavorare con le classi css predefinite che Drupal genera per l'elemento è una soluzione semplice che funziona senza codice PHP personalizzato.

Ecco la nostra implementazione:

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

questo funziona anche su Drupal 8 se cambi una linea in var $body = $('body.path-node');(testato con zurb_foundation per 8.x-6.x)
HongPong,

3

L'impostazione predefinita template_preprocess_html()include questo bit di codice 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);
    }
  }
}

Questo si attaccherà alle classi alla <body>linea dell'elemento page-node-123. Se non si desidera utilizzare il proprio codice in un modulo personalizzato, è possibile ottenere le classi tramite jQuery , trovare quella corrispondente page-node-e quindi analizzare il nid.


+1 Grazie per il tuo contributo @MPD che vale la pena conoscere. Nel mio caso l'aggiunta di roba a un modulo mi va bene mentre sto risolvendo un bug nel modulo pop_links - vedi il mio commento sotto la risposta di Clive. La tua risposta sarà senza dubbio utile in altri scenari.
therobyouknow, l'

1

Ciò che ha funzionato per me è l'aggiunta della seguente riga al mio page.tpl.phpmodello. Ciò aggiunge l'ID nodo a window.Drupal.settings.nidcui è possibile utilizzare a piacimento in JavaScript.

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

Come suggerito nei commenti, ecco il codice per aggiungere l'ID nodo da template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

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

Forse meglio aggiungere quella linea template_preprocess_pageinvece (se ne hai bisogno a livello di pagina). Non confondere le cose e mantenere i modelli il più possibile puliti e leggibili. I modelli devono essere utilizzati per il markup.
leymannx,

L'ho fatto anche su altre build. Aggiungerlo a page.tpl.php è un "hack" abbastanza semplice per le persone che sono intimidite dal tema. Buon consiglio, grazie :)
Daniel Lefebvre,

È un errore di battitura lì settingse setting?
leymannx,

non è ... mi ha lanciato alcune volte ... ma "setting" va nel drupal_add_js e crea window.Drupal.settings.whatever
Daniel Lefebvre,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.