Symfony2.3来自两个权限的动态表单字段

时间:2013-08-13 21:35:54

标签: php symfony

我正在尝试创建一个具有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)验证是为“选择”字段类型抛出“此值无效”错误消息。

我想听听如何让它发挥作用的想法。

谢谢, 罗恩。

1 个答案:

答案 0 :(得分:0)

您还需要使data_class动态化,以便它将使用您添加的属性集字段。

另外,请查看此处以获取有关如何使用表单事件动态修改表单 http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html的更多详细信息。