gpt4 book ai didi

php - 使用 EventSubscriber 向 Symfony2 表单动态添加选择

转载 作者:行者123 更新时间:2023-12-03 19:55:43 25 4
gpt4 key购买 nike

我正在尝试动态设置表单选择的选项,因为这些选项来自服务调用。但是,当表单在 View 中呈现时,选项不存在。

我在 FormType 中执行以下操作

<?php

namespace My\Form\Customer;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ItemReturnRequestForm extends AbstractType
{

/**
* @var EventSubscriberInterface
*/
protected $reasonsSubscriber;

/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName()
{
return 'item_return_request';
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('reason', 'choice', [
'label' => 'order.returns.reason_for_return',
'required' => true,
'multiple' => false,
'expanded' => false,
'placeholder' => 'order.returns.reasons.empty',
'empty_data' => null,
]);

$builder->addEventSubscriber($this->reasonsSubscriber);
}

/**
* @param EventSubscriberInterface $reasonsSubscriber
*/
public function setReasonsSubscriber(EventSubscriberInterface $reasonsSubscriber)
{
$this->reasonsSubscriber = $reasonsSubscriber;
}
}
FormType有一个注入(inject) EventSubscriber 的服务定义实例,因为这也是一个具有自己依赖关系的服务定义。
EventSubscrbier好像
<?php

namespace My\Form\EventSubscriber;

use My\Customer\ItemReturnAware;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class ReturnReasonEventSubscriber implements EventSubscriberInterface
{
use ItemReturnAware;

public static function getSubscribedEvents()
{
return [
FormEvents::PRE_SET_DATA => 'getReturnReasons',
];
}

public function getReturnReasons(FormEvent $event)
{
$form = $event->getForm();

if ($form->has('reason')) {
$options = $form->get('reason')->getConfig()->getOptions();
$options['choices'] = $this->itemReturnService->getReasons();

$form->add('reason', 'choice', $options);
}
}
}

到目前为止,一切似乎都运行良好。使用 XDEBUG 我可以看到 EventSubscriber正在被触发。服务调用集 $option['choices']到预期的数组值并成功添加该字段。

但是,当表单被渲染时。就好像 EventSubscriber从来没有被叫过。

如果有区别,选项数组是一个无序的数字列表。

IE。
$options = [
10 => 'First choice',
15 => 'Second choice',
20 => 'Third choice',
];

有任何想法吗?

最佳答案

这是一个古老的问题,但今天我在搜索事件监听器以修改表单选择的顶部结果中发现了它。

在我的上下文中,我以编程方式创建了一个实体,并将用户重定向到 editAction 以完成字段填充。
我有一个只能在这种特殊情况下应用的选择,我不想让我的用户在它之外使用它。

这就是我使用 POST_SET_DATA 事件的原因,因为我已经有一个包含填充字段的实体。

此事件监听器在 formType 中设置,在

public function buildForm(FormBuilderInterface $builder, array $options)
{

这是 symfony 3.4 的工作解决方案:
$builder->addEventListener(FormEvents::POST_SET_DATA, function (FormEvent $event) {
// get the form from the event
$form = $event->getForm();

if ('myParticularMode' == $form->get('mode')->getData()) {
// get the field options
$options = $form->get('mode')->getConfig()->getOptions();
// add the mode to the choices array
$options['choices']['MY_PARTICULAR_MODE'] = 'myParticularMode_display_name';
$form->add('mode', ChoiceType::class, $options);
}

});

如果要替换选项,可以将其删除:
$options = $form->get('mode')->getConfig()->getOptions();

并为选择设置一个新数组。

关于php - 使用 EventSubscriber 向 Symfony2 表单动态添加选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532677/

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