gpt4 book ai didi

symfony - 在自定义字段类型上使用表单事件监听器无法添加其他字段

转载 作者:行者123 更新时间:2023-12-03 17:50:40 25 4
gpt4 key购买 nike

我创建了一个自定义字段类型,默认情况下有 1 个字段。选择该字段值后,事件监听器已订阅该字段并被触发。如果该字段的值与我声明的任意值匹配,则假设将另一个字段添加到表单中。

问题是事件被触发,我可以在事件监听器中添加字段之前和之后进行调试,但是在返回表单时不会呈现新字段。

这是我尝试做的事情的简化版本。是的,我确实将自定义字段类型正确注册为服务。

主窗体类型

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('first_name','text')
->add('custom_field','my_custom_fields');
}

然后自定义类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('field_1','entity',array(/*My entity settings*/));

$formModifier = function(FormInterface $form, $campaign) use($options) {
$form->add('field_2', 'entity',array(/*my entity options*/))
->add('Save','submit',array('attr'=>array('class'=>'btn btn-primary')));
};

$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function(FormEvent $event) use ($formModifier, $options) {
// this would be your entity
$entity = $event->getData();
//var_dump($entity); exit; // This gets Hit
if(!$entity || !($entity instanceof My\Entity\Class) ){return;}
$formModifier($event->getForm(), $entity);
}
}
);

$builder->get('field_1')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formModifier, $options) {
$data = $event->getForm()->getData();
//var_dump($data); exit; //This gets hit
if(null === $data){ return;}
//var_dump($data); exit; // This also gets hit
$formModifier($event->getForm()->getParent(),$data);
//var_dump($event->getForm()->getParent()); exit; This also gets hit, AND FIELDS ARE PRESENT.
}
);

}
public function getName()
{
return 'my_custom_fields';
}

但是当我尝试更新此表单时:
public function updateFormAction(Request $request, MyEntityClass $entity)
{
$form = $this->createForm(new MyMainFormType(), $entity);
if ($request->isMethod('post')) {
$form->bind($request);
if($form->isValid()) {
return new JsonResponse(array(
'status': 'success',
'html': $this->renderView('my_twig_template.html.twig', array(
'form'=>$form->createView()
))
), 200);
}
}
}

然后 my_twig_template.html.twig:
{{form(form)}}

我有 javascript 监听字段的变化,这将执行 ajax 调用并尝试更新表单。但是,无论我传递什么数据,即使正在调用正确的事件,并且当表单仅呈现 my_custom_field 的第一个字段时,也会发生表单修改。类型被渲染。

关于为什么会发生这种情况的任何帮助将不胜感激。

最佳答案

该问题与新表单的 data_class 有关。一旦我添加了一个具有 2 个字段的新模型,并设置了一个指向该新模型的 data_class,这些字段就会出现。

Main Form type

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('first_name','text')
->add('custom_field','my_custom_fields',array(
'data_class' => 'Namespace\Bundle\Form\Type\Model\MyCustomFieldsClass'
));
}

然后只是一个简单的类:
<?php
namespace Namespace\Bundle\Form\Type\Model;

class MyCustomFieldsClass
{
public field_1;

public field_2;

/** getters & setters **/
}

关于symfony - 在自定义字段类型上使用表单事件监听器无法添加其他字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22677494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com