【发布时间】:2017-03-21 15:47:51
【问题描述】:
问题:使用 $form->bind($object) 时,表单中的多个字段集未填充/水合。您如何以 2 个不同的实体对象的形式填充 2 个不同的字段集? 我有 2 个字段集:FieldsetA、FieldsetB
一个表单 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,但我从数据库中检索数据 OK。 注意:如果我设置此标志 'use_as_base_fieldset' => true, 然后填充 1 个对象(服务提供者),反之亦然,如果我将位置字段设置为 'true' 然后填充。 我一直在寻找几个小时,反复试验没有成功,我希望这只是我的疲劳,错过了一个简单的设置/配置步骤来让它工作。
总结:如何在一个表单中使用 2 个或更多实体填充 2 个或更多字段集? Bind(), 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' => true 的“单个”集合, 用于绑定()...?
【问题讨论】:
-
更新:通过使用上面链接中的集合文档示例,我已经能够使该过程正常工作。使用模拟具有 1:1 、 1:many 关系的模型的单个字段集。但问题仍然存在 - 如何用不相关的对象填充两个或多个字段集的形式
-
示例包括带有验证码的注册表单。我可以创建一个函数来直接将Recaptcha 添加到有效的表单中(但是我必须为每个表单重复此操作[或扩展抽象表单])
-
您的问题解决了吗?我也有同样的……一个建议。当您从工厂检索字段集时,将使用表单的
init()。如果您只有简单的输入,您可以将它们包含在字段集或表单的__construct()方法中。 -
没有这样解决。这是糟糕的设计吗?注意:我在视图中使用 prepare()。
-
嘿,抱歉回复晚了。更新了我的答案,因为 cmets 中没有足够的空间。
标签: php zend-form zend-framework3 zend-form-fieldset