symfony2中Collection表单类型的数据模型转换器

时间:2013-10-03 11:38:06

标签: symfony

我有这个问题中描述的任务:My transformer doesn't work ( from model data to form data )

目前我正在使用symfony 2.2.4,不幸的是,答案对我来说不起作用,并出现以下错误:The name "Цвет" contains illegal characters. Names should start with a letter, digit or underscore and only contain letters, digits, numbers, underscores ("_"), hyphens ("-") and colons (":").

我的自定义表单类型:

class KeyValueType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('key', 'text', array(
                'required' => false
            ))
            ->add('value', 'text', array(
                'required' => false
            ))
        ;
    }

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

我的数据:

array(
    'Цвет' => 'Red'
);

并使用我的表单类型:

$transformer = new AssocArrayToKeyValueTransformer;

$builder->add(
    $builder->create('values', 'collection', array(
        'type' => new KeyValueType(),
        'required' => false,
        'allow_add' => true,
        'allow_delete' => true
    ))
    ->addModelTransformer($transformer)

经过一番挖掘后,我看到在模型转换https://github.com/symfony/Form/blob/master/Form.php#L321之前触发了FormEvents :: PRE_SET_DATA事件,而对于集合表单类型,则有ResizeEventListener。

所以我写了一些黑客:

$transformer = new AssocArrayToKeyValueTransformer;

$builder->add(
    $builder->create('modification_values', 'collection', array(
        'type' => new KeyValueType(),
        'required' => false,
        'allow_add' => true,
        'allow_delete' => true
    ))
    ->addModelTransformer($transformer)
    ->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
        $form = $event->getForm();
        $data = $event->getData();

        $result = array();
        if ($data) {
            foreach ($data as $key => $value) {
                $result[] = array(
                    'key' => $key,
                    'value' => $value
                );
            }
        }

        $event->setData($result);
    }, 1)
);

想法是我在PRE_SET_DATA事件中更改我的数据,优先级= 1(比ResizeFormListener更大),这意味着我只使用我的变换器进行反向转换。工作得很好,但感觉非常hacky。你能为我提供更好的解决方案吗?是symfony2的错误吗?

0 个答案:

没有答案
相关问题