在管理列表中的可排序行为
这是一个关于如何在您的 Sonata 管理列表中实现可排序功能的完整工作示例
背景
可排序行为已可用于一对多关系 (https://docs.sonata-project.org/projects/SonataDoctrineORMAdminBundle/en/4.x/reference/form_field_definition/#advanced-usage-one-to-many)。但是,没有打包的解决方案来提供一些向上和向下箭头来对您的记录进行排序,如下面的屏幕所示

前提条件
配置
- 您已经启动并运行了 SonataAdmin 和 DoctrineORM
- 您已经有一个实体类,您想为其实现可排序功能。为了示例的目的,我们将其称为
Client
。 - 您已经设置了一个 Admin,在本例中我们将其称为
ClientAdmin
捆绑包
- 在您的项目中安装
gedmo/doctrine-extensions
捆绑包(查看stof/doctrine-extensions-bundle
以便在您的项目中更轻松地集成),并在您的配置中启用可排序功能 - 安装
runroom-packages/sortable-behavior-bundle
至少版本 ^0.16,并在config/bundles.php
中启用它
方法
首先,我们将在我们的 Client
实体中添加一个 position 字段
1 2 3
#[Gedmo\SortablePosition]
#[ORM\Column(type: Types::INTEGER)]
private ?int $position = null;
然后我们需要注入 Sortable 监听器。如果您只启用了 Gedmo 捆绑包,您只需将监听器添加到您的 services.yaml
文件并跳过此步骤。
1 2 3 4 5 6 7 8 9
# config/services.yaml
services:
gedmo.listener.sortable:
class: Gedmo\Sortable\SortableListener
calls:
- [setAnnotationReader, ['@annotation_reader']]
tags:
- { name: doctrine.event_subscriber, connection: default }
如果您有 stof/doctrine-extensions-bundle
,您只需要在您的配置中启用可排序功能,例如
1 2 3 4 5 6
# config/packages/stof_doctrine_extensions.yaml
stof_doctrine_extensions:
orm:
default:
sortable: true
在我们的 ClientAdmin
中,我们将在 configureListFields
方法中添加一个自定义操作,并使用 RunroomSortableBehaviorBundle
中提供的默认 twig 模板
1 2 3 4 5 6 7 8
$list
->add(ListMapper::NAME_ACTIONS, ListMapper::TYPE_ACTIONS, [
'actions' => [
'move' => [
'template' => '@RunroomSortableBehavior/sort.html.twig'
],
]
]);
为了为这些操作添加新路由并应用正确的排序,请使用 Runroom\SortableBehaviorBundle\Admin\SortableAdminTrait
1 2 3 4 5 6 7 8 9 10 11
// src/Admin/ClientAdmin.php
namespace App\Admin;
use Runroom\SortableBehaviorBundle\Admin\SortableAdminTrait;
use Sonata\AdminBundle\Admin\AbstractAdmin;
final class ClientAdmin extends AbstractAdmin
{
use SortableAdminTrait;
}
在 services.yaml
中定义 Admin
1 2 3 4 5 6 7
# config/services.yaml
services:
app.admin.client:
class: App\Admin\ClientAdmin
tags:
- { name: sonata.admin, model_class: App\Entity\Client, manager_type: orm, label: 'Clients' }
现在我们需要定义可排序操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
// src/Admin/ClientAdmin.php
namespace App\Admin;
use Runroom\SortableBehaviorBundle\Admin\SortableAdminTrait;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
final class ClientAdmin extends AbstractAdmin
{
use SortableAdminTrait;
protected function configureListFields(ListMapper $list): void
{
$list
->addIdentifier('name')
->add('enabled')
->add(ListMapper::NAME_ACTIONS, ListMapper::TYPE_ACTIONS, [
'actions' => [
'move' => [
'template' => '@RunroomSortableBehavior/sort.html.twig'
],
],
])
;
}
}
这项工作,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可获得许可。