Symfony2 Forms BooleanToStringTransformer Issue

j'ai un champ booléen que j'ai mis dans une forme comme un champ de choix (oui ou non). J'obtiendrais 0 ou 1 sans transformateur de données. J'ai ajouté une vue BooleanToStringTransformer (qui semblait raisonnable):

$builder
        ->add(
            $builder->create('myBooleanField', 'choice', array(
                'choices' => array(true => 'Yes', false => 'No'),
            ))
            ->addViewTransformer(new BooleanToStringTransformer('1'))
        )

Et quand j'essaie d'afficher le formulaire, j'obtiens l'erreur "on Attend une valeur Booléenne.". Mon champ est défini à false avant de créer la forme cependant.

j'ai essayé de le Définir comme un transformateur modèle: la forme est dissipée, mais quand je le soumets mon le champ est déclaré invalide.

Qu'est-ce que je fais de mal?

Edit: je me suis presque maintenant.

  • j'ai utilisé un transformateur de modèle au lieu d'un transformateur de vue (le champ de choix fonctionne avec des chaînes ou des entiers, pas booléens)
  • j'ai changé ma liste de choix de array(true => 'Yes', false => 'No') à array('yes' => 'Yes', 'no' => 'No')

ainsi le code ressemble maintenant à ->addModelTransformer(new BooleanToStringTransformer('yes'))

données la transformation fonctionne, sauf que mon champ est toujours réglé à true, quelle que soit la valeur que je choisis.

Qu'est-ce qui ne va pas?

4
demandé sur Nanocom 2013-08-30 12:29:01

3 réponses

la réponse est: je n'aurais pas dû penser que le Symfony BooleanToStringDataTransformer par défaut faisait le travail. Il renvoie null pour une valeur false au lieu d'une chaîne de caractères.

donc j'ai créé mon propre datatransformer:

<?php

use Symfony\Component\Form\DataTransformerInterface;
use Symfony\Component\Form\Exception\TransformationFailedException;

class BooleanToStringTransformer implements DataTransformerInterface
{
    private $trueValue;
    private $falseValue;

    public function __construct($trueValue, $falseValue)
    {
        $this->trueValue = $trueValue;
        $this->falseValue = $falseValue;
    }

    public function transform($value)
    {
        if (null === $value) {
             return null;
        }

        if (!is_bool($value)) {
            throw new TransformationFailedException('Expected a Boolean.');
        }

        return true === $value ? $this->trueValue : $this->falseValue;
    }

    public function reverseTransform($value)
    {
        if (null === $value) {
            return null;
        }

        if (!is_string($value)) {
            throw new TransformationFailedException('Expected a string.');
        }

        return $this->trueValue === $value;
    }
}
5
répondu Nanocom 2013-08-30 10:21:15

vous semblez avoir utilisé un transformateur de vue au lieu d'un transformateur modèle. Vous aurez besoin d'Inverser-transformer 0/1 en booléen dans le transformateur de modèle si le modèle sous-jacent attend des valeurs booléennes.

.. ou vous avez peut-être manqué d'implémenter la méthode de transformation inverse dans votre transformateur de vue.

en savoir plus sur la différence entre les transformateurs de vue et de modèle ici .

1
répondu nifr 2013-08-30 09:00:26

une autre solution peut être:

->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
    $data = $event->getData();

    if (isset($data['myBooleanField'])) {
        $data['myBooleanField'] = (bool) $data['myBooleanField'];

        $event->setData($data);
    }
})
0
répondu umpirsky 2015-02-25 11:14:12