2008-09-14 24 views
23

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

Quiero crear una página en mi sitio que tiene una se ejecuta una pequeña aplicación de JavaScript, por lo que CSS y JavaScript son específicos de esa página y no desean incluirse en otras cargas de página.

Respuesta

3

La mejor solución que he encontrado hasta el momento es para que el modo de entrada de PHP, y luego llamar a drupal_add_css y drupal_add_js según proceda, en un bloque de PHP en el inicio de la carrocería de su nodo.

+0

He usado esta misma técnica una y otra vez en Drupal 5. Por ejemplo, el "Calendario del Club" en la página principal de este sitio se implementó de esta manera. http://www.chesmontastro.org/ –

+4

Esta podría ser la solución más fácil, pero se vuelve rápidamente inmanejable, ya que es muy difícil depurar el código PHP en la base de datos, y el control de revisiones es casi imposible. La solución de Inferis anterior es un enfoque mucho más limpio. – jhedstrom

0

Puede tener una plantilla personalizada para ese nodo (node-needsjs.tpl.php) que llama al javascript. Eso es un poco más limpio que usar PHP directamente en el cuerpo del nodo, y hace que los cambios en el contenido sean más fáciles en el futuro.

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

+0

Realmente debería haber pensado mejor esta respuesta: una ventaja adicional de usar un archivo de plantilla personalizado es la capacidad de obligar a otros nodos a usar la plantilla a través de la función template_preprocess_page en template.php. – MattBelanger

2

Esto debería ser el truco: un módulo rápido que usa el hook_nodeapi para insertar el JS/CSS cuando se ve 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 con la activación del filtro de entrada de PHP, y no requiere un archivo de plantilla nodo separado que podría convertirse en obsoleto si ha actualizado la plantilla principal nodo y se olvidó de su ser personalizado.

14

Aconsejaría contra el uso de hook_nodeapi para eso. Agregar CSS y Javascript está relacionado con el diseño, así que hook_nodeapi no es el lugar adecuado: use themeing. De esta manera, puede anular esos archivos cuando va a desarrollar un nuevo tema. Hacer eso con el enfoque nodeapi sería un poco más difícil (tendrías que buscar en la lista js/css los archivos, eliminarlos y reemplazarlos por los tuyos).

De todos modos: lo que necesita hacer es agregar una función de preproceso de nodo que agregue esos archivos por usted. Puede hacer esto en un módulo o en un tema personalizado. Para un módulo de 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 se olvide de limpiar la caché, en primer lugar.

Estas funciones se invocan antes de que el nodo tenga un tema. Especificar el js/css allí permite un enfoque en cascada: puede tener los elementos genéricos/básicos en el módulo y proporcionar funcionalidad mejorada o específica en el tema.

+0

Corrección leve: cuando agrega un CSS en un tema, debe actualizar la variable de estilos después de la llamada drupal_add_css, p. Ej. $ variables ['styles'] = drupal_get_css(); – Pianosaurus

5

Utilizo las funciones de preproceso pero esto tiene algunos problemas. $variables['styles'] generalmente se establece antes de se llama a la función de preproceso de nodo. En otras palabras, ya se llama drupal_get_css, lo que hace que llamar al drupal_add_css sea inútil. Lo mismo ocurre con drupal_add_js. Lo soluciono restableciendo el valor $variables['styles'].

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.

P.S.Casi no hay necesidad de crear un módulo para resolver un problema de tematización.

Saludos.

4

Esto parece una buena solución:

http://drupal.org/project/js_injector y http://drupal.org/project/css_injector

Funciona cuando se quiere insertar código en línea en algo que no sea técnicamente un nodo para que no haya Identificación del nodo y sin 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 id. De nodo.

Cuestiones relacionadas