我有这个问题中描述的任务:我的转换器不起作用(从模型数据到表单数据)
目前我使用 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吗?