gpt4 book ai didi

php - Symfony 表单 |动态集合类型值

转载 作者:搜寻专家 更新时间:2023-10-31 21:21:07 25 4
gpt4 key购买 nike

我正在 symfony 3.4 上构建一个小工具,我遇到了两个无法找到解决方案的表单问题。

对于上下文,给我带来一些困难的形式是基于一个学说实体:事件。这个事件引用了另一个实体:一个 Doctrine(与 ORM 无关)。一个学说引用了多个配件。对于具有给定学说的给定事件,我想显示一个从学说配件构建的集合类型,该配件公开一个数字,表示该事件所需的配件数量。

这导致我的表单中有 3 个实体:事件本身、原则和在我这边构建的 fittingRequirements 集合类型。

Here is how it looks

每次学说发生变化时,右侧面板的内容都会随之变化。

这是事件类型:

<?php

namespace AppBundle\Form;

use AppBundle\Entity\Doctrine;
use AppBundle\Entity\Event;
use AppBundle\Form\DataTransformer\FittingRequirementTransformer;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\DateTimeType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class EventType extends AbstractType
{
protected $requirementTransformer;

public function __construct(FittingRequirementTransformer $transformer)
{
$this->requirementTransformer = $transformer;
}

/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{

$builder
->setMethod('POST')
->add('name')
->add(
'date',
DateTimeType::class,
[
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
]
)
->add('startLocation')
->add(
'eventType',
ChoiceType::class,
[
'choices' => [
'PvE' => 'PvE',
'PvP' => 'PvP',
'Other' => 'Other',
],
]
)
->add('target')
->add('description')
->add(
'doctrine',
EntityType::class,
[
'class' => 'AppBundle\Entity\Doctrine',
'choice_label' => 'name',
'query_builder' => function (EntityRepository $repository) {
return $repository->createQueryBuilder('d')->orderBy('d.name', 'ASC');
},
'required' => false,
]
);


$formModifier = function (FormInterface $form, Doctrine $doctrine = null, Event $event) {

$eventRequirements = [];

if ($doctrine) {

$doctrineFittings = $doctrine->getFittings();
$doctrineRequirements = $event->getDoctrineFittingRequirements($doctrine);

$eventRequirements = $this->requirementTransformer->dataToForm(
$doctrineFittings,
$doctrineRequirements,
$event
);

}

$form->add(
'eventRequirements',
CollectionType::class,
[
'entry_type' => FittingRequirementType::class,
'label' => false,
'entry_options' => ['label' => false],
'data' => $eventRequirements,
'mapped' => false,
]
);

};

$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {

$formupEvent = $event->getData();
$formModifier($event->getForm(), $formupEvent->getDoctrine(), $formupEvent);
}
);

$builder->get('doctrine')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {

$eventForm = $event->getForm()->getParent();
$doctrine = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $doctrine, $eventForm->getData());
}
);
}

/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(
[
'data_class' => 'AppBundle\Entity\Event',
]
);
}

/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'event';
}
}

我正在构建 eventFittingRequirements 列表并将其添加到 PRE_SET_DATA 和 POST_SUBMIT如您所见,我使用 FittingRequirementType 的 CollectionType,您可以在下面看到:

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class FittingRequirementType extends AbstractType
{
/**
* {@inheritdoc}
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('number', NumberType::class);
}

/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\FittingRequirement'
));
}

/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'appbundle_fittingrequirement';
}
}

这仅用于显示所需配件的数量。

当我显示表单时,所有这一切都很好,但是当我使用 javascript 提交表单以刷新需求部分时,该字段确实被替换,但返回的表单在输入中没有值。

我的 $formModifier 中的 $eventRequirements 变量包含 a proper set of data , 与数字值。但是,当我使用 symfony 分析器检查 XHR 时,the form has no values ,即使我再次选择原始学说。我不明白发生了什么以及如何解决这个问题。

感谢阅读

最佳答案

我刚刚发现发生了什么并解决了我的问题。

我的表单很好,但是 handleRequest 方法清除了我使用自定义 fittingRequirement 列表设置的未映射字段。

我不得不像下面那样手动提交带有 clearmissing 参数的表单到 false :

$form->submit($request->request->get($form->getName()), false);

关于php - Symfony 表单 |动态集合类型值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48177739/

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