我有一个简单的问题, 我如何创建表单列表元素,如网格或这样:
[x] name | image | [button]
[ ] name | image | [button]
[x] name | image | [button]
<table>
<tr><th>checkbox</th><th>name</th><th>action</th></tr>
<tr><td><input type="checkbox"></td><td>name</td><td><button>OK</td></tr>
<tr><td><input type="checkbox"></td><td>name</td><td><button>OK</td></tr>
<tr><td><input type="checkbox"></td><td>name</td><td><button>OK</td></tr>
</table>
//从db,array(object,object,object)列出实体 // object = Application \ Entity \ Area
$areas = $this->getObjectManager()->getRepository('Application\Entity\Area')->findAll();
我在表单Zend \ Form \ Element \ Collection中使用但是我不知道如何从db填充收集日期,所以我有清晰的表单。
我应该正确地做什么以及使用什么?
答案 0 :(得分:0)
从Doctrine开始,您已经获得了一个可迭代的数据类型(数组)。所以你只需要在你的视图中迭代它:
...
<?php foreach($this->data as $area): ?>
//your table row markup for a single entity
<?php endforeach; ?>
...
答案 1 :(得分:0)
免责声明:I have asked a similar question,没有回答。所以我也很想知道'Zend'的方式,或者是否有人能够提出替代方案。
以下方法似乎对我有用。
<强> ListForm.php 强>
在“列表”表单中添加一个集合。
/** The collection that holds each element **/
$name = $this->getCollectionName();
$collectionElement = new \Zend\Form\Element\Collection($name);
$collectionElement->setOptions(array(
'count' => 0,
'should_create_template' => false,
'allow_add' => true
));
$this->add($collectionElement);
此集合将包含集合元素(Zend\Form\Element\Checkbox
)
/** The element that should be added for each item **/
$targetElement = new \Zend\Form\Element\Checkbox('id');
$targetElement->setOptions(array(
'use_hidden_element' => false,
'checked_value' => 1,
));
$collectionElement->setTargetElement($targetElement);
然后我添加了一些方法,允许我将ArrayCollecion
传递给表单。对于我的集合中的每个实体,我将创建一个新的$targetElement
;将其检查值设置为实体的ID。
/**
* addItems
*
* Add multiple items to the collection
*
* @param Doctrine\Common\Collections\Collection $items Items to add to the
* collection
*/
public function addItems(Collection $items)
{
foreach($items as $item) {
$this->addItem($item);
}
return $this;
}
/**
* addItem
*
* Add a sigle collection item
*
* @param EntityInterface $entity The entity to add to the
* element collection
*/
public function addItem(EntityInterface $item)
{
$element = $this->createNewItem($item->getId());
$this->get($this->getCollectionName())->add($element);
}
/**
* createNewItem
*
* Create a new collection item
*
* @param EntityInterface $entity The entity to create
* @return \Zend\Form\ElementInterface
*/
protected function createNewItem($id, array $options = array())
{
$element = clone $this->targetElement;
$element->setOptions(array_merge($element->getOptions(), $options));
$element->setCheckedValue($id);
return $element;
}
然后需要的是将集合从控制器操作中传递给表单。
<强> SomeController 强>
public function listAction()
{
//....
$users = $objectManager->getRepository('user')->findBy(array('foo' => 'bar'));
$form = $this->getServiceLocator()->get('my_list_form');
$form->addItems($users);
//...
}
答案 2 :(得分:0)
您可以使用DoctrineModule\Form\Element\ObjectMultiCheckbox
在数据库中使用doctrine填充多选复选框,如下页所示:
https://github.com/doctrine/DoctrineModule/blob/master/docs/form-element.md
只需要将实体管理器传递给表单,然后按照示例中的相同操作创建ObjectMultiCheckbox表单元素...
或其他更好的-moro自动化工作方法,如果你想使用你需要的集合(@orm \ OneToMany和@orm \ ManyToOne)与区域...并创建一个fieldset在这里的形式......:
http://framework.zend.com/manual/2.2/en/modules/zend.form.collections.html
并将方法添加到另一个实体以添加和删除区域:
public function addArea(Collection $areas)
{
foreach ($areas as $area) {
$area->setOtherEntity($this);
$this->areas->add($area);
}
}
public function removeAreas(Collection $areas)
{
foreach ($areas as $area) {
$area->setOtherEntity(null);
$this->areas->removeElement($area);
}
}
如果您使用水合作用,则会在您自动选择时添加和删除这些值...