gpt4 book ai didi

symfony - 是否可以在 Symfony2 表单中有不同选择的集合字段?

转载 作者:行者123 更新时间:2023-12-01 12:39:10 25 4
gpt4 key购买 nike

我的 Symfony 表单中有一个包含类型选择元素的集合字段。每个元素应该有不同的列表选项。我怎样才能在 Symfony2 中安排这个?我不能使用 choices 选项,因为每个元素都有相同的选择。我看过 choice_list option 接受一个可以生成选项列表的对象,但我看不出它如何为集合中的不同元素生成不同的选择。

知道如何处理吗?

最佳答案

我认为您需要表单事件:http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html .

更改收藏的默认方式。

主要形式很简单:

namespace Acme\Bundle\AcmeBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;

use Acme\Bundle\AcmeBundle\Form\DescriptorDumpFieldsType;

class TranscodingType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('descriptorDumpFields', 'collection', array('type' => new DescriptorDumpFieldsType()));
}

public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Acme\Bundle\AcmeBundle\Entity\Descriptor',
);
}

public function getName()
{
return 'descriptor';
}
}

只是一个带有子表单集合的简单表单。

第二个使用处理表单创建的表单订阅者。 (使用表单事件)

所以第一个表单是正常创建的,并添加了许多动态创建的 DescriptorDumpFieldsType。

namespace Acme\Bundle\AcmeBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Symfony\Component\Form\FormTypeInterface;

use Acme\Bundle\AcmeBundle\Form\EventListener\TranscodingSubscriber;

class DescriptorDumpFieldsType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$subscriber = new TranscodingSubscriber($builder->getFormFactory());
$builder->addEventSubscriber($subscriber);
}

public function getDefaultOptions(array $options)
{
return array(
'data_class' => 'Acme\Bundle\AcmeBundle\Entity\DescriptorDumpField',
);
}

public function getName()
{
return 'desc_dump_field';
}
}

表单订阅者:

namespace Acme\Bundle\AcmeBundle\Form\EventListener;

use Symfony\Component\Form\Event\DataEvent;
use Symfony\Component\Form\FormFactoryInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvents;

use Acme\Bundle\AcmeBundle\Entity\DumpField;

use Acme\Bundle\AcmeBundle\Form\Transcoding\DataTransformer\JsonToHumanDateTransformer;

class TranscodingSubscriber implements EventSubscriberInterface
{
private $factory;

public function __construct(FormFactoryInterface $factory)
{
$this->factory = $factory;
}

public static function getSubscribedEvents()
{
return array(FormEvents::SET_DATA => 'setData');
}

public function setData(DataEvent $event)
{
$data = $event->getData();
$form = $event->getForm();

if (!is_null($data)) {
$this->buildForm($data, $form);
}
}

protected function buildForm($data, $form)
{
switch ($data->getDumpField()->getType()) {
case DumpField::TYPE_ENUM:
$type = 'enum'.ucfirst($data->getDumpField()->getKey());
$class = 'dump_field_'.strtolower($data->getDumpField()->getKey());
$form->add($this->factory->createNamed('collection', 'transcodings', null, array('required' => false, 'type' => $type, 'label' => $data->getDumpField()->getKey(), 'attr' => array('class' => $class))));
break;
case DumpField::TYPE_DATE:
$transformer = new JsonToHumanDateTransformer();
$class = 'dump_field_'.strtolower($data->getDumpField()->getKey());
$builder = $this->factory->createNamedBuilder('human_date', 'params', null, array('label' => $data->getDumpField()->getKey(), 'attr' => array('class' => $class)));
$builder->prependNormTransformer($transformer);
$form->add($builder->getForm());
break;
}
}
}

所以你可以按照你想要的方式自定义,buildForm中集合的每个子表单。

关于symfony - 是否可以在 Symfony2 表单中有不同选择的集合字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8756531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com