#php #jquery #ajax #forms #symfony
#php #jquery #ajax #формы #symfony
Вопрос:
У меня есть следующая форма, которая содержит данные из базы данных, которую она все еще обрабатывает (мне не хватает нескольких полей, которые я еще не добавил). Форма загружает данные в первом выборе, и на основе этого выбора я использую ajax для заполнения второго выбора параметрами, основанными на первом выборе (в основном, ассоциациями с выбранным значением). И оттуда снова другой выбор с определенными параметрами и так далее, и в конце, когда я отправляю форму, я хочу сгенерировать отчет из базы данных на основе данных. На данный момент я застрял со вторым полем, потому что я всегда получаю сообщение об ошибке:
This value is not valid.
Класс form:
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('survey', EntityType::class, [
'class' => SurveyManager::class,
'placeholder' => 'Choose option',
'attr' => [
'class' => 'field-change',
],
])
->add('headquarter', ChoiceType::class, [
'choices' => [],
])
->add('submit', SubmitType::class, [
'label' => 'Save',
])
;
}
Я не совсем уверен, как исправить ошибку или как мне обращаться с этим типом формы. Не могли бы вы мне помочь, ребята?
Основываясь на ответе, я сделал это
$builder->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$form->add('headquarter', EntityType::class, [
'class' => HeadQuarterManager::class,
'query_builder' => function(HeadQuarterManagerRepository $er) {
return $er->getHeadquarter($data['survey']);
},
]);
}
);
Но я получаю эту ошибку:
Notice: Undefined variable: data
Не совсем уверен, как передать данные в метод getHeadquarter, чтобы я мог вернуть массив id => name для выбора.
Ответ №1:
Когда вы запускаете функцию $form->isValid()
, она проверяет форму, встроенную в buildForm
функцию. Любые дополнительные поля / значения, которых там нет, вызовут эту ошибку.
Вы можете изменить это поведение с помощью событий формы.
Комментарии:
1. я думал, что вы собираетесь сказать, что … 😀 проблема в том, что я никогда их не использовал, и я не совсем понял документацию: (
2. @L.S судя по всему, вам нужен вариант 3 symfony.com/doc/current/form/… Когда вы это сделаете, вы привыкнете к этому
3. хорошо, позвольте мне проверить эту часть, объединить некоторый код, и мы увидим, какие глупости я сделал. : D
Ответ №2:
В конце концов, вот как я это сделал:
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('survey', EntityType::class, [
'class' => SurveyManager::class,
'attr' => [
'class' => 'field-change',
],
])
->add('submit', SubmitType::class, [
])
->addEventListener(
FormEvents::PRE_SUBMIT,
function (FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
$modifier = $data['survey'];
$form->add('headquarter', EntityType::class, [
'class' => HeadQuarterManager::class,
'query_builder' => function (HeadQuarterManagerRepository $er) use ($modifier) {
return $er->getHeadquarter($modifier);
},
]);
}
);
}
Комментарии:
1. Как вы уже сделали, это правильный способ сделать это в symfony (ссылка: symfony.com/doc/current/form /… )