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.