nivas / easyadmin-tree-list-bundle
EasyAdmin 插件,用于在列表视图中显示嵌套树形结构
Requires
- php: ^7.2|^8.0
- easycorp/easyadmin-bundle: ^3.0|^4.0
- symfony/config: *
- symfony/console: *
- symfony/dependency-injection: *
- symfony/http-kernel: *
This package is auto-updated.
Last update: 2024-09-27 17:56:02 UTC
README
EasyAdmin 3.x / Symfony 5.x 兼容的包,它覆盖了默认的 EasyAdmin 索引(列表)模板,并为使用 Gedmo Tree 扩展 的实体添加了嵌套树形视图。
为了实现嵌套树形视图,您的实体必须在实体上实现嵌套 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 上也能工作(尚未测试)。
历史
- WandiParis/EasyAdminPlusBundle 的原始包,一切从这里开始
- 2lenet/EasyAdminPlusBundle 从
WandiParis/EasyAdminPlusBundle
分叉,并添加了树形视图,使其适用于 EasyAdmin v1 - uknight/EasyAdminPlusBundle 从
2lenet/EasyAdminPlusBundle
分叉,并使其适用于 EasyAdmin v2
为了在模板中实现树功能,使用了来自 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 %}