php – 表单Symfony2中的依赖项
我正在研究Symfony2中的Web应用程序.我找到了一些需要Symfony更高级的建议/解释的地方.
我的数据库的一部分设置如下: 我有属于卡属性集的卡,由卡值组成. 我有卡属性集有很多属性,卡属性可以属于许多卡属性集(显然是多对多的关系). 然后,根据card属性,该属性具有属性值,例如,text具有varchar类型的value_text,boolean具有boolean类型的value_boolean. 您可以想象在制作表单以创建新卡时,表单需要根据其所属的卡属性集生成输入字段,并且取决于属于该属性集的属性吗? 所以这是我的问题;有没有办法根据用户选择的实体动态生成表单中的输入字段.我读过有关活动但我不确定它们是否满足我的需求. 这是我的实体的代码(我删除了Getters和Setters以获得更简单的视图): 卡: /** * card * * @ORMTable() * @ORMEntity(repositoryClass="clientsBundleEntitycardRepository") * @UniqueEntity( * fields={"cardLabel"},* message="A card with this label already exists" * ) */ class card { /** * @var integer * * @ORMColumn(name="id",type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORMColumn(name="card_label",type="string",length=999) */ private $cardLabel; /** * @ORMManyToOne(targetEntity="project",inversedBy="project_cards") * @ORMJoinColumn(name="project_id",referencedColumnName="id",onDelete = "SET NULL") */ protected $card_project; /** * @ORMManyToOne(targetEntity="cardAttributeSet",inversedBy="cas_cards") * @ORMJoinColumn(name="cas_id",referencedColumnName="id") **/ protected $cardAttrSet; /** * @ORMOneToMany(targetEntity="cardAttrValue",mappedBy="card",cascade={"persist"},orphanRemoval=true) **/ protected $card_values; /** * @ORMManyToMany(targetEntity="user",mappedBy="cards") */ private $users; public function __construct() { $this->card_values = new ArrayCollection(); $this->users = new ArrayCollection(); } } 卡属性: /** * cardAttribute * * @ORMTable() * @ORMEntity(repositoryClass="clientsBundleEntitycardAttributeRepository") * @UniqueEntity( * fields={"name"},* message="An attribute with this name already exists" * ) */ class cardAttribute { /** * @var integer * * @ORMColumn(name="id",type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORMColumn(name="name",length=255) */ private $name; /** * @var string * * @ORMColumn(name="type",length=255) */ private $type; } 卡属性集 /** * cardAttributeSet * * @ORMTable() * @ORMEntity(repositoryClass="clientsBundleEntitycardAttributeSetRepository") * @UniqueEntity( * fields={"casLabel"},* message="An attribute set with this label already exists" * ) */ class cardAttributeSet { /** * @var integer * * @ORMColumn(name="id",type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ public $id; /** * @var string * * @ORMColumn(name="cas_label",length=255) */ private $casLabel; /** * @ORMOneToMany(targetEntity="card",mappedBy="cardAttrSet") */ private $cas_cards; /** * @ORMManyToMany(targetEntity="cardAttribute") * @ORMJoinTable(name="cas_attribute",* joinColumns={@ORMJoinColumn(name="cas_id",referencedColumnName="id")},* inverseJoinColumns={@ORMJoinColumn(name="attribute_id",referencedColumnName="id")} * ) */ private $attributes; public function __construct() { $this->cas_cards = new ArrayCollection(); $this->attributes = new ArrayCollection(); } } 卡属性值 /** * cardAttrValue * * @ORMTable() * @ORMEntity(repositoryClass="clientsBundleEntitycardAttrValueRepository") * @UniqueEntity( * fields={"valueText"} * ) */ class cardAttrValue { /** * @var integer * * @ORMColumn(name="id",type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ private $id; /** * @var string * * @ORMColumn(name="value_text",length=255,nullable=true) */ private $valueText; /** * @var string * * @ORMColumn(name="value_varchar",nullable=true) */ private $valueVarchar; /** * @var integer * * @ORMColumn(name="value_int",type="integer",nullable=true,nullable=true) */ private $valueInt; /** * @var boolean * * @ORMColumn(name="value_boolean",type="boolean",nullable=true) */ private $valueBoolean; /** * @ORMManyToOne(targetEntity="card",inversedBy="card_values") * @ORMJoinColumn(name="card_id",referencedColumnName="id") **/ private $card; /** * @ORMManyToOne(targetEntity="cardAttribute") * @ORMJoinColumn(name="cardAttributes_id",referencedColumnName="id") **/ private $cardAttribute; }
为CardAttributeValue实体创建表单类型CardAttributeValueType,在此表单内添加字段,具体取决于传递的属性类型:
class CardAttributeValueType extends AbstractType public function buildForm(FormBuilderInterface $builder,array $options) { $builder->addEventListener(FormEvents::PRE_SET_DATA,function(FormEvent $event) { $value = $event->getData(); $form = $event->getForm(); if (!$value) { return; } switch ($value->getCardAttribute()->getType()) { case 'text': $form->add('valueVarchar','text'); break; // Same for other attribute types } } } 然后,在CardType表单类型中为card_values添加集合字段类型,并将CardAttributeValueType作为集合项类型传递. 在Card实体中编辑getCardValues()方法,因此它将返回CardAttributeSet中的每个属性,而不仅仅是存在值实体的属性. UPDATE public function getCardValues() { $collection = new ArrayCollection(); if (!$this->cardAttrSet) { return $collection; } // Add existing values foreach ($this->card_values as $value) { $collection[$value->getCardAttribute()->getId()] = $value; } // Get all attributes from the set and create values for missing attributes foreach ($this->cardAttrSet->getAttributes() as $attr) { if (!isset($collection[$attr->getId()])) { $value = new cardAttrValue(); $value->setCardAttribute($attr); $collection[$attr->getId()] = $value; } } return $collection; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |