Skip to content

Commit 33fb34a

Browse files
committed
Add table with custom Adapter, giving full return and using propery paths to rsolve the value
1 parent 3c2b19e commit 33fb34a

File tree

7 files changed

+141
-0
lines changed

7 files changed

+141
-0
lines changed

src/Adapter/Doctrine/ORMAdapter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ protected function getResults(AdapterQuery $query): \Traversable
197197
;
198198
}
199199

200+
//!$this->query->getHint(self::HINT_DISTINCT) || isset($this->selectedClasses[$joinedDqlAlias])
200201
foreach ($builder->getQuery()->iterate([], $this->hydrationMode) as $result) {
201202
yield $entity = array_values($result)[0];
202203
if (Query::HYDRATE_OBJECT === $this->hydrationMode) {

tests/Fixtures/AppBundle/Controller/GroupedController.php

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Omines\DataTablesBundle\Controller\DataTablesTrait;
1616
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1717
use Symfony\Component\HttpFoundation\Request;
18+
use Tests\Fixtures\AppBundle\DataTable\Type\Grouped2TableType;
1819
use Tests\Fixtures\AppBundle\DataTable\Type\GroupedTableType;
1920

2021
/**
@@ -35,4 +36,14 @@ public function tableAction(Request $request)
3536

3637
return $datatable->handleRequest($request)->getResponse();
3738
}
39+
40+
public function table2Action(Request $request)
41+
{
42+
$datatable = $this->createDataTableFromType(Grouped2TableType::class)
43+
->setName('companies2')
44+
->setMethod(Request::METHOD_GET)
45+
;
46+
47+
return $datatable->handleRequest($request)->getResponse();
48+
}
3849
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
<?php
2+
3+
namespace Tests\Fixtures\AppBundle\DataTable\Adapter;
4+
5+
use Doctrine\ORM\Query;
6+
use Doctrine\ORM\Query\Expr\GroupBy;
7+
use Doctrine\ORM\QueryBuilder;
8+
use Omines\DataTablesBundle\Adapter\AdapterQuery;
9+
use Omines\DataTablesBundle\Adapter\Doctrine\ORMAdapter;
10+
use Omines\DataTablesBundle\Column\AbstractColumn;
11+
12+
class CustomORMAdapter extends ORMAdapter
13+
{
14+
protected $hydrationMode;
15+
16+
public function configure(array $options)
17+
{
18+
parent::configure($options);
19+
20+
$this->hydrationMode = isset($options['hydrate']) ? $options['hydrate'] : Query::HYDRATE_OBJECT;
21+
}
22+
23+
protected function prepareQuery(AdapterQuery $query)
24+
{
25+
parent::prepareQuery($query);
26+
$query->setIdentifierPropertyPath(null);
27+
}
28+
29+
/**
30+
* @param AdapterQuery $query
31+
* @return \Traversable
32+
*/
33+
protected function getResults(AdapterQuery $query): \Traversable
34+
{
35+
/** @var QueryBuilder $builder */
36+
$builder = $query->get('qb');
37+
$state = $query->getState();
38+
39+
// Apply definitive view state for current 'page' of the table
40+
foreach ($state->getOrderBy() as list($column, $direction)) {
41+
/** @var AbstractColumn $column */
42+
if ($column->isOrderable()) {
43+
$builder->addOrderBy($column->getOrderField(), $direction);
44+
}
45+
}
46+
if ($state->getLength() > 0) {
47+
$builder
48+
->setFirstResult($state->getStart())
49+
->setMaxResults($state->getLength());
50+
}
51+
52+
/**
53+
* Use foreach instead of iterate to prevent group by from crashing
54+
*/
55+
foreach ($builder->getQuery()->getResult($this->hydrationMode) as $result) {
56+
/**
57+
* Return everything instead of first element
58+
*/
59+
yield $result;
60+
}
61+
}
62+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
/*
4+
* Symfony DataTables Bundle
5+
* (c) Omines Internetbureau B.V. - https://omines.nl/
6+
*
7+
* For the full copyright and license information, please view the LICENSE
8+
* file that was distributed with this source code.
9+
*/
10+
11+
declare(strict_types=1);
12+
13+
namespace Tests\Fixtures\AppBundle\DataTable\Type;
14+
15+
use Doctrine\ORM\Query;
16+
use Doctrine\ORM\QueryBuilder;
17+
use Omines\DataTablesBundle\Column\TextColumn;
18+
use Omines\DataTablesBundle\DataTable;
19+
use Omines\DataTablesBundle\DataTableTypeInterface;
20+
use Tests\Fixtures\AppBundle\DataTable\Adapter\CustomORMAdapter;
21+
use Tests\Fixtures\AppBundle\Entity\Company;
22+
23+
/**
24+
* GroupedTableType.
25+
*
26+
* @author Niels Keurentjes <[email protected]>
27+
*/
28+
class Grouped2TableType implements DataTableTypeInterface
29+
{
30+
/**
31+
* {@inheritdoc}
32+
*/
33+
public function configure(DataTable $dataTable, array $options)
34+
{
35+
$dataTable
36+
->add('company', TextColumn::class, ['propertyPath' => '[0][name]'])
37+
->add('employeeCount', TextColumn::class, ['propertyPath' => '[employeeCount]'])
38+
->createAdapter(CustomORMAdapter::class, [
39+
'entity' => Company::class,
40+
'hydrate' => Query::HYDRATE_ARRAY,
41+
'query' => function (QueryBuilder $builder) {
42+
$builder
43+
->select('c')
44+
->addSelect('count(e) AS employeeCount')
45+
->from(Company::class, 'c')
46+
->leftJoin('c.employees', 'e')
47+
->groupBy('c.id')
48+
;
49+
},
50+
])
51+
;
52+
}
53+
}

tests/Fixtures/routing.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ grouped:
2222
path: /grouped
2323
controller: Tests\Fixtures\AppBundle\Controller\GroupedController::tableAction
2424

25+
grouped2:
26+
path: /grouped2
27+
controller: Tests\Fixtures\AppBundle\Controller\GroupedController::table2Action
28+
2529
employee.edit:
2630
path: /employee/{id}
2731

tests/Fixtures/services.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@ services:
22
Tests\Fixtures\AppBundle\DataTable\Type\ServicePersonTableType:
33
autowire: true
44
autoconfigure: true
5+
Tests\Fixtures\AppBundle\DataTable\Adapter\CustomORMAdapter:
6+
autowire: true
7+
autoconfigure: true

tests/Functional/FunctionalTest.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,13 @@ public function testGroupedDataTable()
116116
$this->assertStringStartsWith('Company ', $json->data[0]->company);
117117
}
118118

119+
public function testGrouped2DataTable()
120+
{
121+
$json = $this->callDataTableUrl('/grouped2?_dt=companies2&draw=2');
122+
123+
$this->assertStringStartsWith('Company ', $json->data[0]->company);
124+
}
125+
119126
private function callDataTableUrl(string $url)
120127
{
121128
$this->client->enableProfiler();

0 commit comments

Comments
 (0)