3

我有这个问题中描述的任务:我的转换器不起作用(从模型数据到表单数据)

目前我使用 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 更大),这意味着我只使用我的变压器进行反向变换。工作得很好,但感觉真的很老套。你能给我提供更好的解决方案吗?是symfony2的bug吗?

4

0 回答 0