我一直在讨论这个问题。首先,我将解释我正在创建的应用程序的数据库结构。我们正在谈论一个ebay-ish网站(您可以在那里购买/销售二手产品)。
如您所见,每个类别都可以包含特定的元素(例如,如果您要销售汽车,则可以指定颜色,品牌......)。 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传递给元数据类型,以确定应该使用哪种字段类型,我只是不知道如何......
请启发我!
答案 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代码。它应该只能帮助您找到解决问题的正确方向。