Gérer les valeurs multiples avec Symfony et les formulaires AJAX
Si vous utilisez une requête AJAX pour soumettre vos formulaires, vous avez pu constater que les valeurs vides des champs à crochets (champs[]) sont ignorées. Cela pose problème quand vous avez plusieurs champs à crochets et que vous vous attendez à ce qu'ils aient les mêmes dimensions.
Pour contourner ce problème, il suffit de numéroter vos champs. Par exemple :
<?php echo input_field('champ-1', 'valeur 1') ?>
<?php echo input_field('champ-2', 'valeur 2') ?>
<?php echo input_field('champ-3', 'valeur 3') ?>
Par la suite, vous pouvez récupérer ces valeurs très simplement, quelque soit leur nombre avec le code suivant :
// Fetch the request parameter names.
$parameter_names = $this->getRequest()->getParameterHolder()->getNames();
// Fetch the fields named 'champ-'
// $fields is a array of field names matching 'champ-%d'.
$fields = preg_grep('/^champ-\d+$/', $parameter_names);
foreach($fields as $field_name)
{
$matches = array();
if(preg_match('/^champ-(\d+)$/', $field_name, $matches))
{
$id = $matches[1];
$object = ObjectPeer::retrieveByPk($id);
$object->setName($this->getRequestParameter($field_name));
$object->save();
}
}
Remarque: Il est tout à fait possible de récupèrer les numéro des valeurs 'champ-' en une seule fois avec la ligne :
$parameter_names = $this->getRequest()->getParameterHolder()->getNames();
$fields = preg_grep('/^champ-\d+$/', $parameter_names);
$field_ids = str_replace('champ-', '', $fields); // $fields is a array of field names matching 'champ-%d'.
Cela peut vous servir pour récupèrer les valeurs des cases à cocher cochées pour, par exemple, supprimer des objets :
ObjectPeer::doDelete($field_ids);