sfForms et valeurs par défaut. Pourquoi est-ce que getDefault me renvoie null ?

Les formulaires de symfony ont quelquefois des comportements surprenants pour le développeur. Tout le monde pense immédiatement aux embed forms mais ce n’est pas de ces derniers dont je vais parler ici.

Je suis tombé sur le problème suivant : pourquoi après avoir passé une valeur par défaut à un des widgets de mon formulaire, je ne parviens pas à la récupérer dans mon action ou dans mon template ? L’appel à la méthode getDefault du sfForm me renvoie null, tout simplement.

Cas typique :


// Dans le code de mon formulaire :
$this->setWidgets(array(
  ...
  'my_field' => new sfMyWidget(array('default' => 'my_value')),
));

// Dans le code de mon action :
if ($my_form->getDefault('my_field') == 'some_value')
{
  ...
}

Dans ce cas, la méthode getDefault() appelée sur mon formulaire me renvoie null alors que j’ai explicitement donné une valeur par défaut à mon widget. Pourtant, en lisant la doc de symfony sur le sujet je retiens ceci :

The setDefault(), getDefault(), setDefaults(), and getDefaults() methods manages the default values for the embedded widgets. They are proxy methods for the getDefault() and setDefault() widget methods.

Les méthodes setDefault() et getDefault() au niveau de la classe sfForm sont censées êtres des raccourcis pour les méthodes setDefault() et getDefault() de la classe sfWidgetForm().

En fait il s’avère que ce n’est absolument pas le cas et que la méthode getDefault() du formulaire ne fait jamais appel à la méthode getDefault() du widget associé.

L’appel à $my_form->getDefault(‘my_field’) n’est donc pas équivalent à $my_form[‘my_field’]->getWidget()->getDefault().

Par conséquent, il est important de bien comprendre quelle méthode appeler et dans quel cas.

A savoir, $my_form->getDefault(‘my_field’) quand le setDefault a été utilisé au niveau du formulaire. Exemple :


// Valeurs passées dans mon formulaire :
$this->setWidgets(array(
  ...
  'my_field' => new sfMyWidget(),
));
$this->setDefault('my_field', 'my_value');

// Ou alors valeurs passées dans mon action :
$my_form = new myFormClass(array(
  ...
  'my_field' => 'my_value',
));

Et, $my_form[‘my_field’]->getWidget()->getDefault() quand le setDefault() a été utilisé au niveau du widget. Exemple :


// Dans le code de mon formulaire :
$this->setWidgets(array(
  ...
  'my_field' => new sfMyWidget(array('default' => 'my_value')),
));

Voilà, désormais vous êtes prévenus…

Publié par Olivier Balais

Jeune ingénieur logiciel basé à Lyon (@overnetcity) passionné par les NTIC et le développement Web, je suis actuellement salarié chez Reputation VIP et effectue en parallèle des missions ponctuelles en temps que Freelance. Passionné depuis toujours par l'informatique et le développement, suite à une formation solide à l'INSA de Lyon, je me suis spécialisé dans la réalisation de bout en bout de projets web complexes.

Rejoindre la conversation

2 commentaires

  1. Y a pas a dire symfony 1 c’est vraiment de la grosse bouse, je n’ai jamais compris pourquoi ce framework de m** est devenu si populaire… tout ce qui est sensé être simple est compliqué avec symfony!

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *