enableRecursiveSort(); } $this->columnToSort = $columnToSort; $this->naturalSort = $naturalSort; $this->order = strtolower($order); $this->isSecondaryColumnSortEnabled = $doSortBySecondaryColumn; } /** * See {@link Sort}. * * @param DataTable $table * @return mixed */ public function filter($table) { if ($table instanceof Simple) { return; } if (empty($this->columnToSort)) { return; } if (!$table->getRowsCountWithoutSummaryRow()) { return; } $row = $table->getFirstRow(); if ($row === false) { return; } $config = new Sorter\Config(); $sorter = new Sorter($config); $config->naturalSort = $this->naturalSort; $config->primaryColumnToSort = $sorter->getPrimaryColumnToSort($table, $this->columnToSort); $config->primarySortOrder = $sorter->getPrimarySortOrder($this->order); $config->primarySortFlags = $sorter->getBestSortFlags($table, $config->primaryColumnToSort); $config->secondaryColumnToSort = $sorter->getSecondaryColumnToSort($row, $config->primaryColumnToSort); $config->secondarySortOrder = $sorter->getSecondarySortOrder($this->order, $config->secondaryColumnToSort); $config->secondarySortFlags = $sorter->getBestSortFlags($table, $config->secondaryColumnToSort); // secondary sort should not be needed for all other sort flags (eg string/natural sort) as label is unique and would make it slower $isSecondaryColumnSortNeeded = $config->primarySortFlags === SORT_NUMERIC; $config->isSecondaryColumnSortEnabled = $this->isSecondaryColumnSortEnabled && $isSecondaryColumnSortNeeded; $this->sort($sorter, $table); } private function sort(Sorter $sorter, DataTable $table) { $sorter->sort($table); if ($table->isSortRecursiveEnabled()) { foreach ($table->getRowsWithoutSummaryRow() as $row) { $subTable = $row->getSubtable(); if ($subTable) { $subTable->enableRecursiveSort(); $this->sort($sorter, $subTable); } } } } }