Skip to content

Commit a45a8e4

Browse files
committed
Search/Order on several columns with VirtualColumn
1 parent 0d7bd56 commit a45a8e4

File tree

3 files changed

+29
-21
lines changed

3 files changed

+29
-21
lines changed

Datatable/Column/VirtualColumn.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ public function configureOptions(OptionsResolver $resolver)
5353
'search_column' => null,
5454
]);
5555

56-
$resolver->setAllowedTypes('order_column', ['null', 'string']);
57-
$resolver->setAllowedTypes('search_column', ['null', 'string']);
56+
$resolver->setAllowedTypes('order_column', ['null', 'string', 'array']);
57+
$resolver->setAllowedTypes('search_column', ['null', 'string', 'array']);
5858

5959
$resolver->setNormalizer('orderable', function (Options $options, $value) {
6060
if (null === $options['order_column'] && true === $value) {

Resources/doc/columns.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,10 +360,10 @@ The options `searchable` and `orderable` are set to `false` by default.
360360

361361
**Additional:**
362362

363-
| Option | Type | Default | Required | Description |
364-
|---------------|--------------------|---------|----------|-----------------|
365-
| order_column | null or string | null | | The name of an existing column that is used for ordering. |
366-
| search_column | null or string | null | | The name of an existing column that is used for searching. |
363+
| Option | Type | Default | Required | Description |
364+
|---------------|-----------------------|---------|----------|-----------------|
365+
| order_column | null, string or array | null | | The name of an existing column that is used for ordering. |
366+
| search_column | null, string or array | null | | The name of an existing column that is used for searching. |
367367

368368
### Example
369369

Response/DatatableQueryBuilder.php

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -425,26 +425,30 @@ private function initColumnArrays()
425425
} else {
426426
// Add Order-Field for VirtualColumn
427427
if ($this->accessor->isReadable($column, 'orderColumn') && true === $this->accessor->getValue($column, 'orderable')) {
428-
$orderColumn = $this->accessor->getValue($column, 'orderColumn');
429-
$orderParts = explode('.', $orderColumn);
430-
if (\count($orderParts) < 2) {
431-
if (!isset($this->columnNames[$orderColumn]) || null == $this->accessor->getValue($this->columns[$this->columnNames[$orderColumn]], 'customDql')) {
432-
$orderColumn = $this->entityShortName.'.'.$orderColumn;
428+
$orderColumns = (array) $this->accessor->getValue($column, 'orderColumn');
429+
foreach ($orderColumns as $orderColumn) {
430+
$orderParts = explode('.', $orderColumn);
431+
if (\count($orderParts) < 2) {
432+
if (!isset($this->columnNames[$orderColumn]) || null == $this->accessor->getValue($this->columns[$this->columnNames[$orderColumn]], 'customDql')) {
433+
$orderColumn = $this->entityShortName.'.'.$orderColumn;
434+
}
433435
}
436+
$this->orderColumns[$key][] = $orderColumn;
434437
}
435-
$this->orderColumns[] = $orderColumn;
436438
} else {
437439
$this->orderColumns[] = null;
438440
}
439441

440442
// Add Search-Field for VirtualColumn
441443
if ($this->accessor->isReadable($column, 'searchColumn') && true === $this->accessor->getValue($column, 'searchable')) {
442-
$searchColumn = $this->accessor->getValue($column, 'searchColumn');
443-
$searchParts = explode('.', $searchColumn);
444-
if (\count($searchParts) < 2) {
445-
$searchColumn = $this->entityShortName.'.'.$searchColumn;
444+
$searchColumns = (array) $this->accessor->getValue($column, 'searchColumn');
445+
foreach ($searchColumns as $searchColumn) {
446+
$searchParts = explode('.', $searchColumn);
447+
if (\count($searchParts) < 2) {
448+
$searchColumn = $this->entityShortName . '.' . $searchColumn;
449+
}
450+
$this->searchColumns[$key][] = $searchColumn;
446451
}
447-
$this->searchColumns[] = $searchColumn;
448452
} else {
449453
$this->searchColumns[] = null;
450454
}
@@ -508,10 +512,12 @@ private function setWhere(QueryBuilder $qb)
508512
/** @var AbstractFilter $filter */
509513
$filter = $this->accessor->getValue($column, 'filter');
510514
$searchType = $globalSearchType;
511-
$searchField = $this->searchColumns[$key];
515+
$searchFields = (array) $this->searchColumns[$key];
512516
$searchValue = $globalSearch;
513517
$searchTypeOfField = $column->getTypeOfField();
514-
$orExpr = $filter->addOrExpression($orExpr, $qb, $searchType, $searchField, $searchValue, $searchTypeOfField, $key);
518+
foreach ($searchFields as $searchField) {
519+
$orExpr = $filter->addOrExpression($orExpr, $qb, $searchType, $searchField, $searchValue, $searchTypeOfField, $key);
520+
}
515521
}
516522
}
517523

@@ -568,10 +574,12 @@ private function setOrderBy(QueryBuilder $qb)
568574
$requestColumn = $this->requestParams['columns'][$columnIdx];
569575

570576
if ('true' === $requestColumn['orderable']) {
571-
$columnName = $this->orderColumns[$columnIdx];
577+
$columnNames = (array) $this->orderColumns[$columnIdx];
572578
$orderDirection = $this->requestParams['order'][$i]['dir'];
573579

574-
$qb->addOrderBy($columnName, $orderDirection);
580+
foreach ($columnNames as $columnName) {
581+
$qb->addOrderBy($columnName, $orderDirection);
582+
}
575583
}
576584
}
577585
}

0 commit comments

Comments
 (0)