You are here

public function FileController::show in Ubercart 8.4

Displays list of all files available to attach to products.

Return value

array A render array.

1 string reference to 'FileController::show'
uc_file.routing.yml in uc_file/uc_file.routing.yml
uc_file/uc_file.routing.yml

File

uc_file/src/Controller/FileController.php, line 59

Class

FileController
Handles administrative view of files that may be purchased and downloaded.

Namespace

Drupal\uc_file\Controller

Code

public function show() {
  $build['#tree'] = TRUE;
  $build['#attached']['library'][] = 'uc_file/uc_file.scripts';

  // Form that provides operations.
  $build['file_action_form'] = $this->formBuilder
    ->getForm('Drupal\\uc_file\\Form\\FileActionForm');

  // Table of files to operate on.
  $header = [
    // Fake out tableselect JavaScript into operating on our table.
    [
      'data' => '',
      'class' => [
        'select-all',
      ],
    ],
    'filename' => [
      'data' => $this
        ->t('File'),
      'field' => 'f.filename',
      'sort' => 'asc',
    ],
    'title' => [
      'data' => $this
        ->t('Product'),
      'field' => 'n.title',
    ],
    'model' => [
      'data' => $this
        ->t('SKU'),
      'field' => 'fp.model',
      'class' => [
        RESPONSIVE_PRIORITY_LOW,
      ],
    ],
  ];

  // Create pager.
  $query = $this->database
    ->select('uc_files', 'f')
    ->extend('Drupal\\Core\\Database\\Query\\PagerSelectExtender')
    ->extend('Drupal\\Core\\Database\\Query\\TableSortExtender')
    ->orderByHeader($header)
    ->limit(UC_FILE_PAGER_SIZE);
  $query
    ->leftJoin('uc_file_products', 'fp', 'f.fid = fp.fid');
  $query
    ->leftJoin('uc_product_features', 'pf', 'fp.pfid = pf.pfid');
  $query
    ->leftJoin('node_field_data', 'n', 'pf.nid = n.nid');
  $query
    ->addField('n', 'nid');
  $query
    ->addField('f', 'filename');
  $query
    ->addField('n', 'title');
  $query
    ->addField('fp', 'model');
  $query
    ->addField('f', 'fid');
  $query
    ->addField('pf', 'pfid');
  $count_query = $this->database
    ->select('uc_files');
  $count_query
    ->addExpression('COUNT(*)');
  $query
    ->setCountQuery($count_query);
  $result = $query
    ->execute();
  $options = [];
  foreach ($result as $file) {

    // All files are shown here, including files which are not attached to products.
    if (isset($file->nid)) {

      // These are attached to products.
      $options[$file->fid] = [
        'checked' => [
          'data' => [
            '#type' => 'checkbox',
            '#default_value' => 0,
          ],
        ],
        'filename' => [
          'data' => [
            '#plain_text' => $file->filename,
          ],
          'class' => is_dir(uc_file_qualify_file($file->filename)) ? [
            'uc-file-directory-view',
          ] : [],
        ],
        'title' => [
          'data' => [
            '#type' => 'link',
            '#title' => $file->title,
            '#url' => Url::fromRoute('entity.node.canonical', [
              'node' => $file->nid,
            ]),
          ],
        ],
        'model' => [
          'data' => [
            '#plain_text' => $file->model,
          ],
        ],
      ];
    }
    else {

      // These are not attached to products.
      $options[$file->fid] = [
        'checked' => [
          'data' => [
            '#type' => 'checkbox',
            '#default_value' => 0,
          ],
        ],
        'filename' => [
          'data' => [
            '#plain_text' => $file->filename,
          ],
          'class' => is_dir(uc_file_qualify_file($file->filename)) ? [
            'uc-file-directory-view',
          ] : [],
        ],
        'title' => '',
        'model' => '',
      ];
    }
  }

  // Create checkboxes for each file.
  $build['file_select'] = [
    '#type' => 'table',
    '#header' => $header,
    '#rows' => $options,
    '#empty' => $this
      ->t('No file downloads available.'),
  ];
  $build['file_select_pager'] = [
    '#type' => 'pager',
  ];
  return $build;
}