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.