【问题标题】:Using form event listeners on a custom field type fail to add additional fields在自定义字段类型上使用表单事件侦听器无法添加其他字段
【发布时间】:2023-03-09 01:27:01
【问题描述】:

我创建了一个默认具有 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 类型的第一个字段。

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

【问题讨论】:

  • 您确定自定义表单字段在 add() 调用中拼写正确吗?我看到 getName() 在 add() 中返回 'my_custom_fields' vs 'my_custom_field' ?
  • 是的,对不起,这段代码只是 sudo 代码。当我得到第一个字段出现时,该字段拼写正确。当第一个被更改时,其他任何一个都没有。
  • 如果您使用的是 symfony2.3,我不确定表单的绑定方法如何处理请求。您应该使用 $form->handleRequest($request)。无论如何,如果这个例子是完整的,那将会很有帮助。
  • 您希望看到的示例中缺少什么?我也改用handleRequest,没有变化
  • 我猜是模板和其他动作,我的意思是,这段代码就像documentation中的那个,所以如果所有这些都相等,问题可能出在其他地方.

标签: symfony symfony-forms symfony-2.3


【解决方案1】:

问题与新表单的 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 **/
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 2022-01-15
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多