Подтвердить что ты не робот

Как вставить предварительно заряженный набор не-сущностей в symfony2

Я хочу встроить коллекцию предварительно заряженных форм без сущностей, вот код, сначала это метод родительской формы buildForm.

public function buildForm(FormBuilderInterface $builder, array $options) {
    $builder->add("example1")->add("example2");
    $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
        /*some logic to do before adding the collection of forms*/
        $form->add('aclAccess', 'collection', array(
            'type' => new ChildFormType(),
            'allow_add' => true,
            'mapped' => false,
            'data' => /* I dont know how to precharge a collection of non-entity forms*/
        ));
    });
}

теперь дочерняя форма

public function buildForm (FormBuilderInterface $builder, array $options) {
    $builder->add("test1", "text", array("read_only" => true, "data" => "test"));
    $builder->->add("test2", "choice", array(
        'choices'   => array('opt1' => 'Opt1', 'opt2' => 'Opt2'),
        'multiple'  => true,
        'expanded'  => true
    ));
}

так что я хочу управлять этими дочерними опциями в поле test2 как разделенные формы, каждая группа параметров будет зависеть от значения поля test1, я знаю, что это можно сделать путем кодирования каждый в ветке без классов формы, но я думаю имея классы классов, это лучшая практика для запуска теста phpunit, для ремонтопригодности и т.д.

4b9b3361

Ответ 1

В документации по Использование формы без класса связанные данные - это всего лишь массив.

Если вы не выполните ни одно из этих действий, форма вернет данные как массив. В этом примере, поскольку $defaultData не является объектом (и нет опции data_class), $form->getData() в конечном счете возвращает массив.

И чтобы устранить любое заблуждение, которое может иметь о данных формы - базовый объект/класс типа формы не обязательно должен быть сущностью - вы можете использовать любой класс с общедоступными свойствами или геттеры/сеттеры, которые сопоставляются с формой поля. В этом отношении классы Entity не имеют ничего особенного - у них просто есть информация о сопоставлении, которая сообщает ORM, как их сохранить.

Но, вернемся к вашему оригинальному вопросу, я не знаю, как выглядит ваш ChildFormType, но пусть он имеет два поля: sequence и title

    $form->add('aclAccess', 'collection', array(
        'type' => new ChildFormType(),
        'allow_add' => true,
        'mapped' => false,
        'data' => array(
            array('sequence' => 1, 'title' => 'Foo')
          , array('sequence' => 2, 'title' => 'Bar')
        )
    ));

Это должно сделать трюк