Pregunta

¿Cuál es el mejor método para incluir un archivo CSS o Javascript para un nodo específico en Drupal 6?

Quiero crear una página en mi sitio que tenga una pequeña aplicación de JavaScript ejecutándose, por lo que CSS y JavaScript son específicos de esa página y no quisiera incluirlos en otras cargas de páginas.

¿Fue útil?

Solución 4

La mejor solución que se me ocurrió hasta ahora es habilitar el modo de entrada PHP y luego llamar drupal_add_css y drupal_add_js según corresponda en un bloque PHP al inicio del cuerpo de su nodo.

Otros consejos

Yo desaconsejaría el uso hook_nodeapi para eso.Agregar CSS y Javascript está relacionado con el diseño, por lo que hook_nodeapi no es el lugar para ello:utilizar temas.De esta manera, tu poder anule esos archivos cuando vaya a desarrollar un nuevo tema.Hacer eso con el enfoque nodeapi sería un poco más difícil (tendría que buscar los archivos en la lista js/css, eliminarlos y reemplazarlos con los suyos propios).

De todos modos:lo que debe hacer es agregar una función de preproceso de nodo que agregue esos archivos por usted.Puedes hacer esto en un módulo o en un tema personalizado.Para un módulo esto sería:

function mymodule_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(drupal_get_path('module', 'mymodule') . "/file.js", "module");
    drupal_add_css(drupal_get_path('module', 'mymodule') . "/file.css", "module");
  }
}

o para un tema:

function mytheme_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(path_to_theme() . "/file.js", "theme");
    drupal_add_css(path_to_theme(). "/file.css", "theme");
  }
}

No olvides borrar el caché primero.

Estas funciones se llaman antes de que se tematice el nodo.Especificar js/css allí permite un enfoque en cascada:puede tener el material genérico/básico en el módulo y proporcionar funcionalidad mejorada o específica en el tema.

Utilizo las funciones de preproceso pero esto tiene algunos problemas. $variables['styles'] generalmente se establece antes Se llama a la función de preproceso del nodo.En otras palabras drupal_get_css ya esta llamado lo que te hace llamar drupal_add_css inútil.Lo mismo va para drupal_add_js.Soluciono esto reiniciando el $variables['styles'] valor.

function mytheme_preprocess_node(&$variables) {
  $node = $variables['node'];
  if (!empty($node) && $node->nid == $the_specific_node_id) {
    drupal_add_js(path_to_theme() . "/file.js", "theme");
    drupal_add_css(path_to_theme(). "/file.css", "theme");
    $variables['styles'] = drupal_get_css();
    $variables['script'] = drupal_get_js();
  }
}

Esto parece funcionar en la mayoría de los casos.

PDCasi nunca es necesario crear un módulo para resolver un problema de temática.

Salud.

Esta parece una buena solución:

http://drupal.org/project/js_injectoryhttp://drupal.org/project/css_injector

Funciona cuando desea insertar código en línea en algo que no sea técnicamente un nodo, por lo que no hay una identificación de nodo ni una opción de entrada PHP disponible.Como lo usé para inyectar pequeños ajustes de jQuery en un par de páginas de administración.Funciona por ruta en lugar de por identificación de nodo.

Esto debería funcionar: un módulo rápido que utiliza el gancho_nodeapi para insertar el JS/CSS cuando se visualiza el nodo.

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  // the node ID of the node you want to modify
  $node_to_modify = 6;

  // do it!
  if($op == 'view' && $node->nid == $node_to_modify) {
    drupal_add_js(drupal_get_path('module', 'mymodule') . '/mymodule.js');
    drupal_add_css(drupal_get_path('module', 'mymodule') . '/mymodule.css');
  }
}

Esto evita problemas de seguridad al habilitar el filtro de entrada PHP y no requiere un archivo de plantilla de nodo separado que podría quedar obsoleto si actualiza la plantilla de nodo principal y se olvida la personalizada.

Puede tener una plantilla personalizada para ese nodo (node-needsjs.tpl.php) que llame a javascript.Esto es un poco más limpio que usar PHP directamente en el cuerpo del nodo y facilita los cambios en el contenido en el futuro.

EDITAR: No creo haber sido muy claro arriba.Desea nombrar el archivo de plantilla nodo-(nodeid).tpl.php.Entonces, si fuera el Nodo 1, llame al archivo node-1.tpl.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top