[英]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.