Skip to content

Commit dac043d

Browse files
committed
Introducing abstract for DataModel
1 parent b1f8090 commit dac043d

File tree

7 files changed

+113
-25
lines changed

7 files changed

+113
-25
lines changed

phpstan.neon

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ parameters:
3030
count: 1
3131
path: src/DataSource/DibiFluentMssqlDataSource.php
3232
-
33-
message: "#^Cannot call method filterData\\(\\) on Contributte\\\\Datagrid\\\\DataModel\\|null\\.$#"
33+
message: "#^Cannot call method filterData\\(\\) on Contributte\\\\Datagrid\\\\AbstractDataModel\\|null\\.$#"
3434
count: 1
3535
path: src/Datagrid.php
3636
-
37-
message: "#^Cannot call method filterRow\\(\\) on Contributte\\\\Datagrid\\\\DataModel\\|null\\.$#"
37+
message: "#^Cannot call method filterRow\\(\\) on Contributte\\\\Datagrid\\\\AbstractDataModel\\|null\\.$#"
3838
count: 1
3939
path: src/Datagrid.php
4040
- # In PHP 8+, the Stringable typehint should be used, and this can be removed.

src/AbstractDataModel.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Contributte\Datagrid;
4+
5+
use Contributte\Datagrid\Components\DatagridPaginator\DatagridPaginator;
6+
use Contributte\Datagrid\DataSource\IDataSource;
7+
use Contributte\Datagrid\Utils\Sorting;
8+
9+
/**
10+
* @method onBeforeFilter(IDataSource $dataSource)
11+
* @method onAfterFilter(IDataSource $dataSource)
12+
* @method onAfterPaginated(IDataSource $dataSource)
13+
*/
14+
abstract class AbstractDataModel
15+
{
16+
17+
/** @var array|callable[] */
18+
public array $onBeforeFilter = [];
19+
20+
/** @var array|callable[] */
21+
public array $onAfterFilter = [];
22+
23+
/** @var array|callable[] */
24+
public array $onAfterPaginated = [];
25+
26+
abstract public function getDataSource(): IDataSource;
27+
28+
abstract public function filterData(?DataGridPaginator $paginatorComponent, Sorting $sorting, array $filters): iterable;
29+
30+
abstract public function filterRow(array $condition): array;
31+
32+
}

src/AggregationFunction/TDatagridAggregationFunction.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Contributte\Datagrid\AggregationFunction;
44

5-
use Contributte\Datagrid\DataModel;
5+
use Contributte\Datagrid\AbstractDataModel;
66
use Contributte\Datagrid\DataSource\IDataSource;
77
use Contributte\Datagrid\Exception\DatagridException;
88

@@ -27,7 +27,7 @@ public function addAggregationFunction(
2727
throw new DatagridException('You can use either ColumnsSummary or AggregationFunctions');
2828
}
2929

