簡體   English   中英

Symfony2-嵌入式表格邏輯

[英]Symfony2 - Embedded form logic

在這個問題上,我一直不知所措。 首先,我將解釋我正在創建的應用程序的數據庫結構。 我們正在談論的是一個ebay-ish網站(您可以在其中購買/出售二手產品)。

數據庫模型

如您所見,每個類別都可以具有特定的元字段(例如,如果您要銷售汽車,則可以指定顏色,品牌等)。 元字段是由管理員在后台創建的。 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,需要使用在Metafield中指定的標簽將textfield / checkboxes / radiobuttons添加到表單。 我應該能夠將Metafield傳遞給Metadata Type,以便確定應使用哪種字段類型,我只是不知道如何...

請賜教!

您需要為“元數據”表提供一個元數據類。 元數據必須具有方法“ getMetadataTypes($ productId,$ metaField)”或“ getMetadataTypeArray($ productId,$ metaFieldArray)”。 方法getMetadataTypeArray讀取數據庫表“元數據”,並返回所需的字段類型,名稱和選項的數組,以及為元字段ID“ metafield_id”和產品ID“ product_id”存儲的元值的結果數組。

$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代碼。 它只會幫助您找到正確的方向來解決它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM