Más con Symfony

6.4. Embebiendo formularios

Haciendo uso de sfForm::embedForm(), es posible combinar fácilmente los formularios independientes ProductForm y ProductPhotoForms. Esta combinación siempre se realiza en el formulario principal, que en este caso es ProductForm. Los requerimientos de la aplicación exigen que se puedan subir hasta dos fotos de producto a la vez. Para conseguirlo, se embeben dos objetos ProductPhotoForm dentro de ProductForm:

// lib/form/doctrine/ProductForm.class.php
public function configure()
{
  $subForm = new sfForm();
  for ($i = 0; $i < 2; $i++)
  {
    $productPhoto = new ProductPhoto();
    $productPhoto->Product = $this->getObject();

    $form = new ProductPhotoForm($productPhoto);

    $subForm->embedForm($i, $form);
  }
  $this->embedForm('newPhotos', $subForm);
}

Si accedes con tu navegador al módulo product, verás que ya es posible subir dos objetos ProductPhoto, así como modificar el propio objeto Product. Symfony guarda automáticamente los nuevos objetos ProductPhoto y los relaciona con su correspondiente objeto Product. Incluso la subida de los archivos, definida en ProductPhotoForm, funciona correctamente.

Ejecuta las siguientes tareas para comprobar que los registros se han guardado correctamente en la base de datos:

$ php symfony doctrine:dql --table "FROM Product"
$ php symfony doctrine:dql --table "FROM ProductPhoto"

En la tabla ProductPhoto puedes ver los nombres de archivo de las fotos. Todo funciona correctamente siempre que en el directorio web/uploads/products/ existan archivos con el mismo nombre que el guardado en la base de datos.

Nota Como los campos filename y caption son obligatorios en ProductPhotoForm, la validación del formulario principal siempre falla a menos que el usuario suba dos nuevas fotos. Sigue leyendo para aprender cómo solucionar este problema.