Symfony: Une utilisation du type array de Doctrine

check 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: , , , ,

A propos de l'auteur

Tim

Développeur web spécialisé Symfony, il est avant tout passionné de web tout simplement. Il aime les défis et farfouiller dans le code de Symfony ou Doctrine. Fondateur du blog, il exerce chez Autrement.

Vous avez aimé ce billet? Faites le savoir!

  • Delicious
  • Twitter
  • Technorati Favorites
  • FriendFeed
  • Google Bookmarks
  • Share/Bookmark

3 Réponses

  1. Adrien 27 novembre 2009 à 21 h 50 min #

    Rigolo, merci pour l’expérimentation !

  2. Sacri94 20 mai 2010 à 10 h 01 min #

    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 !

  3. florian 28 juin 2010 à 15 h 59 min #

    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]


Laisser un message