コード例 #1
0
ファイル: Table.php プロジェクト: ekyna/table
 /**
  * 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);
         }
     }
 }