我有这个问题中描述的任务: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的错误吗?