intracto/datatables-backend

处理 datatables.net AJAX 调用的库

v2.0.1 2023-03-06 07:19 UTC

This package is auto-updated.

Last update: 2024-09-16 16:26:59 UTC


README

处理 Datatables.net 的 AJAX 请求。

安装

composer require intracto/datatables-backend

or

"intracto/datatables-backend" : "dev-master"

容器类,用于保存 Column 对象。用于获取排序的字段。

存储关于列的数据,可用于前端渲染 <th> 并让 DataTables 知道哪些字段是可排序和可搜索的(通过 JavaScript)。

数据提供者

获取要在数据表中显示的数据。需要 ParametersDataTablesRepositoryColumnTransformer

参数

容器类,用于保存来自 datatables AJAX 请求的数据。

DataTablesRepositoryInterface

定义了获取数据所需的查询函数。

DataTablesRepositoryTrait

DataTablesRepositoryInterface 的实现,包含通用查询。目前仅适用于 Doctrine ODM。

ColumnTransformerInterface

将从 Repository 获取的数据转换成 datatables 需要的格式。字段的顺序在这里很重要。

示例

class AddressListColumns extends Columns
{
    public function __construct()
    {
        parent::__construct(
            array(
                // In order of the tables headers
                new Column('city', 'city', true, true),
                new Column('zip', 'zip', false, false),
                new Column('street', 'street', false, false),
                new Column('actions', 'actions', false, false),
            )
        );
    }
}

转换器

class AddressListColumnTransformer implements ColumnTransformerInterface
{
    /**
     * @var EngineInterface
     */
    private $renderEngine;

    /**
     * AddressListColumnTransformer constructor
     *
     * @param EngineInterface $renderEngine
     */
    public function __construct(EngineInterface $renderEngine)
    {
        $this->renderEngine = $renderEngine;
    }

    /**
     * @param array $data
     *
     * @return array
     */
    public function transform(array $data)
    {
        $columns = array();

        foreach ($data as $address) {
            /**
             * @var Address $address
             */
            $columns[] = array(
                $address->getCity()
                $address->getZip()
                $address->getStreet()
                $this->renderEngine->render('Address/_list.actions.html.twig', array('address' => $address)),
            );
        }

        return $columns;
    }
}

存储库

class AddressRepository extends DocumentRepository implements DataTablesRepositoryInterface
{
    use DataTablesRepositoryTrait;
}

控制器

public function listAction()
{
    $columns = new AddressListColumns();

    return array(
        'columns' => $columns,
    );
}

public function ajaxListAction(Request $request)
{
    $parameters = Parameters::fromParameterBag($request->query, new AddressListColumns());

    $data = $this->dataTablesDataProvider->getData(
        $parameters,
        $addressRepository,
        $addressListColumnTransformer
    );

    return new JsonResponse($data);
}

前端

外部 JS

在加载官方 datatables.js 插件后包含 ajax-datatables.js

Twig HTML

确保表格有 "ajaxdatatable" 类。遍历表格头中的所有列

<table class="ajaxdatatable">
    <thead>
        <tr>
            {% for column in columns %}
                <th>{{ ("translatable.prefix." ~ column.name)|trans }}</th>
            {% endfor %}
        </tr>
    </thead>
</table>

需要默认排序吗?将类 default_sortasc|desc 添加到正确的 <th>

<th {% if column.name == 'email' %} class="default_sort desc"{% endif %}>
    ...
</th>

Twig JS

在需要加载 AJAX 数据表的 twig 页面上放置以下脚本块

过滤器是可选的,这里可以传递可搜索/可过滤的字段

<script>
    $(document).ready(function(){

        {# define the ajax call path #}
        var ajaxCallPath = "{{ path("path_to_your_ajax_call") }}";

        {# define which columns are orderable #}
        var sortable = [
            {% for column in columns %}
                {%- if column.orderable -%}
                    {{ 'null' }}
                {%- else -%}
                    {{ '{ "orderable": false }'}}
                {%- endif -%}
                {{ ',' }}
            {% endfor %}
        ];

        {# page load filter fields, do not add .val() since we need the reference #}
        var filters = {
            'name': $("#js-filter-naam"),
            'address.city': $("#js-filter-city")
        };

        {# on page load, init the datatable #}
        ajaxDatatable(ajaxCallPath, sortable, filters, stateSaveAffix);

        {# on submit, change, whenever you want #}
        $(document).on("click", "#js-filter-submit", function(){
            {# no need to pass the parameters again #}
            ajaxDatatable();
        });
    });
</script>