Symfony2 Data transformer on a Choice field type

2019-10-18 13:16发布

我一步与去一步如何使用数据转换器

问题是,如果我想要做什么用选择类型做到这一点? 我动态使用jQuery填充?

我测试了他们提供的例子(不创建一个自定义类型..)和它的作品100%与文本字段类型,但是这个当我将其更改为选择,并给它空选择,这是行不通的,确实有做页面加载后,我填充使用jQuery的选择?

型号 [选择与装入查询构建器和实体字段类型的模型实体...]

号码 [起初空选择,当模型更改我为那个型号的数字一个AJAX请求]

如果我离开数为文本字段,我手动输入一个有效的数字(看数据库)它的工作原理,但如果我让jQuery和选择类型,它返回一个错误的形式与模型中的无效值。

在这两种情况下,我处理表单之前做的print_r($请求 - >请求),并在这两种情况下,提交这是正确的在这个例子中位数=> 1,但不知何故,当其类型选择,但是当它不转换数据它的文本它。

这是jQuery是如何填充的号码选择框数据:

<option value=”1”>1234ABCDEFG</option>

顺便说一句,我用标识,这将是选择的选项的值转化。

Answer 1:

好。 什么,你需要做的就是听preSubmit形式的事件,然后将其添加到您的选择因素主要接受提交的值。

http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#cookbook-form-events-submitted-data

================================================== =====

我没看你的贴斌但这里似乎为我工作的例子。 这是一个简单的性别选择列表中,我添加另一种选择客户端。 该preSubmit监听器简单地包含任何提交的选项替换默认性别选择的选项。 你应该能够在添加数据转换的东西,是好去。

namespace Cerad\Bundle\TournBundle\Form\Type\Test;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormFactoryInterface;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class DynamicFormType extends AbstractType
{
    public function getName() { return 'cerad_tourn_test_dynamic'; }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('gender', 'choice', array(
            'choices'   => array('m' => 'Male', 'f' => 'Female'),
            'required'  => false,
        ));
        $builder->addEventSubscriber(new DynamicFormListener($builder->getFormFactory()));
    }
}
class DynamicFormListener implements EventSubscriberInterface
{
    private $factory;

    public function __construct(FormFactoryInterface $factory)
    {
        $this->factory = $factory;
    }

    public static function getSubscribedEvents()
    {
        return array(
            FormEvents::PRE_SUBMIT   => 'preSubmit',
            FormEvents::PRE_SET_DATA => 'preSetData',
        );
    }
    public function preSetData(FormEvent $event)
    {
        // Don't need
        return;
    }
    public function preSubmit(FormEvent $event)
    {
        $data = $event->getData();
        $gender = $data['gender'];
        if (!$gender) return; // If nothing was actually chosen

        $form = $event->getForm();

        /* =================================================
         * All we need to do is to replace the choice with one containing the $gender value
         * Once this is done $form->isValid() will pass
         *
         * I did attempt to just add the option to the existing gender choice 
         * but could not see how to do it.  
         * $genderForm = form->get('gender'); // Returns a Form object
         * $genderForm->addNewOptionToChoicesList ???
         * 
         * Might want to look up 'whatever' but that only comes into play
         * if the form fails validation and you paas it back to the user
         * You could also use client side javascript to replace 'whatever' with the correct value
         */
        $form->add($this->factory->createNamed('gender','choice', null, array(
            'choices'   => array($gender => 'whatever'),
            'required'  => false,
            'auto_initialize' => false,
        )));
        return;
    }
}


文章来源: Symfony2 Data transformer on a Choice field type