From 489762a5a00ba3342f3ecd9e78858f65c78ca81b Mon Sep 17 00:00:00 2001 From: Thomas Weinert Date: Fri, 3 Jul 2020 12:03:22 +0200 Subject: [PATCH] [FEATURE] Add Metadata Export To Files/Media Database --- .../Files/Commands/ExportData.php | 141 ++++++++++++++++++ .../Administration/Permission/Groups.php | 3 +- .../Papaya/Administration/Permissions.php | 2 + src/system/papaya_mediadb.php | 15 ++ 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 src/system/Papaya/Administration/Files/Commands/ExportData.php diff --git a/src/system/Papaya/Administration/Files/Commands/ExportData.php b/src/system/Papaya/Administration/Files/Commands/ExportData.php new file mode 100644 index 000000000..0b3f16a58 --- /dev/null +++ b/src/system/Papaya/Administration/Files/Commands/ExportData.php @@ -0,0 +1,141 @@ +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); + } + } + } +} diff --git a/src/system/Papaya/Administration/Permission/Groups.php b/src/system/Papaya/Administration/Permission/Groups.php index bc2a9b292..8b3e1e2c2 100644 --- a/src/system/Papaya/Administration/Permission/Groups.php +++ b/src/system/Papaya/Administration/Permission/Groups.php @@ -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' ] ]; diff --git a/src/system/Papaya/Administration/Permissions.php b/src/system/Papaya/Administration/Permissions.php index 93e8e1aa7..f7a1cf475 100644 --- a/src/system/Papaya/Administration/Permissions.php +++ b/src/system/Papaya/Administration/Permissions.php @@ -92,6 +92,8 @@ class Permissions const FILE_IMPORT = 47; + const FILE_EXPORT = 52; + const FILE_EDIT = 9; const FILE_DELETE = 10; diff --git a/src/system/papaya_mediadb.php b/src/system/papaya_mediadb.php index cd7d89784..7001b5d32 100644 --- a/src/system/papaya_mediadb.php +++ b/src/system/papaya_mediadb.php @@ -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']; @@ -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 &&