gpt4 book ai didi

zend-framework2 - ZF2 字段集和表单绑定(bind)

转载 作者:行者123 更新时间:2023-12-03 23:37:49 26 4
gpt4 key购买 nike

我正在尝试创建一个带有表单的页面,该表单包含两个字段集,每个字段集应填充不同的表。

我可以像专辑教程一样轻松创建一个表单,并像这样绑定(bind)数据:

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

我的 PageForm 类如下:

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

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

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

最佳答案

您必须在每个 Fieldset 中使用 setObject 并为其提供一个水化器。例如:

<?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');
// ...

关于zend-framework2 - ZF2 字段集和表单绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15681981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com