theme preprocess drupal preprocessor

preprocess - Incluir archivo CSS o Javascript para un nodo específico en Drupal 6



drupal 8 preprocess (6)

Esto debería ser el truco: un módulo quickie que usa 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 los problemas de seguridad al habilitar el filtro de entrada de PHP, y no requiere un archivo de plantilla de nodo separado que podría quedar obsoleto si actualizaste la plantilla del nodo principal y te olvidaste de la personalizada.

¿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 querrían incluirse en ninguna otra carga de página.


Esto parece una buena solución:

http://drupal.org/project/js_injector y http://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 de 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.


La mejor solución que he encontrado hasta ahora es habilitar el modo de entrada PHP, y luego llamar a drupal_add_css y drupal_add_js según corresponda, en un bloque de PHP al comienzo del cuerpo de tu nodo.


Puede tener una plantilla personalizada para ese nodo (node-needsjs.tpl.php) que llama a 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 que fuera muy claro arriba. Desea nombrar el archivo de plantilla node- (nodeid) .tpl.php. Entonces, si era el Nodo 1, llame al archivo node-1.tpl.php


Utilizo las funciones de preproceso pero esto tiene algunos problemas. $variables[''styles''] generalmente se establece antes de llamar a la función de preproceso del nodo. En otras palabras, ya se llama drupal_add_css lo que hace que drupal_add_css inútil. Lo mismo drupal_add_js para drupal_add_js . Trabajo alrededor de esto restableciendo el $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 para la mayoría de los casos.

PD: casi no hay necesidad de crear un módulo para resolver un problema de tematización.

Aclamaciones.


Aconsejo no usar hook_nodeapi para eso. Agregar CSS y Javascript está relacionado con el diseño, por lo que hook_nodeapi no es el lugar adecuado: use themeing. De esta manera, puede anular esos archivos cuando vaya 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 debe 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 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 por 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 te olvides de borrar el caché, primero.

Estas funciones se llaman 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.