这是给你的解决方案:
实体和表单类型被最小化(没有 getter/setter)
假设您有两个实体 Category 和 Product 看起来与此类似:
/**
* @ORM\Table()
* @ORM\Entity()
*/
class Category
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="name", type="string")
*/
private $name;
/**
* @var \Doctrine\Common\Collections\ArrayCollection
* @ORM\OneToMany(targetEntity="Product", mappedBy="category")
*/
private $products;
public function __toString()
{
return $this->name;
}
}
/**
* @ORM\Table()
* @ORM\Entity(repositoryClass="Acme\DemoBundle\Entity\ProductRepository")
*/
class Product
{
/**
* @var integer
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
* @ORM\Column(name="name", type="string")
*/
private $name;
/**
* @var string
* @ORM\Column(name="description", type="text")
*/
private $description;
/**
* @var Category
* @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
*/
private $category;
/**
* @var boolean
*/
private $cancel;
/**
* @var boolean
*/
private $asap;
}
现在,为产品取消创建元模型:
class Cancel
{
/**
* @var string
*/
private $name;
/**
* @var \Doctrine\Common\Collections\ArrayCollection
*/
private $products;
/**
* Constructor
*/
public function __construct()
{
$this->products = new \Doctrine\Common\Collections\ArrayCollection();
}
}
注意:这不是实体(表),而只是普通的 'ol PHP 对象。
为这些 Product 和 Category 生成 CRUD,并使用以下 buildForm 方法为 Cancel 模型创建 CancelType:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('name');
$builder->add('products', 'collection', array('type' => new ProductType()));
}
创建将呈现我们的新 CancelType 的操作
public function cancelAction()
{
$em = $this->getDoctrine()->getManager();
$productsToCancel = $em->getRepository('AcmeDemoBundle:Product')->findAll();
$cancel = new Cancel();
foreach ($productsToCancel as $product) {
$cancel->addProduct($product);
}
$form = $this->createForm(new CancelType(), $cancel);
return $this->render('AcmeDemoBundle:Product:cancel.html.twig', array(
'form' => $form->createView(),
));
}
并使用以下内容创建 cancel.html.twig:
<div>
{{ form_widget(form.name) }}
</div>
{% for product in form.products %}
<fieldset>
<legend>{{ product.vars.value.category.name }}</legend>
<table>
<tr>
<td>{{ product.vars.value.name }}</td>
<td>
{{ form_widget(product.cancel) }} cancel
{{ form_widget(product.asap) }} asap
</td>
</tr>
<tr>
<td>
{{ product.vars.value.description }}
</td>
</tr>
</table>
</fieldset>
{% endfor %}
通过标准 Symfony2 表单验证,您将拥有您想要的一切以及优势。
最后一件事是在控制器中添加操作来处理表单提交:)