Skip to content

Commit

Permalink
[FEATURE] Add Metadata Export To Files/Media Database
Browse files Browse the repository at this point in the history
  • Loading branch information
ThomasWeinert committed Jul 3, 2020
1 parent 255ab8a commit 489762a
Show file tree
Hide file tree
Showing 4 changed files with 160 additions and 1 deletion.
141 changes: 141 additions & 0 deletions src/system/Papaya/Administration/Files/Commands/ExportData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
<?php

namespace Papaya\Administration\Files\Commands {

use Papaya\Administration\Settings\SettingsPage;
use Papaya\BaseObject\Interfaces\StringCastable;
use Papaya\Content\Language;
use Papaya\Content\Tables;
use Papaya\Database\Accessible;
use Papaya\Iterator\Filter\Callback as CallbackFilter;
use Papaya\Response;
use Papaya\Response\Content\CSV as CSVResponseContent;
use Papaya\UI\Dialog;
use Papaya\UI\Text\Translated as TranslatedText;
use Papaya\UI\Text\Translated\Collection as TranslatedList;
use Papaya\Iterator\ArrayMapper;

class ExportData extends \Papaya\UI\Control\Command\Dialog implements Accessible {

use Accessible\Aggregation;

const COMMAND_EXPORT = 'export_meta';
const FIELD_COMMAND = 'cmd';
const FIELD_LANGUAGES = 'languages';
const FIELD_INCLUDE_TAGS = 'include_tags';
const FIELD_INCLUDE_VERSIONS = 'include_versions';

public function createDialog() {
$dialog = parent::createDialog();
$dialog->options->useToken = FALSE;
$dialog->parameterGroup($this->parameterGroup());
$dialog->hiddenFields->merge(
[
self::FIELD_COMMAND => self::COMMAND_EXPORT
]
);
$dialog->caption = new TranslatedText('Configure Export');
$dialog->fields[] = new Dialog\Field\Select\Checkboxes(
new TranslatedText('Languages'),
self::FIELD_LANGUAGES,
new ArrayMapper(
new CallbackFilter(
$this->papaya()->languages,
function ($language) {
return $language['is_content'];
}
),
'title'
),
FALSE
);
/*
$dialog->fields[] = new Dialog\Field\Select\Radio(
new TranslatedText('Include tags'),
self::FIELD_INCLUDE_TAGS,
new TranslatedList([1 => 'On', 0 => 'Off']),
FALSE
);
$dialog->fields[] = new Dialog\Field\Select\Radio(
new TranslatedText('Include versions'),
self::FIELD_INCLUDE_VERSIONS,
new TranslatedList([1 => 'On', 0 => 'Off']),
FALSE
);
*/
$dialog->buttons[] = new Dialog\Button\Submit(new TranslatedText('Export CSV'));
//$this->hideAfterSuccess(TRUE);
$this->callbacks()->onExecuteSuccessful = function ($context, $dialog) {
$this->exportCSV(
$dialog->data[self::FIELD_LANGUAGES],
$dialog->data[self::FIELD_INCLUDE_TAGS],
$dialog->data[self::FIELD_INCLUDE_VERSIONS]
);
};
return $dialog;
}

private function exportCSV(array $languages, $includeTags, $includeVersions) {
foreach ($languages as $languageId) {
$languageIdentifier = $this->papaya()->languages[$languageId]['identifier'];
$fields[$languageIdentifier] = sprintf(
', %1$s.file_title title_%1$s, %1$s.file_description description_%1$s ',
$languageIdentifier
);
$joins[$languageIdentifier] = sprintf(
' LEFT JOIN :table_%1$s AS %1$s ON (%1$s.file_id = files.file_id AND %1$s.lng_id = %2$d)',
$languageIdentifier,
$languageId
);
}
if ($includeVersions) {

} else {
$sql =
"SELECT files.file_id, files.file_name,
files.file_date, files.file_source,
files.file_source_url, files.file_keywords
".implode(' ', $fields)."
FROM (:table_files AS files)
".implode(' ', $joins);
$columns = [
'file_id' => 'Id',
'file_name' => 'Name',
'file_date' => 'Date',
'file_source' => 'Source',
'file_source_url' => 'Source URL',
'file_keywords' => 'Keywords'
];
foreach ($languages as $languageId) {
$languageIdentifier = $this->papaya()->languages[$languageId]['identifier'];
$languageCode = $this->papaya()->languages[$languageId]['code'];
$columns['title_'.$languageIdentifier] = 'Title ('.$languageCode.')';
$columns['description_'.$languageIdentifier] = 'Description ('.$languageCode.')';
}
}
$statement = $this->getDatabaseAccess()->prepare($sql);
$statement->addTableName('table_files', Tables::MEDIA_FILES);
foreach ($joins as $languageCode => $join) {
$statement->addTableName('table_'.$languageCode, Tables::MEDIA_FILE_TRANSLATIONS);
}
if ($result = $statement->execute()) {
$response = $this->papaya()->response;
$response->content(
$content = new CSVResponseContent(
$result,
$columns
)
);
$content->callbacks()->onMapField = function($value, $field) {
if ($field === 'file_date') {
return gmdate(DATE_ATOM, $value);
}
return $value;
};
$response->setContentType('text/csv');
$response->headers()->set('Content-Disposition', 'attachment; filename="media.csv"');
$response->send(TRUE);
}
}
}
}
3 changes: 2 additions & 1 deletion src/system/Papaya/Administration/Permission/Groups.php
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,8 @@ class Groups implements \IteratorAggregate {
Administration\Permissions::FILE_UPLOAD => 'Upload files',
Administration\Permissions::FILE_EDIT => 'Edit files',
Administration\Permissions::FILE_DELETE => 'Delete files',
Administration\Permissions::FILE_IMPORT => 'Import files'
Administration\Permissions::FILE_IMPORT => 'Import files',
Administration\Permissions::FILE_EXPORT => 'Export file metadata'
]
];

Expand Down
2 changes: 2 additions & 0 deletions src/system/Papaya/Administration/Permissions.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,8 @@ class Permissions

const FILE_IMPORT = 47;

const FILE_EXPORT = 52;

const FILE_EDIT = 9;

const FILE_DELETE = 10;
Expand Down
15 changes: 15 additions & 0 deletions src/system/papaya_mediadb.php
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,12 @@ function executeFilesManagement() {
$this->getUploadToolbar();
$this->getUploadDialog();
break;
case 'export_meta':
$command = new Administration\Files\Commands\ExportData();
$command->papaya($this->papaya());
$command->parameterGroup($this->parameterGroup());
$this->layout->addInformation($command->getXML());
break;
case 'get_file':
$this->getUploadToolbar();
$folderId = empty($this->params['folder_id']) ? 0 : (int)$this->params['folder_id'];
Expand Down Expand Up @@ -1244,6 +1250,15 @@ function loadFilesMenubar() {
isset($this->params['cmd']) && $this->params['cmd'] == 'upload_files'
);
}
if ($administrationUser->hasPerm(Administration\Permissions::FILE_EXPORT)) {
$this->menubar->addButton(
'Export metadata',
$this->getLink(array('cmd' => 'export_meta')),
'actions-download',
'Export file metadata as CSV.',
isset($this->params['cmd']) && $this->params['cmd'] == 'export_meta'
);
}
if (isset($this->currentFile) &&
is_array($this->currentFile) &&
count($this->currentFile) > 0 &&
Expand Down

0 comments on commit 489762a

Please sign in to comment.