Embebed Forms en Symfony, una forma fácil

Los formularios embebidos de symfony son una características muy buena del framework, el problema es que utilizarlos es bastante complicado y existe poca documentación oficial al respecto.

Toda esta duda me surgió debido a este video de Francois donde vi un nuevo método de Propel 1.5 para facilitar el proceso de embeber fomularios. El tema es que en varios proyectos que estoy llevando a cabo no tengo pensado migrar a nuevas versiones de symfony en un corto plazo, por eso quise facilitarme la vida implementando algo parecido. Vean el video para ver de lo que les hablo.

mergeRelation from Francois Zaninotto on Vimeo.

He trabajado un poco en el tema y realice una pequeña implementación para facilitar el trabajo parecida a la que se ve en el video, aquí la explicación.

El modelo

Todo parte de la suposición que tenemos una tabla 1 (tbl1) y otra tabla 2 (tbl2) que posee una relación con la primera, a travez del campo tbl1_id, deberemos respetar esta notación siempre para utilizar esta utilidad, la relación debe definirse a travez del campo tabla padre nombre seguido por _id, por ejemplo xxx_id.

Aquí un schema de ejemplo.

Generamos todo, modelo, forms, filters, sql

./symfony propel:build-all

Luego cargar las nuevas tablas a la base. Si no hay datos

./symfony propel:insert-sql

Modificaciones en las clases bases

Ahora, el siguiente paso es modificar la clase base de los forms para contar con los métodos reutilizables a fin de embeber formularios. Personalmente pienso que el mejor lugar es lib/forms/BaseFormPropel.class.php, si conocen un lugar mas apropiado para ubicarlos acepto la recomendación. Los métodos a añadir son tres.

loadAsEmbebedForm : Que añade la relación como un formulario embebido, se utilizará en el método configure de la clase Form del padre.

bindObjectToEmbebed : Al guardar, en caso de realizarse cambios, asocia el objeto padre a los objetos hijos de los formularios embebidos, se llama por bind.

is_seted_value : bindObjectToEmbebed lo utiliza para saber si se produjeron cambios en el formulario embebido.

bind : Redefinimos el metodo para llamar a bindObjectToEmbebed antes de realizar el bind de la clase base. El único que utilizaremos nosotros será loadAsEmbebedForm, los otros se invocarán automaticamente cuando corresponda. Debería quedarles algo así

El widget sfWidgetFormInputAjaxDelete

Luego será necesario que incorporen el widget sfWidgetFormInputAjaxDelete.class.php (lib/widget/) , este creará una entrada de texto con un boton X el cual al ser cliqueado invocará a la accion del modulo que especifiquen para borrar el elemento. Esta acciòn deberá ser implementada por ustedes en el modulo que les parezca.

Deberán tener instalado ysJQueryRevolutionsPlugin para que este widget funcione

http://www.symfony-project.org/plugins/ysJQueryRevolutionsPlugin

Configurar el Formulario Embebido

Con esto tenemos configurada nuestra instalación para embeber todos los formularios que querramos. Veamos como sería para embeber en Tbl1 el formulario Tbl2, lo único que deberemos hacer es configurar el form del modelo Tbl1 (tabla padre) para contener a Tbl2 (tabla hija). Para esto vamos a modificar el método configure utilizando el método recientemente añadido a la clase BaseFormPropel, loadAsEmbebedForm.

class Tbl1Form extends BaseTbl1Form {
public function configure() {
$this->loadAsEmbebedForm(‘tbl2’, ‘thetext’, ‘demo/deleteTbl2’);
}
}

Aquí deberán pasar como argumentos al método el nombre del modelo hijo, el método para leer la propiedad que se utilizará como etiqueta del formulario embebido y la URI para la acción que borrará el formulario embebido.
Al terminar deberían probar con alguno módulo que utilice el form y les saldría una cosa parecida a esta.sshot-1

Eso es todo amigos, les parece sencillo ?

Share

4 comments

  1. Interesante post Agustín!! Cuando nos tocó implementar los forms embebidos nos pegó un buen baile y no nos quedo una solución 100 x 100 prolija.
    Cuando lo pruebe te cuento como andubo.
    Un abrazo.

  2. Gracias mi viejo, avisame que tal, acordate que esto es para propel y symfony 1.2. si estas con 1.4 o 1.3 y tenes probel 1.5 no lo neceistas para nada, simplemente usas mergeForm o las otras métodos que andan dando vuelta.

    PD: Felicitaciones por el spawn 😉

  3. Hola Agustín saludos desde Venezuela, como estas, excelente tu trabajo pero como seria ahora en symfony2.4 ?

Leave a Reply

Your email address will not be published. Required fields are marked *