Отправить значение по умолчанию в форму из контроллера

У меня есть цикл, в котором создается форма для каждого "Joueur", который у меня есть:

    foreach ($joueurs as $j) 
    {
        $sUniqueFormName = 'Form' . $j->getId(); 
        $oForm = $this->get('form.factory')->createNamed($sUniqueFormName, PlayedType::class, $played);
        $aForms[$sUniqueFormName] = $oForm;            
    }

Я хочу отправить в свою форму этот Entity Joueur и установить его как значение по умолчанию.

Форма :

class PlayedType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('joueur')
            ->add('max')
            ->add('score')
            ->add('points')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Played::class,
        ]);
    }
}

Здесь атрибут 'joueur' является типом выбора, и я хочу установить это значение с помощью 'joueur', который я получаю в цикле по умолчанию.

Является ли это возможным ?

JS - События опций формы
JS - События опций формы
В продолжение предыдущей статьи CSS - стили, связанные с вводом формы , в этой статье мы будем использовать JS для взаимодействия с формами, на этот...
CSS - Стили, связанные с вводом формы
CSS - Стили, связанные с вводом формы
Общими стилями ввода для форм являются Input (включая Text, Radio, checkbox), Select и Textarea, из которых Input относительно прост, поэтому в этой...
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Создание многостраничной формы заявления о приеме на работу с помощью Angular
Наличие на корпоративном сайте форм заявлений о приеме на работу, или "трудовых анкет", экономит время и деньги как для соискателей, так и для...
0
0
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте установить joueur непосредственно на сущность played, например, так:

foreach ($joueurs as $j) {
    $sUniqueFormName = 'Form' . $j->getId();
    $played->setJoueur($j);
    $oForm = $this->get('form.factory')->createNamed($sUniqueFormName, PlayedType::class, $played);
    $aForms[$sUniqueFormName] = $oForm;
}

К сожалению, это не работает :/ В форме не задано значение атрибута joueur

Patrick Rey 14.03.2019 14:36
Ответ принят как подходящий

Передайте массив как 4-й аргумент со значением $j:

foreach ($joueurs as $j) 
{
    $sUniqueFormName = 'Form' . $j->getId(); 
    $oForm = $this->get('form.factory')->createNamed($sUniqueFormName, PlayedType::class, $played, array('joueur' => $j);
    $aForms[$sUniqueFormName] = $oForm;            
}

Проверьте конструктор для получения дополнительной информации: https://api.symfony.com/3.3/Symfony/Component/Form/FormFactory.html

И восстановите его в PlayedType с помощью $options и установите его как свойство данных.

class PlayedType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $form = $event->getForm();
            $form->add('joueur', null, array(
                 'data' => $event->getData() ?: options['joueur']
             ))
            ->add('max')
            ->add('score')
            ->add('points')
            ;
        });
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Played::class,
            'joueur' => null
        ]);
    } 
}
symfony.com/doc/current/reference/forms/types/choice.html#da‌​ta«Опция dataвсегда переопределяет значение, взятое из данных домена (объекта) при рендеринге. Это означает, что значение объекта также переопределяется, когда форма редактирует уже сохраненный объект, в результате чего он теряет свое сохраненное значение при отправке формы».
Fabian Schmick 14.03.2019 13:54

Не работает, я получаю эту ошибку: Опция «joueur» не существует. Определенные параметры: «action», «allow_extra_fields», «allow_file..... Должен ли я установить этот joueur в configureOptions или что-то в этом роде?

Patrick Rey 14.03.2019 13:57

Версия Симфони?

AythaNzt 14.03.2019 14:04

Я использую Симфони 4.2

Patrick Rey 14.03.2019 14:07

Я кое-что забыл. Проверьте мое редактирование в функции configureOptions. Вы должны добавить свойство joueur там

AythaNzt 14.03.2019 14:08

@PatrickRey, но вы знаете, что это решение больше не будет работать, если вы используете эту FormType в качестве формы редактирования, потому что опция data перезаписывает сохраненные данные из объекта.

Fabian Schmick 14.03.2019 14:23

Да, я прочитал ваш комментарий, я просто использую его как новую форму на данный момент, так что все в порядке. Но если у вас есть вариант получше, я возьму его :)

Patrick Rey 14.03.2019 14:38

Чтобы избежать случая (переопределить данные), о котором говорит @Fabian, вы должны использовать только $event->getData() ?: options['joueur'] вместо options['joueur']. я редактирую свой ответ

AythaNzt 14.03.2019 14:45

откуда вы берете эту переменную $event?

Patrick Rey 14.03.2019 14:45

Когда форма будет отправлена, в поле 'joueur' появятся данные о себе, которые отправил пользователь.

AythaNzt 14.03.2019 14:52

@PatrickRey $options['data'] вместо $event сделает то же самое

Fabian Schmick 14.03.2019 14:55

У меня это не работает, пишет «Уведомление: неопределенная переменная: событие» или если я помещаю $options['data'] вместо $event : Попытка вызвать неопределенный метод с именем «getData» класса «App\Entity \Играл".

Patrick Rey 14.03.2019 15:25

Проверь сейчас. Я не добавлял слушателя для перехвата события.

AythaNzt 14.03.2019 15:46

Нет, еще нет :D: Ошибка типа: Аргумент 1, переданный в App\Form\PlayedType::App\Form\{closure}(), должен быть экземпляром App\Form\FormEvent, экземпляром Symfony\Component\Form\FormEvent дали, призвали

Patrick Rey 14.03.2019 15:55

Другие вопросы по теме