gpt4 book ai didi

forms - 如何在 Symfony EntityType 表单小部件上添加其他选项?

转载 作者:行者123 更新时间:2023-12-05 06:41:39 29 4
gpt4 key购买 nike

我在 Symfony 中有一个过滤器表单,它可以过滤一个实体。为此,我有一个带有 EntityFilterType (Lexik\Bundle\FormFilterBundle\Filter\Form\Type\EntityFilterType) 的字段,它只是扩展了 Symfony 的内置 EntityType

现在我想为这个 EntityType 添加一个“all”和一个“none”选项。如果它是一个 ChoiceType,我会简单地更改 choices 数组,但是 EntityType 只接受有效的实体 ID 作为提交时的值,也只有数组中的实体提供给“选择”选项。

我的问题是:如何向 EntityType 表单域添加额外的选项?除了将 Entity-stuff 重新实现到 ChoiceType 字段中的丑陋方法之外?对此有什么想法吗?我是否缺少记录的方式?

您好,防尘垫

最佳答案

几年过去了,场景再次闪耀:

我有一个 ManyToMany 相关实体,我想使用 LexikFormFilterBundle 对其进行过滤。但我也想允许对没有此类相关实体的实体进行显式过滤。在我的例子中,我想允许过滤分配给某些特定用户的 ToDos,但也允许过滤根本没有分配的 ToDos。所以问题开始了。

实际上,我现在的解决方案是切换到 ChoiceType::class,它看起来像这样:

// We are in a buildForm function of a Filter-Form extending
// Symfony\Component\Form\AbstractType and using The LexikFormFilterBundle

// prepare the choices with a "none"-choice on top
// feel free to add also a "all"-choice, if that is needed
$myChoices = [
'None of those' => 'none',
];
foreach ($this->myWhateverRepository->getMyChoices() as $myChoice) {
// where $myChoice is some related Entity
$myChoices[$myChoice->getIdentifyingName()] = $myChoice->getId();
}
/*
now we have an array like this:
[
'None of those' => 'none',
'One related Entity' => 2,
'Another related Entity' => 4,
]
*/

$builder
->add('relatedWhatevers', ChoiceFilterType::class, [
'choices' => $myChoices,
'multiple' => true,
'label' => 'Filter for related whatevers',
'required' => false,
'apply_filter' => function (QueryInterface $filterQuery, $field, $values) {
if (count($values['value']) === 0) {
// nothing to filter here
return null;
}

$orNone = in_array('none', $values['value']);
$myWhateverIds = array_filter($values['value'], function($v) { return 'none' !== $v; });

// join the related field and don't forget to do that as an
// innerJoin, otherwise the isNull() doesn't find anything
$query = $filterQuery->getQueryBuilder();
$query->leftJoin($field, 'myWhatever');

if ($orNone) {
if (count($userIds) > 0) {
$expression = $filterQuery->getExpr()->orX(
$filterQuery->getExpr()->isNull('myWhatever'),
$filterQuery->getExpr()->in('myWhatever.id', $myWhateverIds)
);
}
else {
$expression = $filterQuery->getExpr()->isNull('myWhatever');
}
}
else {
$expression = $filterQuery->getExpr()->in('myWhatever.id', $userIds);
}
return $filterQuery->createCondition($expression, []);
},
])
;

这行得通:我可以找到分配给某些用户和/或没有分配给任何人的待办事项。当我不填写该字段时,过滤器不会执行任何操作。

关于forms - 如何在 Symfony EntityType 表单小部件上添加其他选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39894794/

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