drupal-header

Crear múltiples instancias de un mismo formulario en Drupal 6

El problema mas común a la hora de querer hacer que un formulario se repita mas de una vez en una misma pagina, es que cada uno de los formularios que se vayan creando van a ser solamente una fiel copia del anterior. Dicho de otra forma, estamos usando un solo formulario pero copiandolo en varios lados de la pagina.

Tuve este problema hace ya mas de un año pero no me olvido lo JODIDA-MENTE DIFÍCIL que me fue encontrar una solución, hasta que me di con esta pagina. Cuestión, que me salvó la vida (exagerado yo?). Por supuesto que les recomiendo que lean el articulo original, pero mas les recomiendo que lean mi interpretación de los hechos que esta mas buena :).

Para este ejemplo primero vamos a crear una url donde poder poner nuestras múltiples instancias:

Y la respectiva función:

Si van leyendo los comentarios del código se va a ir entendiendo. Definamos el formulario que queremos instanciar:

Bueno bueno bueno… hasta acá, si ejecutas el script lo que pasaría es que te saldrían tantos warning como formularios se invoquen. Y eso es debido a que no tenemos ningún formulario definido que se llame form_ejemplo_0, ni form_ejemplo_1, etc.

¿Soluciones?: Crear de la función form_ejemplo_0() para delante jajaja. No enserio, la solución es implementar el hook_forms(), que básicamente va a entender que se esta invocando un formulario inexistente y va a redireccionarlo a la definición ÚNICA que tenemos: form_ejemplo().

Bueno. ya está. este código así, funciona. Les dejo un mini-modulo con lo anterior para que lo vean funcionar. Instalenlo y miren en la URL “/form-multiples-instancias

DESCARGAR

3 Comments

  • Robert 21/09/2010

    Hola Capy, enhorabuena por el artículo, sobre todo la implementación del hook_forms.

    He estado probando el módulo y me ha surgido una cuestión la cual no se si es posible realizar. Sería estupendo que me pudiera guiar en como enfocar el tema ya que, Drupal es muy bueno pero a veces se complica mucho para los que no tenemos tantos conocimientos.

    El módulo genera los 5 formularios creados mediante la FAPI de Drupal a la perfección. Sin embargo, ¿sería posible sustituirlos por los formularios de creación de nodos?, es decir, el típico “node_add_form”. He probado en reemplazar la función que crea los $forms pero no consigo dar con la tecla.
    También he conseguido mostrarlos en pantalla pero todos ellos aparecen con el mismo ID lo cual no funcionan las validaciones, etc.

    Agradecería mucho su ayuda… Por lo demás, enhorabuena por el blog.

    Robert

    • Capy 24/09/2010

      Robert como estas. Es complicado de hacer lo que me decis… ya tuve esa experiencia y me decante por hacer un formulario FAPI de toda la vida y en el submit de ese formulario recojo toda la información en un objeto del tipo $nodo = stdClass(). Después hago un node_save($nodo) y listo.

      Lo anterior combinado con este articulo deberia resolver tu problema.

  • Robert 25/09/2010

    Hola Capy, muchas gracias por responderme tan rápido.

    He estado estudiando la solución que me propones y quizás se me escapa algo. Creando un formulario FAPI normal, con sus correspondientes campos y luego salvandolo como un nodo; funciona genial.

    El problema está en que, si tengo un tipo de contenido diferente, con varios campos (CCK), ¿debería crear el formulario con los mismos campos y repetir el contenido? ¿Crees que se podría capturar los campos del tipo de contenido directamente, con todas sus caracteríticas e incorporarlo en el formulario FAPI?

    Estoy hecho un lío… otra opción quizás podría ser experimentar solo con el hook_forms, pero no acabo de comprender cuales son los parámetros de retorno para alterar los ids de forma aislada.

    Qué difícil es a veces Drupal pero a la vez te obliga a ir mejorando. Muchísimas gracias por tu ayuda; los otros artículos publicados en el blog son muy buenos.

    Un saludo,
    Robert

:).