adt / query-object-data-source
Ublaboo Datagrid 数据源绑定,用于 adt/base-query 查询对象。
v2.5.1
2024-07-07 06:19 UTC
Requires
- php: >=7.4
- adt/doctrine-components: ^2.8
- nette/di: ^2.4|^3.0
- ublaboo/datagrid: ^6.0
README
安装
通过 composer
composer require adt/query-object-data-source
并在 config.neon 中
extensions: - ADT\QueryObjectDataSource\DI\QueryObjectDataSourceExtension
用法
注入或自动装配 QueryObjectDataSourceFactory
/** @var \ADT\QueryObjectDataSource\IQueryObjectDataSourceFactory @autowire */ protected $queryObjectDataSourceFactory;
创建查询对象并将其封装为数据源
$qo = /* create query object */; $dataSource = $this->queryObjectDataSourceFactory->create($qo, "id") ->setSortCallback(function($queryObject, \Ublaboo\DataGrid\Utils\Sorting $sorting) { $sort = $sorting->getSort(); if (!empty($sort)) { foreach ($sort as $order => $by) { $queryObject->order("e.$order", $by); } } }) ->setFilterCallback(function ($queryObject, array $filter) { foreach ($filter as $field => $value) { switch ($column) { case 'dateRange': $queryObject->byDateRange(QueryObjectDataSource::parseFilterDateRange($fieldSet)); break; case 'date': $queryObject->byDate(QueryObjectDataSource::parseFilterDate($fieldSet)); break; default: $queryObject->{'by' . $field}($value); } } }) ->setLimitCallback(function ($offset, $limit, $defaultCallback) use ($query, $itemRepository) { // This callback is not necessary, but you can do your stuff with $offset and $limit here. $defaultCallback(); // Run the default action }); $grid->setDataSource($queryObjectDataSource);
您还可以使用每列条件和可排序回调
$datagrid->addColumnText('email', 'entity.user.email') ->setSortable() ->setSortableCallback(function (UserQueryObject $userQuery, $email) { $userQuery->orderByEmail($email); }) ->setFilterText() ->setCondition(function (UserQueryObject $userQuery, $email) { $userQuery->searchInEmail($email); });
如果您在 QueryObject 上实现了 \ADT\QueryObjectDataSource\IQueryObject,则当没有提供每列回调时,将调用这些方法。函数 searchIn($column, $value)
将在文本字段上调用,而 equalIn($column, $value)
将在其它列类型上调用。