IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Annuler un DataTransformer durant un event de formulaire [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut Annuler un DataTransformer durant un event de formulaire
    Bonjour à tous,

    Je suis dans un cas assez épineux dans mon formulaire : Un attribut ResourceId représenté par un ChoiceType chargé par Ajax via Select2 à l'intérieur d'une Collection elle-même à l'intérieur du Form.

    Mon ChoiceType valide si mon attribut est vide (Cas Create). Si mon attribut n'est pas vide, que ce soit pour renvoyer la valeur actuelle ou injecter une nouvelle, impossible de valider, en raison du préchargement de la valeur existante.

    C'est le DataTransformer de Symfony qui bloque, j'ai ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    transformationFailure: TransformationFailedException {#4328 ▼
      #message: "Unable to reverse value for property path "resourceId": The choice "bd922d35fb828da6e39edf3c7927511c9a6be025" does not exist or is not unique"
    J'aimerais donc voir pour désactiver ce Transformer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                $builder->get('resourceId')->resetViewTransformers();
                $builder->get('resourceId')->resetModelTransformers();
    Ces 2 appels, dans buildForm(), ne suffisent pas. Je dois gérer ça par les Event de Formulaire.


    Je vous appelle donc à l'aide , merci de votre temps.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2013
    Messages : 139
    Points : 459
    Points
    459
    Par défaut
    Bonjour à tous,

    J'ai trouvé la solution par moi même, aussi je vous la partage. Les Event étaient une mauvaise piste, à la place j'ai override la classe ChoiceType et retiré les DataTransformer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class NonTransformedChoiceType extends ChoiceType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            parent::buildForm($builder, $options);
            $builder->resetModelTransformers();
            $builder->resetViewTransformers();
        }
    }
    A noter que cette solution peut laisser passer des vulnérabilités coté Js. A vos risques et périls.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2008, 10h58
  2. Réponses: 16
    Dernier message: 30/01/2008, 15h11
  3. Réponses: 8
    Dernier message: 24/04/2006, 13h00
  4. Réponses: 1
    Dernier message: 01/02/2006, 22h54
  5. [Event]Annuler la fermeture d'une application
    Par willowII dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 16/11/2004, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo