J'ai du mal à formuler une solution pour «éditer» un champ de mon formulaire dans mon contrôleur.

Voici ce que j'ai:

J'ai un formulaire symfony2 enregistré en tant que service que j'appelle dans une fonction de mon contrôleur. Je supprime un tas de champs qui ne sont pas nécessaires pour cet autre formulaire vers lequel je dirige mes utilisateurs, puis j'en ajoute quelques autres. (Je me rends compte que je pourrais créer un autre formulaire et créer un autre service et autre, mais pour mon objectif, ce serait un peu exagéré. Je le fais de cette façon parce que le formulaire fonctionne de la même manière, mais certains champs ne sont pas nécessaires et quelques nouveaux spécifiques les uns sont.)

Je voudrais maintenant essentiellement «éditer» un champ dans ce formulaire ... Le champ «profession». Ce champ est un champ choice agissant comme des boutons radio remplis par un tableau de choix. C'est required et n'a aucune exigence empty_value dans son état d'origine.

Je voudrais le modifier dans ma fonction de contrôleur pour avoir les mêmes valeurs exactes cependant avec une valeur required de false et un empty_value de null.

Avec le code commenté ci-dessous, le résultat est une disparition du champ occupation dans mon «nouveau» formulaire et il est remplacé par une liste déroulante vide. Je réalise que c'est parce que je remplace tout le champ ci-dessous, mais je ne peux pas comprendre comment le modifier simplement.

Code:

/**
 * Explanation of addAndRemoveFieldsInRegisterForm function:
 *  The function gets the 'registration' form and removes any
 *      fields not needed for the 'in_registration' form 
 *      and then adds the necessary fields to the form.
 */
private function addAndRemoveFieldsInRegisterForm($user)
{
    $form = $this->createForm('user_registration', $user);

    // http://stackoverflow.com/questions/10920006/pass-custom-options-to-a-symfony2-form ---
                        // --- use that to help. Look at changing the value of array.

    $form->remove('title');
    $form->remove('company');
    $form->remove('username');
    $form->remove('city');
    $form->remove('state');
    $form->remove('country');
    $form->remove('gender');
    $form->remove('age');
    $form->remove('roles');

    // $form->remove('occupation');

    // $pr = $form->get('occupation');
    //     $pr->set('required' => false);

    // $form->get('occupation')->add('required'=>false, 'empty_value'=>null);

    // $form->add('occupation','choice', array(
    //     'required' => false,
    //     'empty_value' => null, 
    // ));        
    // echo "<pre>";
    // var_dump(get_class_methods($form));die;
    $form->add('occupation','choice', array(
            'required' => false,
            'empty_value' => null,
    ));

    $form->add('canEmail', 'checkbox', array(
        'label' => 'Can Email?',
        'required' => false,
    ));

    $form->add('sendEmail', 'choice', array(
        'label' => 'Send Welcome Email? ',
        'required' => true,
        'mapped' => false,
        'expanded' => true,
        'choices' => array(
            "yes" => "Yes",
            "no" => "No"
            ),
    ));

    return $form;

}

Formulaire original (celui qui est utilisé comme service)

private $requireOccupation;

$this->requireOccupation = true;


->add('occupation','choice', $options['occupation'])


public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $occupation = array(
            "label" => "Which of these currently describes you best? (Occupation):",
            "expanded" => true,
            'required'=> $this->requireOccupation, 
            "choices" => array(
              "X" => "X",
              "B" => "B",
              "C" => "C",
              "J" => "J",
            ),
            'constraints' => array(
                new NotBlank()
            ));

    $resolver->setDefaults(array(
        'occupation' => $occupation,
    ));
}
0
Ale 17 janv. 2017 à 17:48

2 réponses

Meilleure réponse

Tout d'abord, je me rends compte que la façon dont je voulais résoudre ce problème est étrange si l'on considère que j'aurais pu créer un autre formulaire avec les champs que je voulais utiliser ou juste le seul champ qui devait changer et enregistrer le formulaire en tant que service pour l'utiliser ailleurs , mais j'ai été chargé de le compléter de cette façon.

Deuxièmement, ma solution est assez simple. Je passe des valeurs dans mon formulaire avec une valeur par défaut définie dans le formulaire.

Sous la forme:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $requireOccupation = true;
    $emptyValue = null;
    //whatever other values you want to set here

    $resolver->setDefaults(array(
        'requireOccupation' => $requireOccupation,
        'emptyValue' => $emptyValue,
    ));
}

Puis sur les propriétés du champ:

$builder->add('occupation', 'choice', array(
   "label" => "Some sort of label",
   "required" => $options['requireOccupation'],
   "empty_value" => $options['emptyValue'],
   ...
));

Maintenant dans le contrôleur:

    $form = $this->createForm('registration', $user, array(
            'requireOccupation' => false, 'emptyValue' => null
        ));

Appelez celui où vous souhaitez générer votre formulaire en transmettant les valeurs que vous souhaitez utiliser pour ce formulaire.

Je ne suis en aucun cas un expert de Symfony et cette solution générerait probablement des problèmes avec ceux qui le sont. Mais cela fonctionne pour moi.

0
Ale 18 janv. 2017 à 17:39

Je pense qu'il vaut mieux créer un autre formulaire. Il peut hériter de votre formulaire déjà défini pour ne modifier que le champ souhaité

class SomeFormType extends OriginalFormType {
    public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);
        $builder
            ->remove('someField')
            ->add('someField', 'choice', [
                "expanded" => true,
                "choices" => $yourArray
            ]);
    }

Il a l'avantage d'être mappé sur différents objets

0
goto 17 janv. 2017 à 15:00