如何使用 sonata_type_model 启用排序?

How to enable sorting with sonata_type_model?

我正在开发一个使用 Sonata 的 Symfony 3.3 项目。我创建了两个实体:Question 和 QuestionGallery。我正在使用多对多关系和 sonata_type_model 来允许用户在每个问题库中嵌套一组问题。我的 formMapper->add() 调用如下所示:

    $formMapper
        ->add('name')
        ->add('visible')
        ->add(
            'questions',
            'sonata_type_model',
            ['expanded' => false, 'by_reference' => true, 'multiple' => true, 'required' => false]
        )
    ;

到目前为止一切顺利。现在我想允许用户以他们选择的任意顺序重新排序 Question 对象。这就是我 运行 遇到问题的地方:即使我从列表中间删除一个项目并将其重新附加到最后,当我保存 QuestionGallery 时它也会恢复到中间。我相信问题是按 ID 排序的,换句话说。

在短期内,我简单地在问题实体中添加了一个 "rank" 字段,效果很好。 但我很好奇:是否有一种内置方法可以允许任意重新排序,而无需引入用户必须手动填写的额外字段?(如果您知道允许用户手动填写的方法,则加分项拖放实体。)

您可以使用带有注释的学说映射:

/**
..ect..
*@ORM\OrderBy({"ranking" = "ASC"})
*/
protected $questions;

并在您的管理员中:

$formMapper
    ->add(
        'questions',
        'sonata_type_collection',
        [
            'expanded' => false,
            'by_reference' => true,
            'multiple' => true,
            'required' => false
        ],
        [
            'edit' => 'inline',
            'inline' => 'table',
            'sortable' => 'ranking',
            'order' => 'ASC'
        ]
    )
;