У меня есть цикл, в котором создается форма для каждого "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', который я получаю в цикле по умолчанию.
Является ли это возможным ?




Попробуйте установить 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;
}
Передайте массив как 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
]);
}
}
dataвсегда переопределяет значение, взятое из данных домена (объекта) при рендеринге. Это означает, что значение объекта также переопределяется, когда форма редактирует уже сохраненный объект, в результате чего он теряет свое сохраненное значение при отправке формы».Не работает, я получаю эту ошибку: Опция «joueur» не существует. Определенные параметры: «action», «allow_extra_fields», «allow_file..... Должен ли я установить этот joueur в configureOptions или что-то в этом роде?
Версия Симфони?
Я использую Симфони 4.2
Я кое-что забыл. Проверьте мое редактирование в функции configureOptions. Вы должны добавить свойство joueur там
@PatrickRey, но вы знаете, что это решение больше не будет работать, если вы используете эту FormType в качестве формы редактирования, потому что опция data перезаписывает сохраненные данные из объекта.
Да, я прочитал ваш комментарий, я просто использую его как новую форму на данный момент, так что все в порядке. Но если у вас есть вариант получше, я возьму его :)
Чтобы избежать случая (переопределить данные), о котором говорит @Fabian, вы должны использовать только $event->getData() ?: options['joueur'] вместо options['joueur']. я редактирую свой ответ
откуда вы берете эту переменную $event?
Когда форма будет отправлена, в поле 'joueur' появятся данные о себе, которые отправил пользователь.
@PatrickRey $options['data'] вместо $event сделает то же самое
У меня это не работает, пишет «Уведомление: неопределенная переменная: событие» или если я помещаю $options['data'] вместо $event : Попытка вызвать неопределенный метод с именем «getData» класса «App\Entity \Играл".
Проверь сейчас. Я не добавлял слушателя для перехвата события.
Нет, еще нет :D: Ошибка типа: Аргумент 1, переданный в App\Form\PlayedType::App\Form\{closure}(), должен быть экземпляром App\Form\FormEvent, экземпляром Symfony\Component\Form\FormEvent дали, призвали
К сожалению, это не работает :/ В форме не задано значение атрибута joueur