2010-04-06 25 views
7

En Drupal puede crear su propio tipo de nodo en un módulo personalizado. Al hacer esto, puedes crear tu propia forma, que es muy bonita.Agregar js a un formulario de nodo drupal

Sin embargo, si desea agregar js, las cosas se vuelven un poco más complicadas. Si agrega los js en el formulario, los js solo se agregarán del formulario cuando se carguen. Si el usuario publica el formulario con errores de validación, la función de formulario no se ejecuta nuevamente y, por lo tanto, el js no se agrega. Normalmente, simplemente crearía una devolución de llamada del menú y agregaría los js allí, pero para el formulario de agregar nodo, esta no sería una solución posible.

Entonces, ¿cuál es la mejor solución para agregar js en un formulario de agregar nodo, para mantenerlo persistente cuando el formulario no se valida?

+0

Lo mismo en Drupal Respuestas: http://drupal.stackexchange.com/questions/70015/adding-css-and-js-to-form-with-attachments – Nux

Respuesta

11

Probé algunos hacks diferentes, encontré una solución bastante simple para este problema, creé una función de tema para el formulario y agregué el js allí. Eso sería algo como esto:

function theme_content_type_node_form($form) { 
    drupal_add_js(...); 
    return theme('node_form', $form); 
} 

Esto se llama a la función tema por defecto para el nodo añadir forma después de añadir el js. Como se llama a la función de tema, incluso el formulario se almacena en caché, esto funciona muy bien. También necesita implementar hook_theme para que esto funcione.

Actualización para Drupal 7.

Drupal 7 hace que este sea mucho más fácil, ya que es posible hacer

$form['#attached']['js'][] = 'path_to_js_file; 

Un ejemplo del uso de esto podría ser:

$form['#attached']['js'][] = drupal_get_path('module', 'foo') . '/js/foo.form.js'; 
+4

Interesante: me sorprende que esto funcione sin crear un bucle infinito, ya que la invocación de 'theme ('node_form')' podría terminar invocando su sobrescritura de nuevo. ¿No sería mejor poner la llamada 'drupal_add_js' en una función' theme_preprocess'? –

+2

@Henrik Opel: Supongo que una función theme_preprocess también funcionaría, no pensé en eso en ese momento. La función theme_node_form es la función que se llamaría si content_type_node_form no existe, por lo que no creo que un ciclo infinito sea peligroso.Pero creo que es un poco más hackish que solo usar la función de preproceso de tema s. – googletorp

+0

Puedes hacer return theme_node_form ($ form); en lugar del tema de retorno ('node_form', $ form); para evitar bucles infinitos. – rooby

2

he publicado un parche para el módulo Smilies que soluciona este problema: Smilies are not selectable when resubmitting a page

El parche añade una función hook_nodeapi() para comprobar si la operación nodo es "verificar" y si lo es, se comprueba si el nodo se supone que tiene smileys y si es así llama a la función para agregar el archivo javascript smileys.js que crea el formulario de selección.

Solo debe hacer lo mismo en su caso. Esto requerirá que escriba un módulo muy simple que implemente la función hook_nodeapi y verifique las actualizaciones de la misma manera que lo hace el módulo Smileys parcheado.

+0

Gracias por la sugerencia. Terminé usando una función de tema para hacer el truco, ya que es un poco más limpio en este caso específico. – googletorp

0

Puede usuario hook_nodeapi con estuche prepare:

Ejemplo:

/** 
* Implementation of hook_nodeapi 
*/ 

function mymodulename_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) { 
    switch($op) {  
    case 'prepare': 
     $module_path = drupal_get_path('module' , 'mymodulename'); 
     drupal_add_js($module_path."/myscript.js"); 
     break; 
    } 
} 

Ahora puede agregar el código Javascript en su módulo de carpeta, por ejemplo, myscript.js.

Cuestiones relacionadas