Symfony2 - 嵌入式表单逻辑

时间:2014-08-15 23:22:53

标签: php forms symfony

我一直在讨论这个问题。首先,我将解释我正在创建的应用程序的数据库结构。我们正在谈论一个ebay-ish网站(您可以在那里购买/销售二手产品)。

DB model

如您所见,每个类别都可以包含特定的元素(例如,如果您要销售汽车,则可以指定颜色,品牌......)。 Metafields由管理员在后台创建。 metafield_types是'数字,文本,复选框,单选按钮'。

在元数据表中,您可以找到每个产品的这些元数据的实际数据。 (例如,汽车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";
    }

}

我被困在我的表单事件的最后一行..这是需要发生的事情:Foreach Metafield,一个textfield / checkboxes / radiobuttons需要添加到表单中,并带有在Metafield。我应该能够将Metafield传递给元数据类型,以确定应该使用哪种字段类型,我只是不知道如何......

请启发我!

1 个答案:

答案 0 :(得分:0)

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

$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);

这不是一个真正有用的PHP代码。它应该只能帮助您找到解决问题的正确方向。