我正在尝试创建一个具有AttributeSet多个属性的Product表单。 属性被分配给AttributeSet,当加载产品表单时,所有分配的属性将以表单形式呈现,每个属性都有一个类型(文本,选项,无线电等...)
我不确定这是否正确(我确信有更清洁/更好的方法),但我这样做了:
首先将EventSubscriber添加到主产品表单类型
$builder->addEventSubscriber($this->buildProductAttributeFormListener)
在EventSubscriber中我有preSetData事件:
public function preSetData(FormEvent $event)
{
$product = $event->getData();
$form = $event->getForm();
if (null === $product->getAttributeSetId()) {
// need to get attribute set id from request
$request = Request::createFromGlobals()->get('rs_product_type_step');
$attributeSetId = $request['attribute_set_id'];
if (!$attributeSetId) {
$request = Request::createFromGlobals()->get('rs_product');
$attributeSetId = $request['attribute_set_id'];
}
// get assigned attribute set
$attributeSet = $this->asRepository->find($attributeSetId);
} else {
$attributeSet = $product->getAttributeSetId();
}
// If product has attributes, lets add this configuration field.
if ($attributeSet->hasAttributes()) {
$form->add('attributes', 'rs_product_attribute_collection', array(
'options' => $attributeSet->getAttributes(),
'required' => false
));
}
}
在'rs_product_attribute_collection'类型中,我有这个buildForm:
public function buildForm(FormBuilderInterface $builder, array $options)
{
// this loop adds each attribute as a field with his type (choice, text, etc...)
foreach ($options['options'] as $i => $attribute) {
if (!$attribute instanceof AttributeInterface) {
throw new LogicException('Each object passed as attribute must implement "AttributeInterface"');
}
$fieldOptions = array(
'label' => $attribute->getName(),
);
if ($attribute->getType() == 'choice') {
// add custom options for choice type
//$fieldOptions = array_merge($fieldOptions, array('mapped' => false));
}
if (is_array($attribute->getOptions())) {
$fieldOptions = array_merge($fieldOptions, $attribute->getOptions());
}
$builder->add($attribute->getId(), $attribute->getType(), $fieldOptions);
}
}
现在我对这些问题几乎没有... 1)我不确定这是否是正确的方法,因为form-> bind没有正确绑定数据,所以我添加了PRE_SUBMIT事件以从请求中获取属性数据并手动将属性分配给Product 。 2)验证是为“选择”字段类型抛出“此值无效”错误消息。
我想听听如何让它发挥作用的想法。
谢谢, 罗恩。
答案 0 :(得分:0)
您还需要使data_class动态化,以便它将使用您添加的属性集字段。
另外,请查看此处以获取有关如何使用表单事件动态修改表单 http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html的更多详细信息。