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