nivas/easyadmin-tree-list-bundle

EasyAdmin 插件,用于在列表视图中显示嵌套树形结构

安装: 66

依赖: 0

建议者: 0

安全: 0

星星: 6

观察者: 4

分支: 0

开放问题: 0

语言:Twig

类型:symfony-bundle

v1.0.0 2023-03-27 11:08 UTC

This package is auto-updated.

Last update: 2024-09-27 17:56:02 UTC


README

EasyAdmin 3.x / Symfony 5.x 兼容的包,它覆盖了默认的 EasyAdmin 索引(列表)模板,并为使用 Gedmo Tree 扩展 的实体添加了嵌套树形视图。

EasyAdmin 3 tree list bundle demo

为了实现嵌套树形视图,您的实体必须在实体上实现嵌套 Gedmo 树,并具有以下属性

  • root_id 属性
  • parent_id 属性
  • lft(左)属性
  • rgt(右)属性
  • lvl(级别)属性

此类实体的示例: https://github.com/doctrine-extensions/DoctrineExtensions/blob/main/doc/tree.md

值得注意的提及和一些历史

在许多 Symfony 4 项目中,我们使用了 2lenet/EasyAdminPlusBundle 的树形视图功能。随着我们将项目迁移到 Symfony v5 / EasyAdmin v3 和 Symfony v6 / EasyAdmin v4,我们缺少了这种简单的树形视图功能,并决定让树形视图再次工作。

希望这个包能在 PHP 8、Symfony 6 和 EasyAdmin v4 上也能工作(尚未测试)。

历史

为了在模板中实现树功能,使用了来自 Ludo van den Boom 的非常旧的 jQuery treetable 插件 3.2.0,就像在 2lenet/EasyAdminPlusBundle 包中一样。将检查如何用最新的东西替换它。

安装

composer require nivas/easyadmin-tree-list-bundle

安装后,您的 bundles.php 文件将包含新的包

<?php

return [
...
    Nivas\Bundle\EasyAdminTreeListBundle\EasyAdminTreeListBundle::class => ['all' => true],
];

配置

如前所述,您的实体必须实现 Gedmo Tree。

您的 EasyAdmin CRUD 控制器应覆盖以下内容

  • configureResponseParameters - 用于启用 twig 的树配置
  • createIndexQueryBuilder - 用于更改排序顺序,以便在列表中创建树形列表
  • configureActions - 用于在树导航箭头前删除批量操作

例如 src/Controller/Admin/TermCrudController.php

<?php

namespace App\Controller\Admin;

use App\Entity\Term;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField;
use EasyCorp\Bundle\EasyAdminBundle\Field\IntegerField;
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField;
use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;

// za custom order query
use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto;
use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto;
use EasyCorp\Bundle\EasyAdminBundle\Orm\EntityRepository;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection;
use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection;
use Doctrine\ORM\QueryBuilder;

// za ugasit akcije
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;

class TermCrudController extends AbstractCrudController
{
    public function configureResponseParameters(KeyValueStore $responseParameters): KeyValueStore
    {
        $responseParameters->set('tree', true);
        return $responseParameters;
    }

    // not needed, it looks better this way
    public function configureActions(Actions $actions): Actions
    {
        return $actions
            ->disable(Action::BATCH_DELETE);
    }    

    public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder
    {
        $qb = $this->get(EntityRepository::class)->createQueryBuilder($searchDto, $entityDto, $fields, $filters);
        $qb->resetDQLPart('orderBy');
        $qb->addOrderBy($qb->getRootAlias().'.root', 'ASC');
        $qb->addOrderBy($qb->getRootAlias().'.lft', 'ASC');
        return $qb;
    }

  ...

}

EasyAdmin v2 到 v3 迁移

在 EasyAdmin v2 中,您可以通过输入例如 entity.id 来访问实体属性的值。现在不再是这样了。这被 EasyAdmin 的 EntityDTO 替换了。

例如

entity.fields.getByProperty('id').value

或者例如: entity.root.id 变成了: entity.fields.getByProperty('root').value.id

此外,在之前,访问在 yaml 中定义的自定义属性(例如下面的示例中的 tree: true)也很简单。

easy_admin:
  entities:
    Organization:
      class: App\Entity\Organization
      label: 'Organization'
      tree: true
      form:
        fields:
          - name
  ...

在模板中,您只需使用 entity.tree 来访问它。

现在这是通过覆盖扩展 AbstractCrudController 的 admin crud 类的 configureResponseParameters 来完成的

use EasyCorp\Bundle\EasyAdminBundle\Config\KeyValueStore;

class OrganizationCrudController extends AbstractCrudController
{
    public function configureResponseParameters(KeyValueStore $responseParameters): KeyValueStore
    {
        $responseParameters->set('tree', true);
        // $responseParameters->setIfNotSet('bar.foo', '...');

        return $responseParameters;
    }

并且在 Twig 模板中的使用

{% if tree is defined and tree %}
tree je true - {{ tree }}
{% endif %}