ZF2 字段集和表单绑定 [英] ZF2 Fieldsets and Form Binding

查看:26
本文介绍了ZF2 字段集和表单绑定的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个页面,其中包含一个包含两个字段集的表单,每个字段集都应填充不同的表格.

I'm trying to create one page with a Form with two fieldsets that should each populate a different table.

我可以像相册教程一样轻松创建一个表单,并像这样绑定数据:

I can easily create One form as in the Album tutorial, and bind the data like this:

    $pageForm  = new PageForm();
    $pageForm->bind($page);

我的 PageForm 类如下:

with my PageForm class as follows:

class PageForm extends Form
{

    public function __construct($name = null)
    {
        // we want to ignore the name passed
        parent::__construct('page');
        $this->setAttribute('method', 'post');    


        $this->add(array(
            'name' => 'id',
            'attributes' => array(
                'type'  => 'hidden',
            ),
        ));
    } /// and a bunch of other elements

但如果我将这些元素放入字段集,则绑定不再有效,此外我需要将每个字段集绑定到一个单独的表,并且一旦提交表单,它们需要保存到单独的表中.

but if I put these elements into fieldsets the bind no longer works, besides I would need to bind each fieldset to a separate table, and they need to save into the separate tables once the form is submited.

我该怎么做,我想我可以使用两种形式来完成,但这可能不是正确的方法(如果我正确理解了字段集的概念)?

How would I go about this, I think I can do it using two forms but that is probably not the right way to go about it (If I understand the concept of fieldsets correctly)?

推荐答案

你必须在每个 Fieldset 中使用 setObject 并为其提供一个 hydrator.例如:

you have to use setObject in each Fieldset and provide a hydrator to it. eg:

<?php
// file My/Form/Product.php

namespace My\Form;

use Zend\Form\Fieldset;
use My\Entity\Product as ProductEntity;
use Zend\Stdlib\Hydrator\ClassMethods();

class Product extends Fieldset
{
    public function __construct($name = 'product')
    {
        parent::__construct($name);
        $this->setObject(new ProductEntity())
             ->setHydrator(new ClassMethods());

        $this->add(array(
            'name' => 'name',
            'options' => array('label' => 'Product name'),
        ));

        // Brand fieldset
        $brand = new Brand();
        $this->add($brand);
    }
}



// File My/Form/Brand.php
namespace My\Form;

use Zend\Form\Fieldset;
use My\Entity\Brand as BrandEntity;
use Zend\Stdlib\Hydrator\ClassMethods();

class Brand extends Fieldset
{
    public function __construct($name = 'brand')
    {
        parent::__construct($name = 'brand');
        $this->setObject(new BrandEntity())
             ->setHydrator(new ClassMethods());

        $this->add(array(
            'name' => 'name',
            'options' => array('label' => 'Brand name'),
        ));
    }
}


// File My/Form/ProductForm.php
namespace My\Form;

use Zend\Form\Form;
use My\Entity\Product as ProductEntity;
use Zend\Stdlib\Hydrator\ClassMethods();

class ProductForm extends Form
{
    public function __construct($name = 'product')
    {
        parent::__construct($name);
        $this->setObject(new ProductEntity())
             ->setHydrator(new ClassMethods());

        // Product Fieldset
        // Here, we define Product fieldset as base fieldset
        $product = new Product();
        $product->setUseAsBaseFieldset(true);
        $this->add($product);
    }
}

// In Module.php
// ...
    public function getServiceConfig()
    {
        return array(
            'invokables' => array(
                'My\Form\Product' => 'My\Form\Product',
            ),
        );
    }
// ...

// In Controller
// You don't need to use $form->bind($productEntity), except if you're editing a product.
// The form already has an Object, do you remenber??? "$this->setObject(new ProductEntity())" on form???

// ...
    $form = $this->getServiceLocator()->get('My\Form\Product');
// ...

这篇关于ZF2 字段集和表单绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