30-
if (!$this->dataModel instanceof DataModel) {
30+
if (!$this->dataModel instanceof AbstractDataModel) {
3131
throw new DatagridException('You have to set a data source first.');
3232
}
3333

src/DataModel.php

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,25 +29,11 @@
2929
use Nette\SmartObject;
3030
use Nextras\Orm\Collection\ICollection;
3131

32-
/**
33-
* @method onBeforeFilter(IDataSource $dataSource)
34-
* @method onAfterFilter(IDataSource $dataSource)
35-
* @method onAfterPaginated(IDataSource $dataSource)
36-
*/
37-
final class DataModel
32+
final class DataModel extends AbstractDataModel
3833
{
3934

4035
use SmartObject;
4136

42-
/** @var array|callable[] */
43-
public array $onBeforeFilter = [];
44-
45-
/** @var array|callable[] */
46-
public array $onAfterFilter = [];
47-
48-
/** @var array|callable[] */
49-
public array $onAfterPaginated = [];
50-
5137
private IDataSource $dataSource;
5238

5339
public function __construct(mixed $source, string $primaryKey)
@@ -133,7 +119,7 @@ public function filterData(
133119
return $this->dataSource->sort($sorting)->getData();
134120
}
135121

136-
public function filterRow(array $condition): mixed
122+
public function filterRow(array $condition): array
137123
{
138124
$this->onBeforeFilter($this->dataSource);
139125
$this->onAfterFilter($this->dataSource);

src/DataSource/IDataSource.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public function getCount(): int;
1616
/**
1717
* Get the data
1818
*/
19-
public function getData(): iterable;
19+
public function getData(): array;
2020

2121
/**
2222
* Filter data

src/Datagrid.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ class Datagrid extends Control
183183
/** @var array<ToolbarButton> */
184184
protected array $toolbarButtons = [];
185185

186-
protected ?DataModel $dataModel = null;
186+
protected ?AbstractDataModel $dataModel = null;
187187

188188
protected string $primaryKey = 'id';
189189

@@ -344,7 +344,7 @@ public function render(): void
344344
/**
345345
* Check whether datagrid has set some columns, initiated data source, etc
346346
*/
347-
if (!($this->dataModel instanceof DataModel)) {
347+
if (!($this->dataModel instanceof AbstractDataModel)) {
348348
throw new DatagridException('You have to set a data source first.');
349349
}
350350

@@ -469,7 +469,7 @@ public function setRowCallback(callable $callback): self
469469
*/
470470
public function setPrimaryKey(string $primaryKey): self
471471
{
472-
if ($this->dataModel instanceof DataModel) {
472+
if ($this->dataModel instanceof AbstractDataModel) {
473473
throw new DatagridException('Please set datagrid primary key before setting datasource.');
474474
}
475475

@@ -481,10 +481,18 @@ public function setPrimaryKey(string $primaryKey): self
481481
/**
482482
* @return static
483483
* @throws InvalidArgumentException
484+
* @throws DatagridException
484485
*/
485486
public function setDataSource(mixed $source): self
486487
{
487-
$this->dataModel = new DataModel($source, $this->primaryKey);
488+
$this->setDataModel(new DataModel($source, $this->primaryKey));
489+
490+
return $this;
491+
}
492+
493+
public function setDataModel(AbstractDataModel $dataModel): self
494+
{
495+
$this->dataModel = $dataModel;
488496

489497
$this->dataModel->onBeforeFilter[] = [$this, 'beforeDataModelFilter'];
490498
$this->dataModel->onAfterFilter[] = [$this, 'afterDataModelFilter'];

src/RestDataModel.php

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace Contributte\Datagrid;
4+
5+
use Contributte\Datagrid\Components\DatagridPaginator\DatagridPaginator;
6+
use Contributte\Datagrid\DataSource\IDataSource;
7+
use Contributte\Datagrid\Utils\Sorting;
8+
9+
class RestDataModel extends AbstractDataModel
10+
{
11+
12+
private IDataSource $dataSource;
13+
14+
public function __construct(IDataSource $source)
15+
{
16+
$this->dataSource = $source;
17+
}
18+
19+
public function getDataSource(): IDataSource
20+
{
21+
return $this->dataSource;
22+
}
23+
24+
public function filterData(?DatagridPaginator $paginatorComponent, Sorting $sorting, array $filters): iterable
25+
{
26+
$this->onBeforeFilter($this->dataSource);
27+
28+
$this->dataSource->filter($filters);
29+
30+
$this->onAfterFilter($this->dataSource);
31+
32+
/**
33+
* Paginator is optional
34+
*/
35+
if ($paginatorComponent !== null) {
36+
$paginator = $paginatorComponent->getPaginator();
37+
38+
$this->dataSource->sort($sorting)->limit(
39+
$paginator->getOffset(),
40+
$paginator->getItemsPerPage()
41+
);
42+
43+
$this->onAfterPaginated($this->dataSource);
44+
45+
$data = $this->dataSource->getData();
46+
$paginator->setItemCount($this->dataSource->getCount());
47+
48+
return $data;
49+
}
50+
51+
return $this->dataSource->sort($sorting)->getData();
52+
}
53+
54+
public function filterRow(array $condition): array
55+
{
56+
$this->onBeforeFilter($this->dataSource);
57+
$this->onAfterFilter($this->dataSource);
58+
59+
return $this->dataSource->filterOne($condition)->getData();
60+
}
61+
62+
}

0 commit comments

Comments
 (0)