跳到内容

在管理列表中的可排序行为

编辑此页

这是一个关于如何在您的 Sonata 管理列表中实现可排序功能的完整工作示例

背景

可排序行为已可用于一对多关系 (https://docs.sonata-project.org/projects/SonataDoctrineORMAdminBundle/en/4.x/reference/form_field_definition/#advanced-usage-one-to-many)。但是,没有打包的解决方案来提供一些向上和向下箭头来对您的记录进行排序,如下面的屏幕所示

Sortable listing

前提条件

配置

  • 您已经启动并运行了 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 许可获得许可。
目录
    版本