この質問で説明されているようなタスクがあります: My Transformers does not 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 よりも大きい) で変更することです。これは、トランスフォーマーを逆変換にのみ使用することを意味します。うまく機能しますが、本当にハッキーに感じます。より良い解決策を教えてもらえますか? symfony2のバグですか?