3

この質問で説明されているようなタスクがあります: 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のバグですか?

4

0 に答える 0