请解释我如何将值绑定到这样的形式:
<?php
namespace ZfcAdmin\Form;
use Zend\Form\Form;
use Zend\Form\Element;
class FeelistUploadForm extends Form {
public function __construct($objectManager) {
parent::__construct('feelist');
$this->setAttribute('method', 'post');
$this->setAttribute('class', 'form');
$fieldset = new FeelistFieldset($objectManager);
$fieldset->setUseAsBaseFieldset(true);
$this->add(array(
'type' => 'Zend\Form\Element\Collection',
'name' => 'feelist',
'options' => array(
'label' => 'fee list',
'should_create_template' => true,
'allow_add' => true,
'target_element' => $fieldset,
),
));
$this->add(array(
'name' => 'submit',
'type' => 'Submit',
'attributes' => array(
'value' => 'Save',
'id' => 'submitbutton',
'class' => 'button',
),
));
}
}
和字段集
class FeelistFieldset extends Fieldset implements InputFilterProviderInterface {
public function __construct($objectManager, $options = array()) {
$this->setHydrator(new DoctrineHydrator($objectManager, 'InsurancyProduct\Entity\Feelist'))
->setObject(new Feelist());
parent::__construct('feelist');
$this->add(array(
'name' => 'id',
'type' => 'Hidden',
));
$this->add(array(
'name' => 'csv',
'type' => 'Zend\Form\Element\File',
'options' => array(
'label' => 'csv',
),
));
$this->add(array(
'type' => 'text',
'name' => 'valid_from',
'options' => array(
'label' => 'valid from',
),
'attributes'=> array(
'id' => 'validfrom',
),
));
}
public function getInputFilterSpecification()
{
return array(
);
}
}
在我使用的控制器中
$feelist_form = new \ZfcAdmin\Form\FeelistUploadForm($objectManager);
$feelist_form->bind( new feelist());
我可以在控制器中获取绑定值,如下所示
$feelist = $objectManager
->getRepository('InsurancyProduct\Entity\Feelist')
->findBy(array('product_id' => $id));
我无法将其绑定到表单,它是对象数组,但是表单只接收单个对象。 形式当然是空的,我不知道如何将这些值绑定到形式。请不要把我送到RFTM,我已经阅读了48小时,关于zf2水合作用,表格等:(
答案 0 :(得分:0)
您可以查看rlandas wrote and uploaded to github
这个示例这是一个实施经典ZendFramework2 Product-Brand-Category sample
的工作项目这是控制器的代码:
<?php
namespace Product\Controller;
use Product\Table\ProductTable;
use Product\Entity\Product as ProductEntity;
use Product\Form\CreateProduct;
use Zend\Mvc\Controller\AbstractActionController;
use Zend\Http\PhpEnvironment\Response;
use Zend\View\Model\ViewModel;
class ManageController extends AbstractActionController
{
public function indexAction ()
{
$product = $this->getProductTable();
$products = $product->getAllOrderByName();
$view = new ViewModel();
$view->setVariable('products', $products);
return $view;
}
public function viewAction ()
{
if ($id = $this->params('id')) {
$product = $this->getProductTable()
->getByProductId($id);
}
$view = new ViewModel();
$view->setVariable('product', $product);
return $view;
}
public function addAction ()
{
$form = new CreateProduct();
$product = $this->getServiceLocator()->get('Product\Entity\Product');
$form->bind($product);
$data = array(
'product' => array(
'name' => 'product name ' . mt_rand(1, 1000),
'price' => mt_rand(100.000, 5000.999) / 100,
'brand' => array(
'name' => 'My brand ' . mt_rand(1, 200),
'url' => 'http://www.mybrand.com'
),
'categories' => array(
array('name' => 'Sony'),
array('name' => 'Panasonic'),
array('name' => 'Phillips')
)
)
);
$form->populateValues($data);
// action viewscript
$view = new ViewModel(array(
'form' => $form
));
// do Post/Redirect/Get (PRG) strategy to stop user refresh/back button
$prg = $this->prg($this->getRequest()->getRequestUri(), true);
if ($prg instanceof Response) {
return $prg;
}
// this is when the user first arrives to this url, display the form
else if ($prg === false) {
return $view;
}
// lets retrieve the post data stored in the PRG session
$post = $prg;
// validate the form
$form->setData($post);
if(!$form->isValid())
return $view;
// if data are valid, then save
// save the brand
$brand = $product->getBrand();
$brandTable = $this->getBrandTable();
$brand = $brandTable->save($brand);
$brandId = $brandTable->getLastInsertValue();
$product->setBrandId($brandId);
// save the categories
$categoryTable = $this->getCategoryTable();
$categoryTable->persist($product->getCategories())->flush();
$categoryIds = implode(",", $categoryTable->getEntityIds());
$product->setCategoryIds($categoryIds);
// save the product
$productTable = $this->getProductTable();
$product = $productTable->save($product);
$this->redirect()->toRoute('product');
return $view;
}
public function editAction ()
{
$form = new CreateProduct();
$product = $this->getServiceLocator()->get('Product\Entity\Product');
$form->bind($product);
// action viewscript
$view = new ViewModel(array(
'form' => $form
));
$productTable = $this->getProductTable();
if ($id = $this->params('id')) {
$product = $this->getProductTable()->getByProductId($id);
// get the brands
$brand = $this->getBrandTable()->getByBrandId($product->getBrandId());
$product->setBrand($brand);
// get the categories
$categoryIds = explode(",", $product->getCategoryIds());
$categories = $this->getCategoryTable()->getAllByCategoryId($categoryIds);
$product->setCategories($categories);
$form->bind($product);
}
// do Post/Redirect/Get (PRG) strategy to stop user refresh/back button
$prg = $this->prg($this->getRequest()->getRequestUri(), true);
if ($prg instanceof Response) {
return $prg;
}
// this is when the user first arrives to this url, display the form
else if ($prg === false) {
return $view;
}
// lets retrieve the post data stored in the PRG session
$post = $prg;
// validate the form
$form->setData($post);
if(!$form->isValid())
return $view;
\Zend\Debug\Debug::dump(__METHOD__.' '.__LINE__);
\Zend\Debug\Debug::dump($post);
\Zend\Debug\Debug::dump($product);
return $view;
}
/**
*
* @return \Product\Table\ProductTable
*/
public function getProductTable ()
{
$sm = $this->getServiceLocator();
$table = $sm->get('Product\Table\ProductTable');
return $table;
}
/**
*
* @return \Product\Table\BrandTable
*/
public function getBrandTable ()
{
return $this->getServiceLocator()
->get('Product\Table\BrandTable');
}
/**
*
* @return \Product\Table\CategoryTable
*/
public function getCategoryTable ()
{
return $this->getServiceLocator()
->get('Product\Table\CategoryTable');
}
}