首页 > 解决方案 > Symfony Form - 通过更改下拉列表中的排序选项对数据进行排序

问题描述

我很抱歉标题,但我不知道如何定义它好。我希望我的应用程序根据用户在表单下拉列表中选择的排序选项对数据(在 Doctrine 中)进行排序。

我上面提到的数据存储在我称之为它的 Doctrine Entity 中,Flashcards并且该Flashcards实体包含属性,它们必须按用户在下拉列表中选择的选项进行排序。Flashcards实体如下所示(为简单起见,我只给出了几个属性):

/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="App\Entity\Words", inversedBy="flashcards")
* @ORM\JoinColumn(nullable=false)
*/
private $words;

/**
* @ORM\Column(type="datetimetz")
*/
private $creation_date;

现在控制器的表单代码很常见,就像 Symfony Doc 说的:

// code for form inside FlashcardController
$flashcard = new Flashcards();
$form = $this->createForm(FlashcardType::class, $flashcard);

FlashcardController render()方法中,我在对象上调用createView()方法。$form

表单代码放置在FlashcardType类中,并包含上述下拉列表及其选项的代码。它看起来像这样(为简单起见,我只给出了方法):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('sortBy', ChoiceType::class, [
            'label' => 'Sort by',
            'choices' => [
                'Date increase' => 1,
                'Date decrease' => 2,
                'Word alphabetically' => 3,
                'Word not alphabetically' => 4
            ]
        ]);
}

public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults([
        'data_class' => Flashcards::class
    ]);
}

因此,正如您所看到的,下拉选项包括按以下方式排序:日期增加、日期减少、按字母顺序排列的单词、不按字母顺序排列的单词。用户在视图中选择其中之一。因此,用户操作数据不会改变由属性表示的数据的值。更改下拉列表中的排序选项应将 Doctrine 查询更改为按用户更改的值排序。我不知道如何在 Symfony 中实现这一点。你能给我一些制作方法吗?

预先感谢您的回答!

标签: symfonysortingdoctrinesymfony-forms

解决方案


如果我理解正确,您有几个选择:
首先:连接 javascript / jquery 以选择输入并在用户更改订单时提交表单(它应该重新加载应用过滤器的表单,您可以设置“上一个”页面中使用的任何数据用户使用 RequestStack 根据方法从请求/查询中获取表单字段)
第二:获取您显示的所有节点记录并尝试在每次用户更改值时根据选择值操纵订单
告诉我这是否是您的意思否则纠正我,我会尽力提供答案


推荐阅读