问题:使用$ form-> bind($ object)时,表单中的多个字段集不会被填充/水合。你如何填充2个不同的字段集以形成2个不同的实体对象? 我有2个字段集:FieldsetA,FieldsetBzf2/zf3使用对象保存多个字段集
表单RegisterFrom在其init调用这些()方法
class RegisterForm extends Form
{
public function init(){
$this->add(array(
'name' => 'service_provider_fieldset',
'type' => ServiceProviderFieldset::class, // this is one model/entity
));
$this->add(array(
'name' => 'location_fieldset',
'type' => LocationFieldset::class, // this is a separate model/entity
));
}
}
创建的字段集:(注意水化注释掉尝试)
class ServiceProviderFieldset extends Fieldset
{
public function init(){
//parent::__construct($name);
/*
$this
->setHydrator(new ClassMethodsHydrator(false))
->setObject(new ServiceProvider())
;
*/
/*
$this
->setHydrator(new ReflectionHydrator(false))
->setObject(new ServiceProvider())
;
*/
$this->add(array(
'type'=>'Hidden',
'name'=>'id',
'options'=>array(
'label' => 'Service Provider Id'
),
'attributes'=>array(
'id'=>'providerId'
)
));
}
}
控制器:
$provider = $this->findServiceProviderById($providerId); // this is set from DB call and correctly creates a Provider() object with populated values.
$location = $this->findServiceProviderLocationById($locId);
$form = $formManager->get(RegisterForm::class);
$form->bind($provider);
$form->bin($location);
// $form->get('service_provider_fieldset')->bindValues(...);
查看:
$formElement = $form->get('service_provider_fieldset')->get('email');
etc...
表单在视图中呈现正确,但没有填充数据。
注意:不使用Doctrine,但我从数据库检索数据确定。 注意:如果我将此标志设置为'use_as_base_fieldset'=> true,则将填充1个对象(ServiceProvider),反之亦然,如果我将位置字段设置为'true'则填充。 我一直在寻找几个小时,试验和错误没有成功,我希望这只是我的疲劳,错过了一个简单的设置/配置步骤,以使其工作。
摘要:如何在一个表单中填充2个或更多个实体以及2个或更多个实体? 绑定(),fieldset-> bindValues()?
尝试:
$form->get('service_provider_fieldset')->allowObjectBinding(true);
$form->get('service_provider_fieldset')->allowedObjectBindingClass(\Provider\Form\ServiceProviderFieldset::class);
这些都是一些链接是接近,但仍无法填充通过独立的实体都字段设置。 ZF2 Form Hydration with multiple objects and fieldsets https://framework.zend.com/manual/2.4/en/modules/zend.form.collections.html hydrating multiple objects from fieldsets ZF2
的集合(产品/品牌/种类)实施例意味着使用=>为真,用于绑定的'use_as_base_fieldset' 一 '单' 集合()...?
更新:我已经能够通过使用上面的链接中的集合文档示例来获得进程工作。 使用一个模拟具有1:1,1:多关系的模型的字段集。 问题仍然存在 - 但如何使用不相关的对象填充两个或多个字段集的表单 –
示例包含一个带有验证码的注册表单。我可以创建一个函数,直接添加到表单中,然后我必须为每个表单重复此操作[或者扩展一个抽象表单]。 –
你解决了你的问题吗?我也有同样的建议。当你从工厂检索一个字段集时,使用表单的'init()'。如果你只有简单的输入,你可以将它们包含到fieldset的'__construct()'方法或表单中。 –