symfony - 根据 Symfony 5 中另一个字段中的用户选择值动态填充字段
问题描述
我正在尝试从“ https://symfony.com/doc/current/form/dynamic_form_modification.html#form-events-submitted-data ”这边“根据用户在 Symfony 5 中另一个字段中的选择动态更新字段” . 但是我遇到了这个异常/错误“传递给 App\Form\SportMeetupType::App\Form{closure}() 的参数 2 必须是 App\Form\Sport 的实例或 null,给出的 App\Entity\Sport 的实例,称为在 C:\Apache24\htdocs\dynamicform\src\Form\SportMeetupType.php 中第 58 行“调用 ajax 时。
我的代码:
形式 :
class SportMeetupType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('sport', EntityType::class, [
'class' => 'App\Entity\Sport',
'placeholder' => '',
])
;
$formModifier = function (FormInterface $form, Sport $sport = null) {
$positions = null === $sport ? [] : $sport->getPositions();
$form->add('position', EntityType::class, [
'class' => 'App\Entity\Position',
'placeholder' => '',
'choices' => $positions,
]);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
// this would be your entity, i.e. SportMeetup
$data = $event->getData();
$formModifier($event->getForm(), $data->getSport());
}
);
$builder->get('sport')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
// It's important here to fetch $event->getForm()->getData(), as
// $event->getData() will get you the client data (that is, the ID)
$sport = $event->getForm()->getData();
// since we've added the listener to the child, we'll have to pass on
// the parent to the callback functions!
$formModifier($event->getForm()->getParent(), $sport); // Here line 58 and error show this line
}
);
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => SportMeetup::class,
]);
}
}
控制器:
/**
* @Route("/new", name="sport_meetup_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$sportMeetup = new SportMeetup();
$form = $this->createForm(SportMeetupType::class, $sportMeetup);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($sportMeetup);
$entityManager->flush();
return $this->redirectToRoute('sport_meetup_index');
}
return $this->render('sport_meetup/new.html.twig', [
'sport_meetup' => $sportMeetup,
'form' => $form->createView(),
]);
}
树枝/视图:
{% extends 'base.html.twig' %}
{% block title %}New SportMeetup{% endblock %}
{% block body %}
<h1>Create new SportMeetup</h1>
{{ form_start(form) }}
{{ form_row(form.name)}}
{{ form_row(form.sport) }} {# <select id="sport_meetup_sport" ... #}
{{ form_row(form.position) }} {# <select id="sport_meetup_position" ... #}
{# ... #}
{{ form_end(form) }}
{% endblock %}
JavaScript 代码:
var $sport = $('#sport_meetup_sport');
// When sport gets selected ...
$sport.change(function() {
// ... retrieve the corresponding form.
var $form = $(this).closest('form');
// Simulate form data, but only include the selected sport value.
var data = {};
data[$sport.attr('name')] = $sport.val();
// Submit data via AJAX to the form's action path.
$.ajax({
url : $form.attr('action'),
type: "POST",
data : data,
success: function(html) {
// Replace current position field ...
$('#sport_meetup_position').replaceWith(
// ... with the returned one from the AJAX response.
$(html).find('#sport_meetup_position')
);
// Position field now displays the appropriate positions.
}
});
});
当更改运动下拉值时,调用 ajax 并在下面显示异常/错误“传递给 App\Form\SportMeetupType::App\Form{closure}() 的参数 2 必须是 App\Form\Sport 的实例或 null,App 的实例\Entity\Sport 给定,在第 58 行的 C:\Apache24\htdocs\dynamicform\src\Form\SportMeetupType.php 中调用"
请帮我....
解决方案
确保在您的 SportMeetupType.php 中有:
use App\Entity\Sport;
我认为您使用了错误的课程。
推荐阅读
- java - 如何从 ListView 中删除一个项目并在 Firebase 上删除它?
- html - 为什么“字体粗细”适用于“选择”元素的选定“选项”,而“颜色”不适用?
- python - 使用其中一个 DataFrame 的列名合并两个 DataFrame
- r - 填补空白,具体取决于缺失值的长度以及 R 中最后一个和上一个已知值
- python - 如何在python中平滑后反卷积
- angular - Angular 8 Videojs 不适用于移动浏览器(在 Android 和 iOs 中)
- android - 如何在 Kotlin 中使用 Google Drive Rest API v3
- sql - Postgres 删除完全外连接
- xslt - 基于参数的 XSLT 动态求和
- reactjs - 功能组件反应的单元测试