creativestyle/admin-list-bundle

快速且简单的制作管理列表的包

v4.0.1 2019-01-29 13:19 UTC

This package is auto-updated.

Last update: 2024-08-29 04:20:15 UTC


README

设置

您可能需要添加到您的 config/packages/framework.yaml

    templating:
        engines: twig

模板

这些模板与 CSS 框架无关,您应该通过 symfony 机制或更改其配置来覆盖它们,扩展标记并美化它们。

快速入门

在您的控制器中

获取 FilterManager 实例。 这是一个非共享服务,所以每次都获取新的实例。

/** @var FilterManager $filters */
$filters = $this->get('creativestyle_admin_list.filter_manager');

与表单构建器类似,它提供了一个流畅的接口,因此您可以注册新的过滤器

$filters
    ->registerFilter(new SomeFilter('filterid', ['some_config' => 'value']);
    ->registerFilter(new SomeFilter('otherfilterid', ['some_config' => 'value'])
;

您还可以注册分页器

$filters
    ->setPaginator(new SimplePaginator([
        'order_by' => 'location.address.name',
    ]))
;

配置完成后,创建一个 QueryBuilder 并应用过滤器,然后获取结果

$qb = $repository->createQueryBuilder('product');
$filters->applyFilters($qb);

$results = $this->getFilterManager()->getPaginatedResults($queryBuilder);

您需要在模板中使用结果和 FilterManager

return $this->render('template.html.twig', [
    'results' => $results,
    'filters' => $filters,
]);

在您的模板中

您可以通过 ID 渲染每个过滤器

{{ filters.renderFilter('filterid')|raw }}

您还可以这样渲染分页控件

{{ results.renderPaginationControls()|raw }}

要渲染结果本身,请使用类似以下的内容

<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>{{ filters.renderSortControls('entityalias.fieldname', 'Column Title')|raw }}</th>
            <th>{{ filters.renderSortControls('entityalias.createdAt', 'Created At')|raw }}</th>
        </tr>
    </thead>
    
    {# The result object is iterable #}
    <tbody>
        {% for product in products %}
            <tr>
                <td>{{ product.id }}</td>
                <td>{{ product.fieldname }}</td>
                <td>{{ product.createdAt|date }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>

就这样!您已经拥有了一个功能齐全的列表 UI,具有分页、排序和搜索。

过滤器参考

除了内置的过滤器,您还可以通过扩展基本过滤器或像 AbstractFilter 这样的基本过滤器来添加自己的过滤器。请查看代码 - 它非常简单。

AbstractFilter

其他过滤器的基类,不直接使用。

选项

callback

可调用。如果提供,则用于在 QueryBuilder 上应用过滤器。如果没有提供,则使用内部过滤机制。

default_value

过滤器的默认值。

label

标签,默认通过使过滤器 ID 人性化来创建。

parameters

将直接传递到模板的参数。

joins

如果应用此过滤器,则要添加到查询中的连接。

接受一个连接数组,其中每个连接都是以下形式的数组

['rootEntityAlias.fieldname', 'alias']

template

用于渲染的模板。

DateFilter

扩展 AbstractFilter

呈现日期选择器字段。

选项

empty_label

未选择时使用的标签。

empty_value

未选择时的值。

strategy

默认使用相等策略。

以下之一

  • DateFilter::STRATEGY_EQUAL
  • DateFilter::STRATEGY_GREATHER_THAN
  • DateFilter::STRATEGY_LESS_THAN
  • DateFilter::STRATEGY_GREATHER_THAN_OR_EQUAL
  • DateFilter::STRATEGY_LESS_THAN_OR_EQUAL

field

过滤器将应用到的实体字段。

StringFilter

扩展 AbstractFilter

呈现文本输入。允许搜索多个字段,使用 LIKE 等。

选项

concat

如果为 true,则将字段连接后再进行搜索。

wildcard

如果为 true,则允许通配符 *(在查询中将用 % 替换)。

fields

一个字符串或要搜索的字段列表。

exact

如果为 true,则需要精确匹配(不使用 LIKE)。如果启用了 concatwildcard,则默认设置为 false。否则默认为 true

选择过滤器

扩展 AbstractFilter

呈现下拉列表或选项卡。

选项

empty_label

未选择时使用的标签。

empty_value

未选择时的值。

choices

[value => label] 形式呈现的选择数组。

callback

对于此过滤器,回调是必需的。

使用如下

new ChoiceFilter('id', [
    'choices' => [
        'black' => 'Dark',
        'white' => 'Light',
    ],
    'callback' => function (QueryBuilder $qb, $value) {
        if ($value) {
            $qb->andWhere('product.color = :choice')
               ->setParameter('choice', $value);
        }
    }
]);

disabled

禁用过滤器?

tabbed

如果为 true,则使用选项卡而不是下拉列表。

分页器参考

AbstractPaginator

基础分页器,不建议直接使用。

待定

SimplePaginator

向用户展示滑动分页器,当项目较多时可能会较慢,因为它需要执行 COUNT 查询。

选项待定

OffsetPaginator

适用于非常大的列表的分页器。它只允许进行 下一页上一页 导航,而不向用户提供列表中元素/页面的数量信息。

选项待定