Symfony: Une utilisation du type array de Doctrine
Oui, les billets Symfony commençaient à me manquer. Mais difficile de trouver et le temps et la ressource pour en faire. Mais voici une petite astuce illustrée qui permet de trouver une application au type array de Doctrine tout en simplifiant une problématique. Tout ce que j’aime.
Commençons par rendre à César ce qui est à César, j’avais dans l’idée d’essayer ce type mais les exemples sur la doc ou sur le net n’était pas légion. En bon fainéant que je suis, j’ai demandé un peu d’aide et c’est mon nouveau voisin de droite, Colin qui m’a soufflé un bout de code où il l’utilise.
Problématique
Il me fallait stocker le résultat d’une question à choix multiple sans pour autant avoir à manipuler ensuite ses résultats autrement que par simple visualisation. Du coup, je voulais éviter d’avoir à créer une table pour stocker ces réponses et une table d’association avec ma table miroir de mon formulaire.
C’est là où le type array intervient. Rien de compliqué en fait, il ne fait que simplifier un traitement tout bête qui consiste à stocker un tableau php en base après sérialisation. Et qui le désérialise quand on le récupère depuis un enregistrement de la base.
Une chose de moins à faire en fait et c’est bien là ce qu’on recherche nous autres développeurs, en faire le moins possible ;)
La solution codée
Niveau code, c’est très simple. On défini notre champ dans notre schema.yml comme n’importe quel autre champ
meschoix: { type: array(1000) }Qui donnera un champ text en mysql.
Ensuite, il suffit de modifier le formulaire obtenu pour transformer notre champ en liste de checkbox de manière très classique:
$this->widgetSchema['meschoix'] = new sfWidgetFormChoice(array( 'choices' => array( '0' => 'Choix1', '1' => 'Choix2', '2' => 'Choix3', '3' => 'Choix4' ), 'multiple' => true, 'expanded' => true ));
Et puis c’est tout! Maintenant, lors de l’enregistrement, Doctrine va sérialiser le résultat de votre sélection et le stocker en base. Et quand vous peuplerez votre formulaire avec des données en base, il le désérialisera et donnera les bonnes valeurs à notre liste de checkbox.
Bien sûr, ca nous oblige à ne pas changer l’ordre des questions et les rend difficilement modifiables. Mais c’est une décision qui doit être prise en connaissance de cette limitation.
Crédit photo: http://www.flickr.com/photos/40491122@N03/3738306829/
Tags: astuce, doctrine, form, PHP, Symfony
3 Réponses
Laisser un message

Rigolo, merci pour l’expérimentation !
C’est totalement ce que je cherchais !
Il est parfois plus simple d’utiliser cette solution plutôt que partir dans des relations one to many ou autre.
Merci en tout cas !
Sinon il y a le type enum de doctrine:
http://www.doctrine-project.org/projects/orm/1.2/docs/manual/defining-models/en#columns:data-types:enum
typiquement la meme chose, sauf qu’il gere les valeurs possibles au niveau de la definition du modele.
columns:
enumtest:
type: enum
values: [php, java, python]