Cómo obtener la ID del nodo en jQuery / JavaScript

8

¿Existe una forma definitiva y universal de hacer esto? Por ejemplo, ¿usando alguna variable de entorno que viene con Drupal.behaviours?

He investigado un poco y parece que no hay una respuesta común.

therobyouknow
fuente
No, no hay una variable de entorno como esa ... ¿qué quiere decir exactamente con 'obtener la identificación del nodo drupal'? ¿Qué está clasificando como 'la identificación del nodo drupal' en este contexto? ¿El ID de un nodo en cuya página completa estás?
Clive
sí, la ID de un nodo en cuya página completa estoy, por ejemplo, como en mysite.com/node/6, me gustaría que el jquery que ejecuto desde esta página pueda obtener la identificación del nodo y ponerla en una variable, en el ejemplo, esto tendría el valor de 6.
therobyouknow
Si desea un método robusto, deberá pasar la ID de nodo desde el lado del servidor manualmente drupal_add_js(); el nid nunca se usa en el lado del cliente por núcleo, por lo que no es necesario que se agregue como una configuración generalmente
Clive

Respuestas:

13

Como se mencionó anteriormente, el núcleo de Drupal no tiene uso para el ID del nodo en el lado del cliente, por lo que no lo pasa. si desea acceder a él, deberá agregarlo 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',
    );
  }
} 

Luego, en el lado del cliente, tendrá acceso a él a través de Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;
Clive
fuente
Gracias @Clive, ¡muy feliz con esta solución! Lo intentaré. Me ayudará con mi intento de solucionar el problema del módulo pop_links : la versión 7 no graba enlaces . Te daré crédito con la ayuda, siéntete libre de contribuir también. Mis hallazgos hasta ahora con este módulo son que el javascript que proporcionan no está "disparando" y un colega ha proporcionado una solución provisional basada en un classatributo del tema bootstrap. En última instancia, apuntamos a una solución independiente del tema.
therobyouknow
¿Puedo mencionar una corrección de trabajo a su código: debería leer: $setting = array('MYMODULE' => array('currentNid' => $node->nid));el =es extraño. Eso hizo el trabajo: agregó su código a esta función que ya existía pop_linksy agregó su JavaScript pop_links.js.
therobyouknow
Oops, error tipográfico - perdón por eso :)
Clive
1
+1 por cierto por su respuesta. Funciona y me ha permitido proporcionar una solución provisional para el problema de pop_links aquí: drupal.org/node/1269290#comment-7625019
therobyouknow
1
PS le dio crédito por la solución.
therobyouknow
5

Como mencionó MPD en su respuesta, trabajar con las clases css predeterminadas que Drupal genera para el elemento es una solución fácil que funciona sin código PHP personalizado.

Aquí está nuestra implementación:

(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
fuente
esto también funciona en Drupal 8 si cambia una línea a var $body = $('body.path-node');(probado con zurb_foundation para 8.x-6.x)
HongPong
3

El valor predeterminado template_preprocess_html()tiene este bit de código en

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

Esto se mantendrá en las clases a la <body>línea del elemento page-node-123. Si no desea usar su propio código en un módulo personalizado, puede obtener las clases a través de jQuery , encontrar el que coincida page-node-y luego analizar el nid.

mpdonadio
fuente
+1 Gracias por tu aporte @MPD que vale la pena conocer. En mi caso, agregar cosas a un módulo me conviene, ya que estoy arreglando un error en el módulo pop_links; vea mi comentario debajo de la respuesta de Clive. Su respuesta, sin duda, será útil en otros escenarios.
therobyouknow
1

Lo que me ha funcionado es agregar la siguiente línea a mi page.tpl.phpplantilla. Esto agrega la ID de nodo a la window.Drupal.settings.nidque puede usar a voluntad en JavaScript.

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

Como se sugiere en los comentarios, aquí está el código para agregar la ID de nodo de template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

    drupal_add_js(array('nid' => $node->nid),'setting'); 
  } 
}
Daniel Lefebvre
fuente
Quizás sea mejor agregar esa línea en su template_preprocess_pagelugar (si la necesita en el nivel de la página). Para no mezclar las cosas y mantener las plantillas tan limpias y legibles como sea posible. Las plantillas deben usarse para el marcado.
leymannx
Lo he hecho también en otras versiones. Agregarlo a page.tpl.php es un "hack" bastante fácil para las personas que se sienten intimidadas por el tema. Buena sugerencia, gracias :)
Daniel Lefebvre
¿Es eso un error tipográfico allí settingsy setting?
leymannx
no es ... me arrojó un par de veces ... pero "configuración" entra en drupal_add_js y crea window.Drupal.settings.whatever
Daniel Lefebvre