Php Symfony2-嵌入式形式逻辑

Php Symfony2-嵌入式形式逻辑,php,forms,symfony,Php,Forms,Symfony,我一直在为这个问题伤脑筋。首先,我将解释我正在创建的应用程序的数据库结构。我们谈论的是一个易趣网站(在那里你可以买卖二手产品) 如您所见,每个类别都可以有特定的元字段(例如,如果您正在销售一辆汽车,您可以指定颜色、品牌等)。元字段由管理员在后台创建。元字段类型为“数字、文本、复选框、单选按钮” 在元数据表中,可以找到每个产品的这些元字段的实际数据。(例如,汽车X的颜色值为“蓝色”) 我遇到的问题位于“添加产品”页面,因为我想创建一个包含所有产品列以及元数据列的表单。我为我的产品创建了以下表单类

我一直在为这个问题伤脑筋。首先,我将解释我正在创建的应用程序的数据库结构。我们谈论的是一个易趣网站(在那里你可以买卖二手产品)

如您所见,每个类别都可以有特定的元字段(例如,如果您正在销售一辆汽车,您可以指定颜色、品牌等)。元字段由管理员在后台创建。元字段类型为“数字、文本、复选框、单选按钮”

在元数据表中,可以找到每个产品的这些元字段的实际数据。(例如,汽车X的颜色值为“蓝色”)

我遇到的问题位于“添加产品”页面,因为我想创建一个包含所有产品列以及元数据列的表单。我为我的产品创建了以下表单类型:

<?php

namespace Scouter\UserBundle\Form\Type;

use Doctrine\ORM\EntityManager;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class ProductType extends AbstractType {

    protected $em;

    function __construct(EntityManager $em)
    {
        $this->em = $em;
    }


    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('Title', 'text', array(
                'required'       => true,
            ))
            ->add('description', 'textarea')
            ->add('condition', 'choice', [
                'choices'   => array(
                    'new'   => 'Nieuw',
                    'used' => 'Gebruikt',
                ),
                'multiple'  => false,
                'expanded' => false,
            ])
            ->add('price', 'money')
            ->add('city', 'text')
            ->add('media', 'hidden')
            ->add('add', 'submit')
        ;

        $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) {
                $form = $event->getForm();
                $form->add('category', 'entity', array(
                        'required' => true,
                        'class' => 'ScouterBundle:Category',
                        'property' => 'name',
                        'empty_value' => 'Kies een categorie',
                        'multiple' => false,
                        'expanded' => false,
                    ));

                $data = $event->getData();

                $category = $data->getCategory();
                $metafields = null === $category ? array() : $category->getMetafields();

                $form->add('metadata', 'collection', array('type' => new MetadataType()));
            }
        );
    }


    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Scouter\ScouterBundle\Entity\Product'
        ));
    }


    public function getName()
    {
        return "productType";
    }

}

您需要一个用于表“Metadata”的类元数据。元数据必须具有方法“getMetadataTypes($productId,$metaField)”或“getMetadataTypeArray($productId,$metaFieldArray)”。getMetadataTypeArray方法读取数据库表“metadata”,并返回所需的字段类型、名称和选项的数组,以及为元字段id“metafield_id”和产品id“product_id”存储的元值的结果数组


这不是一个真正可以使用的PHP代码。它只会帮助您找到解决问题的正确方向。

可能需要使用动态表单:是否可以添加同一属性的多个“集合”(在本例中为元数据)?您可能是对的。我以添加整个$metadataTypeArray的方式对其进行了修改。此数组必须使用Symfony表单所需的正确语法构成。
$metafieldArray = null === $category ? array() : $category->getMetafields('');
$metadata = new Metadata();
$productId = ...; // read in the product id
$metadataTypeArray = $metadata->getMetadataTypeArray($productId, $metafieldArray);
$form->add('metadata', 'collection', $metadataTypeArray);