Ang*_*gel 9 forms collections builder symfony
我有一个包含集合的表单.所以我有:
/* my type */
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name')
->add('photos','collection',array(
'type'=> new PhotoType(),
'allow_add'=>true));
}
/*Photo Type*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('photoname')
->add('size')
}
Run Code Online (Sandbox Code Playgroud)
但我想访问照片中的数据,所以我尝试在PhotoType中:
$data = $builder->getData();
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用,即使我正在编辑表单,所以照片集合有数据.为什么我不能以另一个调用的形式访问$ builder-> getData()?因为我正在尝试不做和eventListener ......
Ber*_*sek 21
要了解这里发生的事情,您必须首先了解数据映射.你打电话的时候
$form->setData(array('photoname' => 'Foobar', 'size' => 500));
Run Code Online (Sandbox Code Playgroud)
表单的数据映射器负责获取给定的数组(或对象)并将嵌套的值写入表单的字段,即调用
$form->get('photoname')->setData('Foobar');
$form->get('size')->setData(500);
Run Code Online (Sandbox Code Playgroud)
但是在你的例子中,你没有处理Form,而是使用FormBuilder对象.FormBuilder负责收集表单的配置并使用此信息生成Form实例.因此,FormBuilder还允许您存储表单的默认数据.但由于它只是一个简单的配置对象,因此它不会调用数据映射器.例如:
$builder = $factory->createBuilder()
->add('photoname')
->add('size')
->setData(array('photoname' => 'Foobar', 'size' => 500));
print_r($builder->get('photoname')->getData());
print_r($builder->get('size')->getData());
Run Code Online (Sandbox Code Playgroud)
这个例子将输出:
null
null
Run Code Online (Sandbox Code Playgroud)
因为我们将数据映射FormBuilder转换为Form实例时会发生数据映射.我们可以使用此事实为各个字段设置单独的默认值:
$builder->add('size', null, array('data' => 100));
// which is equivalent to
$builder->get('size')
->setData(100)
->setDataLocked(true);
print_r($builder->get('photoname')->getData());
print_r($builder->get('size')->getData());
Run Code Online (Sandbox Code Playgroud)
并输出:
null
100
Run Code Online (Sandbox Code Playgroud)
需要数据锁定以防止数据映射器覆盖刚刚存储的默认数据.如果您传递"数据"选项,则会自动完成此操作.
最后,您将构建表单.现在,FormBuilder要求Form::setData()在必要时,这反过来将调用数据映射器:
$form = $builder->getForm();
// internally, the following methods are called:
// 1) because of the default data configured for the "size" field
$form->get('size')->setData(100);
// 2) because of the default data configured for the main form
$form->setData(array('photoname' => 'Foobar', 'size' => 500));
// 2a) as a result of data mapping
$form->get('photoname')->setData('Foobar');
// 2b) as a result of data mapping (but ignored, because the data was locked)
$form->get('size')->setData(500);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9885 次 |
| 最近记录: |