El esquema es sencillo, 5 tablas, de las cuales todas se relacionan con TareasTipo. Voy a poner solo dos tablas para no meter tanto código.
Código:
En la clase TareasSubtipo le puse en el configure un unset para el id y un embedRelation con la tabla TareasTipo.### Tareas ### TareasTipo: actAs: { Timestampable: ~ } columns: id: { type: integer, notnull: true, primary: true, autoincrement: true } nombre: { type: string(255), notnull: true } descripcion: { type: string(255), notnull: true } codigo: { type: string(255), notnull: true } user_add: { type: integer, notnull: true } seguimiento: { type: boolean, default: true } cliente: { type: boolean, default: true } relations: TareasSubtipo: { type: many, onDelete: CASCADE, onUpdate: CASCADE, class: TareasSubtipo, local: id, foreign: id_tarea_tipo } TareasSubtipo: actAs: { Timestampable: ~ } columns: id_tarea_subtipo: { type: integer, notnull: true, primary: true, autoincrement: true } id_tarea_tipo: { type: integer, notnull: true, primary: true } nombre_subtipo: { type: string(255), notnull: true } descripcion_subtipo: { type: string(255), notnull: true } codigo_subtipo: { type: string(255), notnull: true } relations: TareasTipo: { type: one, onDelete: CASCADE, onUpdate: CASCADE, class: TareasTipo, local: id_tarea_tipo }
Y la clase TareasTipo es la siguiente:
Código:
En el action he creado una clase add y una clase submitclass TareasTipoForm extends BaseTareasTipoForm { public function configure() { unset($this['id']); $nUser = sfContext::getInstance()->getUser()->getGuardUser()->getId(); $nDate = date('y-m-d H:i:s'); $this->setDefault('user_add', $nUser); $this->setDefault('created_at', $nDate); $this->setDefault('updated_at', $nDate); $this->setWidget('user_add', new sfWidgetFormInputHidden()); $this->setWidget('created_at', new sfWidgetFormInputHidden()); $this->setWidget('updated_at', new sfWidgetFormInputHidden()); $this->embedRelation('TareasSubtipo'); } public function addNewFields($number){ $newTareasSubtipo = new BaseForm(); for($i=0; $i <= $number; $i+=1){ $tareasSubtipo = new TareasSubtipo(); $tareasSubtipo->setTareasTipo($this->getObject()); $tareasSubtipoForm = new TareasSubtipoForm($tareasSubtipo); $newTareasSubtipo->embedForm($i,$tareasSubtipoForm); } $this->embedForm('subtipo', $newTareasSubtipo); } public function bind(array $taintedValues = null, array $taintedFiles = null){ $new_subtipos = new BaseForm(); foreach($taintedValues['subtipo'] as $key => $new_subtipo){ $subtipo = new TareasSubtipo(); $subtipo->setTareasTipo($this->getObject()); $subtipoForm = new TareasSubtipoForm($subtipo); $new_subtipos->embedForm($key, $subtipoForm); } $this->embedForm('subtipo',$new_subtipos); parent::bind($taintedValues, $taintedFiles); } }
Código:
Y en la vista unicamente llamo a un javascript que me va añadiendo los campos de TareasSubtipo en un div que llamo por un parcialpublic function executeAdd(sfWebRequest $request){ $this->forward404unless($request->isXmlHttpRequest()); $number = intval($request->getParameter("num")); $this->form = new TareasTipoForm(); $this->form->addNewFields($number); return $this->renderPartial('subtipo',array('form' => $this->form, 'number' => $number)); } public function executeSubmit(sfWebRequest $request){ $tainted_values = $request->getParameter('tareas_tipo'); $tareasTipo = Doctrine::getTable('TareasTipo')->find($tainted_values['id']); $this->form = new TareasTipoForm($tareasTipo); $this->form->bindAndSave($tainted_values); $this->getUser()->setFlash('notice', 'Se ha creado un nuevo tipo de tarea'); $this->redirect('tareas'); }
Código:
En principio todo parece funcionar correctamente, pero no me carga los datos en la bd, le he dado mil vueltas a ver si es que al no tener el valor de la id del TareasTipo, no me valida el formulario, pero según creo primero carga los datos del formulario principal y luego de los embebidos, por lo que tendria que crear el id de la relación.<Form> Llamo por renderRow a los campos de TareasTipo..... etc... <div id="subtipo"></div> <a id="addcampos" href="#" class="boton boton_cuadrado">Añadir</a> etc...
Le puse un foreach antes de hacer el bindAndSave y todos los datos los regoge sin problema y lo más raro de todo es que no sale nada en los logs del error de porque no me valida el formulario, se redirige perfectamente a la página principal y salta el flash de que se ha añadido una nueva tarea, pero no carga ningún dato.
A ver si por casualidad os ha pasado esto mismo a alguno de vosotros.