2016-11-08 79 views
1

问题:使用$ 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' 一 '单' 集合()...?

+0

更新:我已经能够通过使用上面的链接中的集合文档示例来获得进程工作。 使用一个模拟具有1:1,1:多关系的模型的字段集。 问题仍然存在 - 但如何使用不相关的对象填充两个或多个字段集的表单 –

+0

示例包含一个带有验证码的注册表单。我可以创建一个函数,直接添加到表单中,然后我必须为每个表单重复此操作[或者扩展一个抽象表单]。 –

+0

你解决了你的问题吗?我也有同样的建议。当你从工厂检索一个字段集时,使用表单的'init()'。如果你只有简单的输入,你可以将它们包含到fieldset的'__construct()'方法或表单中。 –

回答

0

在您的网页上,检查与您的字段集相关的表单元素名称。他们应该是这样的:yourFieldsetName[yourElementName]。如果您只看到yourElementName,那很可能意味着在视图脚本中忘记了prepare()您的表单。

这正是我发生的事情,在我编写了这个表格之后,所有的对象都没有问题了。

UPDATE =对评论问题的回答:未如此解决。这是不好的设计?注意:我在视图中使用了prepare()。

如果一切正常,你的2个物体应该保湿。 use_as_base_fieldset标志主要用于说,'嘿,那就是我(字段集)你只应该用数据保存对象/从对象中提取数据'。所以你得到的是一个物体被水合而另一个没有水合物,反之亦然。如果不查看完整的代码,很难说出了什么问题。我担心发帖太多也需要时间让回答者掌握,而我的经验是,这些问题通常没有答案。我通常在像你这样的情况下做的是,我一步一步地在Zend FormFieldset的水合/提取方法中使用。我使用\Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die();。这不是我所设想的最好的方法,但它有效。

如果我是你,我也会做以下事情。

  1. 从你的文章中,不清楚为什么你使用表格的init()方法。当需要时使用init()方法,例如,表单中的某些元素从DB填充(如<select>)。 Form运行init()方法时,有些东西还没有在__construct()方法中可用,但只在表单实例创建后(不是100%确定这一点,请仔细检查此方法)。

  2. 不要担心好的/坏的设计。设计是一件非常好的事情,但是如果您有一个中小型系统,设计上的考虑不会影响系统的性能/复杂性。但是相反,你会花很多时间做正确的事情,而不是仅仅这样做,如果它可以正常工作,就会忘记它。

  3. 如果你不想与\Zend\Debug\Debug::dump($somethingThatYouWantToCheck); die();(这可能是非常乏味,我知道),创建一个fieldset并附加到你想要的2 fieldsets。然后在该表单中包含此字段集,并在此字段集上使用use_as_base_fieldset = true(当然,您还需要创建与此字段集相对应的对象,其中包含附加到当前字段集的两个嵌套对象,并将该对象附加到字段集)。

希望这有助于至少一点。