Как вставить предварительно заряженный набор не-сущностей в 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, для ремонтопригодности и т.д.
Ответы
Ответ 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')
)
));
Это должно сделать трюк