我正在开发一个使用类表继承(http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html#class-table-inheritance)的 Symfony2/Doctrine 应用程序在咨询中管理投诉。每个咨询可以有许多投诉(OneToMany),每种不同类型的投诉都有不同的结构和外观。投诉是一个集合,使用 JS 动态添加。
在这一点上,我能够持久化投诉并将它们链接到咨询,方法是在持久化之前将它们重铸为控制器中的适当类型。我遇到了一些问题,我计划将其迁移到表单事件(http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html)或类似性质的东西以简化流程.
然而,此时我遇到的问题是,我无法使用 FormView 在视图中显示现有的投诉,因为表单构建器要求我设置要显示的集合的类型。如果每个咨询只有一种类型的投诉,那很好,但它们可以有多种类型,并且在表单构建器中设置类型会将我限制为那种类型。
在没有类型的情况下,我是否可以采取一些方法来阻止 FormView 转换为字符串,或者以某种方式在每个投诉的基础上动态检测和分配类型(使用 $complaint->getComplaintType(),也许)?
<?php
namespace Acme\ConsultBundle\Entity;
class Consult
{
/**
* @ORM\OneToMany(targetEntity="Acme\ConsultBundle\Entity\ComplaintBase", mappedBy="consult", cascade={"persist", "remove"})
*/
protected $complaints;
}
?>
<?php
namespace Acme\ConsultBundle\Entity;
/**
* Acme\ConsultBundle\Entity\ConsultBase
*
* @ORM\Entity
* @ORM\Table(name="ConsultComplaintBase")
* @ORM\HasLifecycleCallbacks
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="complaint_name", type="string")
* @ORM\DiscriminatorMap({
* "ComplaintDefault" = "Acme\ConsultBundle\Entity\ComplaintDefault",
* "ComplaintRosacea" = "Acme\ConsultBundle\Entity\ComplaintRosacea",
* "ComplaintBotox" = "Acme\ConsultBundle\Entity\ComplaintBotox",
* "ComplaintAcne" = "Acme\ConsultBundle\Entity\ComplaintAcne",
* "ComplaintUrticaria" = "Acme\ConsultBundle\Entity\ComplaintUrticaria",
* })
*/
abstract class ComplaintBase
{
/**
* @ORM\ManyToOne(targetEntity="Acme\ConsultBundle\Entity\Consult", inversedBy="complaints")
* @ORM\JoinColumn(name="consult_id", referencedColumnName="id")
*/
protected $consult;
/**
* @ORM\Column(type="string", length="255")
*/
protected $complaintType;
}
?>
<?php
namespace Acme\ConsultBundle\Form\Type;
class ConsultType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('complaints', 'collection', array(
// 'type' => new ComplaintUrticariaType(),
'error_bubbling' => true,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
));
}
}
?>