12
votes

Symfony2: champ de formulaire d'entité avec valeur vide

J'ai une définition de formulaire qui utilise le type entité code>. Avec l'option Query_Builder code> i Sélectionnez mes valeurs et que les valeurs sont affichées.

La partie triste est, je dois afficher une valeur par défaut null code>, comme tout code> (c'est un formulaire de filtre). Je n'aime pas les choix code> option code> d'entité code> parce que j'ai des valeurs de base de données et un formelype code> ne doit pas interroger la base de données. P>

Mon approche jusqu'à présent consistait à mettre en place un type de champ personnalisé qui s'étend sur entité code> et ajoute une entrée null en haut de la liste. Le type de champ est chargé et utilisé mais malheureusement, la valeur nominale n'est pas affichée. P>

La définition de champ: p> xxx pré>

Le type de formulaire Définition: p >

class FirstNullEntityType extends AbstractType
{

    /**
     * @var unknown
     */
    private $doctrine;

    public function __construct(ContainerInterface $container)
    {
        $this->doctrine = $container->get('doctrine');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setRequired('query_builder');
        $resolver->setRequired('class');
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $class = $options['class'];
        $repo = $this->doctrine->getRepository($class);

        $builder = $options['query_builder']($repo);
        $entities = $builder->getQuery()->execute();

        // add dummy entry to start of array
        if($entities) {
            $dummy = new \stdClass();
            $dummy->__toString = function() {
                return '';
            };
            array_unshift($entities, $dummy);
        }

        $options['choices'] = $entities;
    }

    public function getName()
    {
        return 'first_null_entity';
    }

    public function getParent()
    {
        return 'entity';
    }
}


1 commentaires

Vous pouvez utiliser $ choix [''] = 'TOUS'; Dans votre définition de type de formulaire


3 Réponses :


3
votes

Une autre approche serait d'utiliser un Choicelist avec des choix générés à partir de la base de données, puis utilisez-le dans un type de formulaire de choix personnalisé qui permettra un vide_value .

liste de choix xxx

service de liste de choix (YAML) xxx < / pré>

type de formulaire personnalisé xxx

type de formulaire personnalisé service (YAML) < Pré> xxx

dans votre formulaire xxx


7 commentaires

Merci pour votre grande réponse. De cette façon, je dois enregistrer les deux machinechoiceliste et firstNullentityType en tant que service et devez transmettre la liste sur le type, n'est-ce pas?


Oui, c'est correct. J'ai mis à jour mes réponses avec les versions YAML de ces services.


Merci de votre aide. J'ai fini par construire le choticelist directement dans le type de champ, car il apparaît plus flexible pour moi. La clé était d'étendre le champ comme vous l'avez suggéré.


Qu'est-ce qui flotte de votre bateau, homme. Heureux d'avoir aidé un peu.


AVIS: Empty_Value est remplacé dans Symfony V2.6 avec un espace réservé , pour tous les champs de choix ( Symfony.com/doc/2.6/Reference/Forms/TTTYPES/... )


C'est beaucoup de code pour ce qui devrait être un drapeau unique sur l'entitéype :(


Essayez cette réponse: Stackoverflow.com/questions/ 47553427 / ...



4
votes

Vous pouvez utiliser un espace réservé à partir de 2,6


1 commentaires

L'espace réservé ne semble pas fonctionner avec Query_Builder



30
votes

Voici ce qui fonctionne dans Symfony 3.0.3

Utilisez Symfony \ Bridge \ Doctrine \ Form \ Type \ EntityTpe; Code> P>

$builder->add('example' EntityType::class, array(
    'label' => 'Example',
    'class' => 'AppBundle:Example',
    'placeholder' => 'Please choose',
    'empty_data'  => null,
    'required' => false
));


2 commentaires

Soyez conscient vide_data => null ne fonctionnera pas avec ChoceType


Réglage de l'espace réservé à une chaîne vide comme ceci: '"espace porteur" =>' ' fonctionne bien.