Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/08/2013, 14:42
Avatar de Delek
Delek
 
Fecha de Ingreso: marzo-2005
Ubicación: Madrid
Mensajes: 75
Antigüedad: 19 años, 9 meses
Puntos: 0
Formularios embebidos

Acudo a vosotros una vez más por un problema que llevo arrastrando toda la semana. Me dieron otra vez un proyecto en symfony 1.4 y tengo que crear un formulario que vaya añadiendo campos según se necesiten.

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:
### 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 }
En la clase TareasSubtipo le puse en el configure un unset para el id y un embedRelation con la tabla TareasTipo.
Y la clase TareasTipo es la siguiente:

Código:
class 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);
  } 

}
En el action he creado una clase add y una clase submit

Código:
  public 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');
   }
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 parcial

Código:
<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...
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.

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.