/** * Generates the columns. * * @param QueryBuilder $queryBuilder * @param TableView $view */ private function generateColumns(QueryBuilder $queryBuilder, TableView $view) { $sortDirs = [ColumnSort::ASC, ColumnSort::DESC]; $newSortedColumnName = null; $columns = $this->config->getColumns(); // Check if user requested a new column sorting. foreach ($columns as $columnOptions) { if (array_key_exists('sortable', $columnOptions) && true === $columnOptions['sortable']) { $key = $columnOptions['full_name'] . '_sort'; $sortDir = $this->requestHelper->getRequestVar($key, ColumnSort::NONE); if (in_array($sortDir, $sortDirs)) { $newSortedColumnName = $columnOptions['name']; break; } } } // If new sorted column purge session sort. if (null !== $newSortedColumnName) { foreach ($columns as $columnOptions) { if ($newSortedColumnName !== $columnOptions['name']) { $this->requestHelper->unsetVar($columnOptions['full_name'] . '_sort'); } } } $alias = $queryBuilder->getRootAliases()[0]; // Configure columns options. $userSort = false; foreach ($columns as $columnOptions) { $columnOptions['sort_dir'] = ColumnSort::NONE; $columnOptions['sorted'] = false; if (array_key_exists('sortable', $columnOptions) && true === $columnOptions['sortable']) { $key = $columnOptions['full_name'] . '_sort'; $sortDir = $this->requestHelper->getRequestVar($key, ColumnSort::NONE); if (in_array($sortDir, $sortDirs)) { $columnOptions['sort_dir'] = $sortDir; $columnOptions['sorted'] = true; // Configure query builder. $queryBuilder->addOrderBy($alias . '.' . $columnOptions['property_path'], strtoupper($sortDir)); $userSort = true; // Stores user sorting in session. $this->requestHelper->setVar($key, $sortDir); } } $column = new Column(); $type = $this->factory->getColumnType($columnOptions['type']); $type->buildViewColumn($column, $this, $columnOptions); $view->columns[] = $column; } unset($columnOptions); // Default sort if not user sorted. $defaultSorts = $this->config->getDefaultSorts(); if (!$userSort && !empty($defaultSorts)) { foreach ($defaultSorts as $defaultSort) { list($sortBy, $sortDir) = explode(' ', $defaultSort); $queryBuilder->addOrderBy($alias . '.' . $sortBy, $sortDir); } } }