View source
<?php
namespace Drupal\filebrowser;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Utility\TableSort;
use Drupal\filebrowser\Entity\FilebrowserMetadataEntity;
use Drupal\filebrowser\Events\MetadataInfo;
use Drupal\filebrowser\File\DisplayFile;
use Drupal\filebrowser\Grid\Grid;
use Drupal\filebrowser\Services\Common;
use Drupal\node\NodeInterface;
use Symfony\Component\HttpFoundation\Request;
class Presentation extends ControllerBase {
protected $filebrowser;
protected $dbFileList;
protected $fsFileList;
protected $node;
protected $common;
protected $formActions;
protected $listOfFids;
public function __construct(NodeInterface $node, array $list) {
$this->common = \Drupal::service('filebrowser.common');
$this->node = $node;
$this->filebrowser = $node->filebrowser;
$this->dbFileList = $list;
$this->listOfFids = array_column($list, 'fid');
$this
->init();
}
public function init() {
$this->formActions = $this->common
->userAllowedActions($this->node);
}
public function listView() {
foreach ($this->dbFileList['files'] as $key => $display_file_obj) {
$fid = $display_file_obj->fid;
$metadatas = $this
->retrieveMetadata($fid);
foreach ($metadatas as $metadata) {
$contents = $metadata
->getContent();
foreach ($contents as $content) {
}
}
}
$default_sort = $this->filebrowser->defaultSort;
$sort_order = $this->filebrowser->defaultSortOrder;
$directory_empty = true;
$column_names = [];
$dispatcher = \Drupal::service('event_dispatcher');
$visible_columns = [];
$e = new MetadataInfo($column_names);
$event = $dispatcher
->dispatch('filebrowser.metadata_info', $e);
$column_names = $event
->getMetaDataInfo();
$this
->createUnsortedRowsAndColumns($unsorted_rows, $visible_columns, $column_names, $directory_empty);
$header = [];
$this
->buildHeader($header, $unsorted_rows, $visible_columns, $column_names, $default_sort, $sort_order);
$request = Request::createFromGlobals();
$result = $this
->splitFiles($this->dbFileList['files']);
$just_files = isset($result['files']) ? $result['files'] : null;
$just_folders = isset($result['folders']) ? $result['folders'] : null;
$table_sort = TableSort::getContextFromRequest($header, $request);
if (isset($table_sort['sql'])) {
$field = $table_sort['sql'];
if (isset($column_names[$field]) && isset($column_names[$field]['sortable']) && $column_names[$field]['sortable']) {
$sorter = null;
switch ($column_names[$field]['type']) {
case 'integer':
$sorter = function ($a, $b) use ($field) {
$a = isset($a->{$field}) ? $a->{$field} : 0;
$b = isset($b->{$field}) ? $b->{$field} : 0;
return $a - $b;
};
break;
case 'string':
$sorter = function ($a, $b) use ($field) {
$a = isset($a->{$field}) ? $a->{$field} : '';
$b = isset($b->{$field}) ? $b->{$field} : '';
return -strcmp(strtolower($a), strtolower($b));
};
break;
}
if (!empty($just_folders)) {
usort($just_folders, $sorter);
if ($table_sort['sort'] == 'asc') {
$just_folders = array_reverse($just_folders, true);
}
}
if (!empty($just_files)) {
usort($just_files, $sorter);
if ($table_sort['sort'] == 'asc') {
$just_files = array_reverse($just_files, true);
}
}
}
}
$rows = [];
if (!is_null($just_folders)) {
foreach ($just_folders as $data) {
$rows[$data->fid] = $unsorted_rows[$data->displayName];
}
}
if (!is_null($just_files)) {
foreach ($just_files as $data) {
$rows[$data->fid] = $unsorted_rows[$data->displayName];
}
}
if (count($this->formActions) > 0) {
$params = [
'header' => $header,
'rows' => $rows,
'actions' => $this->formActions,
'node' => $this->node,
'dbFileList' => $this->dbFileList,
];
return \Drupal::formBuilder()
->getForm('Drupal\\filebrowser\\Form\\ActionForm', $params);
}
$rows_aligned = [];
foreach ($rows as $row) {
$rows_aligned[] = array_replace(array_flip(array_keys($header)), $row);
}
\Drupal::service('page_cache_kill_switch')
->trigger();
return [
'#theme' => 'table',
'#header' => $header,
'#rows' => $rows_aligned,
'#sticky' => true,
'#empty' => $this
->t('This directory is empty'),
'#attributes' => [
'id' => 'filebrowser-table',
],
];
}
public function iconView() {
$list_data = $this->dbFileList['data'];
$grids = [];
$this
->sortIconViewFiles($this->dbFileList['files']);
$height = $this->filebrowser->gridHeight;
$width = $this->filebrowser->gridWidth;
foreach ($this->dbFileList['files'] as $file_name => $data) {
if ($file_name == ".") {
continue;
}
if ($file_name != ".." && $data->fileData->type == 'file' && $this->filebrowser->hideExtension) {
$pos = strrpos($data->displayName, ".");
$data->name = substr($data->displayName, 0, $pos);
}
if (empty($data->fileData->uri) || !\Drupal::service('image.factory')
->get($data->fileData->uri)
->isValid()) {
$thumbnail = $this->common
->iconGenerate($data->fileData->type, $data->fileData->mimetype, $height, $width);
}
else {
$thumbnail = [
'#theme' => 'image_style',
'#style_name' => $this->filebrowser->gridImageStyle,
'#uri' => $data->fileData->uri,
'#alt' => 'image style',
'#title' => NULL,
'#width:' => null,
'#height:' => null,
'#attributes' => [],
];
}
$download_link = null;
$grids[] = [
'grid' => [
'#theme' => 'filebrowser_grid_item',
'#data' => [
'title' => $data->displayName == '..' ? $this
->t('Go up') : $data->displayName,
'type' => $data->fileData->type,
'thumbnail' => $thumbnail,
'download_link' => $download_link,
'new' => [
'#theme' => 'mark',
'#type' => $data->status,
],
'href' => $data->href,
'hide_title' => $this->filebrowser->gridHideTitle,
],
],
'file' => $data,
];
}
$options = [
'alignment' => $this->filebrowser->gridAlignment,
'columns' => $this->filebrowser->gridColumns,
'automatic_width' => $this->filebrowser->gridAutoWidth,
];
$grid_table = new Grid($grids, $options);
$items['grid_items'] = $grid_table
->get();
$items['options'] = $options;
$params = [
'actions' => !empty($this->formActions) ? $this->formActions : null,
'node' => $this->node,
'data' => $list_data,
];
return \Drupal::formBuilder()
->getForm('\\Drupal\\filebrowser\\Form\\GridActionForm', $items, $params);
}
function theme_dir_listing_statistics($statistics) {
$output = "<div class='dir-listing-status'>";
if ($statistics['empty']) {
$output .= $statistics['empty'];
}
else {
$white_list = [
'files',
'total_size',
'empty',
'folders',
];
$white_listed_statistics = [];
foreach ($statistics as $key => $statistic) {
if (in_array($key, $white_list) && !empty($statistic)) {
$white_listed_statistics[] = $statistic;
}
}
$output .= implode(" - ", $white_listed_statistics);
}
$output .= "</div>";
return $output;
}
private function createUnsortedRowsAndColumns(&$unsorted_rows, &$visible_columns, $column_names, &$directory_empty) {
$hide_extension = $this->filebrowser->hideExtension;
$selected_columns = $this->filebrowser->visibleColumns;
$files = $this->dbFileList['files'];
foreach ($files as $file_name => $file) {
if ($file_name == ".") {
continue;
}
$directory_empty = false;
if ($file_name != ".." && $file->fileData->type == 'file' && $hide_extension) {
$pos = strrpos($file->displayName, ".");
$data[Common::NAME] = substr($file->displayName, 0, $pos);
}
if (!empty($this->formActions)) {
$unsorted_rows[$file_name]['fid'] = $file->fileData->mimetype != 'folder/parent' ? "{$file->fid}" : '';
}
if (!empty($selected_columns[Common::ICON])) {
$visible_columns[Common::ICON] = true;
$icon = $this->common
->iconGenerate($file->fileData->type, $file->fileData->mimetype, 24, 24);
$unsorted_rows[$file_name][Common::ICON] = render($icon);
}
$unsorted_rows[$file_name][Common::NAME] = render($file->link);
$visible_columns[Common::NAME] = true;
$query = \Drupal::entityQuery('filebrowser_metadata_entity')
->condition('fid', $file->fid);
$ids = $query
->execute();
$metadata_all = \Drupal::entityTypeManager()
->getStorage('filebrowser_metadata_entity')
->loadMultiple($ids);
foreach ($metadata_all as $metadata) {
$name = $metadata
->getName();
if ($selected_columns[$name]) {
$visible_columns[$name] = true;
$content = unserialize($metadata->content->value);
$theme = $metadata->theme->value;
if (is_null($theme)) {
$unsorted_rows[$file_name][$name] = $content;
}
else {
$render = [];
$render['#theme'] = $theme;
$render['#data'] = $content;
$unsorted_rows[$file_name][$name] = render($render);
}
}
}
}
}
private function buildHeader(&$header, &$unsorted_rows, $visible_columns, $column_names, $default_sort, $sort_order) {
foreach ($column_names as $column_name => $column_spec) {
if (isset($visible_columns[$column_name]) && $visible_columns[$column_name]) {
if ($column_name == Common::ICON) {
$header[$column_name] = [];
}
else {
if (!empty($column_spec['sortable'])) {
$header[$column_name] = [
'data' => $column_spec['title'],
'field' => $column_name,
];
}
else {
$header[$column_name] = $column_spec['title'];
}
}
}
else {
if ($unsorted_rows) {
foreach ($unsorted_rows as &$row) {
unset($row[$column_name]);
}
}
}
}
$header[$default_sort]['sort'] = $sort_order;
}
private function splitFiles($files) {
$result = [];
foreach ($files as $name => $data) {
if ($name == '.') {
continue;
}
elseif ($data->fileData->type == 'file') {
$result['files'][] = $data;
}
else {
$result['folders'][] = $data;
}
}
return $result;
}
private function sortIconViewFiles(&$source) {
$files = [];
$folders = [];
foreach ($source as $name => $data) {
if ($name != '.') {
if ($data->fileData->type == 'file') {
$files[$name] = $data;
}
else {
$folders[$name] = $data;
}
}
}
$source = $folders + $files;
}
protected function retrieveMetadata($fid) {
$storage = \Drupal::entityTypeManager()
->getStorage('filebrowser_metadata_entity');
$query = \Drupal::entityQuery('filebrowser_metadata_entity');
$e_ids = $query
->condition('fid', $fid, '=')
->execute();
$entities = $storage
->loadMultiple($e_ids);
return $entities;
}
}