Symfony2.6: форма обрабатывает запрос с массивом данных вместо сущности

0

У меня есть FormType, который создает группы checkboxes на основе массива, который передается при создании этого FormType:

//FormType.php

public function __construct(array $choices, array $choicesData)
{
    $this->choices = $choices;
    $this->choicesData = $choicesData;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
    foreach ($this->choices as $bundle => $class) {
        $choiceBuilder = $builder->create($bundle, 'form', array('virtual' => true));
        foreach ($class as $name => $perm) {
            $choiceBuilder->add(
                    $name, 'choice', array(
                    'choices' => $perm,
                    'multiple' => true,
                    'mapped' => false,
                    'expanded' => true,
                    'required' => 'false',
                    'label' => $name,
                    'data' => $this->choicesData[$bundle][$name]
                )
            );
        }
        $builder->add($choiceBuilder);
    }
    $builder->add('salvar', 'submit', array('label' => false));
}

Примечание. В Type нет setDefaultOptions.

Затем я создаю форму:

//Controller.php

 $form = $this->createForm(new PermissaoType($choices, $choicesData), $choicesData);

Моя проблема: но когда я делаю handleRequest() данных, отправленных с POST getData(), не возвращает изменение формы, а только то, что установлено в $ optionsData. Может ли кто-нибудь помочь мне в этом?

//Controller.php

if ($request->isMethod('POST')) {

    $form->handleRequest($request); // Not Work
    $data = $form->getData(); // Return $choicesData original
}

Пример $ choiceData оригинал:

array(
    'group1' => array(
                    'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
    )
);

Пример представленной формы:

array(
'group1' => array(
                'item1' => array( 0 => 'chk1', 1 => 'chk3')
    )
);

Пример $ choiceData возвращается (после $form-> handleRequest() и $form-> getData()):

array(
    'group1' => array(
                    'item1' => array('chk1' => false, 'chk2' => false, 'chk3' => false)
    )
);

Спасибо большое.

Теги:
forms
symfony-forms

2 ответа

1
Лучший ответ

Я решил с изменениями ниже:

  • Удалить другие $ optionsData для $this-> createForm()

    $form = $this->createForm(new PermissaoType($choices, $choicesData));

  • 'data' => $this->choicesData[$bundle][$name] to 'data' => array_keys(array_intersect($this->choicesData[$bundle][$name], array(true)))

  • В FormType я изменил 'mapped' => false на 'mapped' => true

Спасибо @Jovan Perovic

0

Если я правильно помню, вам нужно инкапсулировать переданный array с именем формы в качестве ключа.

Например, если у вас есть что-то подобное в вашем классе FormType:

public function getName(){
    return 'some_form_name'
}

Затем вы должны пройти:

$data = array(
    'some_form_name' => $request->request->all() // Encapsulte 'POST' data
);

$form->submit($data);

Или вы можете инкапсулировать данные при их отправке. Тогда вы могли бы сделать книгу:

$form->handleRequest($request);

Надеюсь это поможет...

  • 0
    Я пробовал это: $form = $this->createForm(new PermissaoType($choices, $choicesData), array('Permissao'=>$choicesData)); Но не работа. Обратите внимание: «Permissao» это имя FormType.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню