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 489762a commit 3462341
Show file tree
Hide file tree
Showing 6 changed files with 113 additions and 14 deletions.
76 changes: 63 additions & 13 deletions src/system/Papaya/Administration/Files/Commands/ExportData.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class ExportData extends \Papaya\UI\Control\Command\Dialog implements Accessible
public function createDialog() {
$dialog = parent::createDialog();
$dialog->options->useToken = FALSE;
$dialog->options->protectChanges = FALSE;
$dialog->parameterGroup($this->parameterGroup());
$dialog->hiddenFields->merge(
[
Expand All @@ -49,7 +50,6 @@ function ($language) {
),
FALSE
);
/*
$dialog->fields[] = new Dialog\Field\Select\Radio(
new TranslatedText('Include tags'),
self::FIELD_INCLUDE_TAGS,
Expand All @@ -62,7 +62,6 @@ function ($language) {
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) {
Expand All @@ -76,6 +75,8 @@ function ($language) {
}

private function exportCSV(array $languages, $includeTags, $includeVersions) {
$databaseAccess = $this->getDatabaseAccess();
$databaseSyntax = $databaseAccess->syntax();
foreach ($languages as $languageId) {
$languageIdentifier = $this->papaya()->languages[$languageId]['identifier'];
$fields[$languageIdentifier] = sprintf(
Expand All @@ -89,15 +90,55 @@ private function exportCSV(array $languages, $includeTags, $includeVersions) {
);
}
if ($includeVersions) {

$sql =
"(SELECT files.file_id, files.current_version_id version_id, '✓' as is_current_version, files.file_name,
files.file_date, files.file_source,
files.file_source_url, files.file_keywords,
".$databaseSyntax->groupConcat($databaseSyntax->identifier('tag_translations.tag_title'), ', ')." as tags
".implode(' ', $fields)."
FROM (:table_files AS files)
LEFT JOIN :table_versions AS versions ON (versions.file_id = files.file_id)
LEFT JOIN :table_tag_links AS links ON (links.link_type = 'media' AND links.link_id = files.file_id)
LEFT JOIN :table_tags AS tags ON (tags.tag_id = links.tag_id)
LEFT JOIN :table_tag_i18n AS tag_translations ON (tag_translations.tag_id = tags.tag_id AND tag_translations.lng_id = tags.default_lng_id)
".implode(' ', $joins).
" GROUP BY files.file_id)
UNION
(SELECT files.file_id, versions.version_id, '' as is_current_version, versions.file_name,
versions.file_date, versions.file_source,
versions.file_source_url, versions.file_keywords,
".$databaseSyntax->groupConcat($databaseSyntax->identifier('tag_translations.tag_title'), ', ')." as tags
".implode(' ', $fields)."
FROM (:table_files AS files)
INNER JOIN :table_versions AS versions ON (versions.file_id = files.file_id AND versions.version_id != files.current_version_id)
LEFT JOIN :table_tag_links AS links ON (links.link_type = 'media' AND links.link_id = files.file_id)
LEFT JOIN :table_tags AS tags ON (tags.tag_id = links.tag_id)
LEFT JOIN :table_tag_i18n AS tag_translations ON (tag_translations.tag_id = tags.tag_id AND tag_translations.lng_id = tags.default_lng_id)
".implode(' ', $joins).
" GROUP BY files.file_id, versions.version_id)";
$columns = [
'file_id' => 'Id',
'version_id' => 'Version',
'is_current_version' => 'Current Version',
'file_name' => 'Name',
'file_date' => 'Date',
'file_source' => 'Source',
'file_source_url' => 'Source URL',
'file_keywords' => 'Keywords'
];
} else {
$sql =
"SELECT files.file_id, files.file_name,
files.file_date, files.file_source,
files.file_source_url, files.file_keywords
files.file_source_url, files.file_keywords,
".$databaseSyntax->groupConcat($databaseSyntax->identifier('tag_translations.tag_title'), ', ')." as tags
".implode(' ', $fields)."
FROM (:table_files AS files)
".implode(' ', $joins);
LEFT JOIN :table_tag_links AS links ON (links.link_type = 'media' AND links.link_id = files.file_id)
LEFT JOIN :table_tags AS tags ON (tags.tag_id = links.tag_id)
LEFT JOIN :table_tag_i18n AS tag_translations ON (tag_translations.tag_id = tags.tag_id AND tag_translations.lng_id = tags.default_lng_id)
".implode(' ', $joins).
" GROUP BY files.file_id";
$columns = [
'file_id' => 'Id',
'file_name' => 'Name',
Expand All @@ -106,15 +147,24 @@ private function exportCSV(array $languages, $includeTags, $includeVersions) {
'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);
if ($includeTags) {
$columns['tags'] = 'Tags';
}
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 = $databaseAccess->prepare($sql);
$statement->addTableName('table_files', Tables::MEDIA_FILES);
if ($includeVersions) {
$statement->addTableName('table_versions', Tables::MEDIA_FILE_VERSIONS);
}
$statement->addTableName('table_tag_links', Tables::TAG_LINKS);
$statement->addTableName('table_tags', Tables::TAGS);
$statement->addTableName('table_tag_i18n', Tables::TAG_TRANSLATIONS);
foreach ($joins as $languageCode => $join) {
$statement->addTableName('table_'.$languageCode, Tables::MEDIA_FILE_TRANSLATIONS);
}
Expand All @@ -126,7 +176,7 @@ private function exportCSV(array $languages, $includeTags, $includeVersions) {
$columns
)
);
$content->callbacks()->onMapField = function($value, $field) {
$content->callbacks()->onMapField = function ($value, $field) {
if ($field === 'file_date') {
return gmdate(DATE_ATOM, $value);
}
Expand Down
2 changes: 2 additions & 0 deletions src/system/Papaya/Content/Tables.php
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,8 @@ class Tables extends \Papaya\Application\BaseObject {

const MEDIA_FILE_TRANSLATIONS = 'mediadb_files_trans';

const MEDIA_FILE_VERSIONS = 'mediadb_files_versions';

const MEDIA_FOLDERS = 'mediadb_folders';

const MEDIA_FOLDER_TRANSLATIONS = 'mediadb_folders_trans';
Expand Down
8 changes: 8 additions & 0 deletions src/system/Papaya/Database/Syntax.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ public function placeholder($name);
*/
public function concat(...$arguments);


/*
* @param string|SQLSource $values
* @param string|SQLSource $separator
* @return string
*/
public function groupConcat($values, $separator = ',');

/**
* @param string|Parameter $text
* @return int
Expand Down
15 changes: 14 additions & 1 deletion src/system/Papaya/Database/Syntax/MySQLSyntax.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,19 @@ function($argument) {
return 'CONCAT('.$serialized.')';
}

/*
* @param string|SQLSource $values
* @param string|SQLSource $separator
*
*/
public function groupConcat($values, $separator = ',') {
return sprintf(
'GROUP_CONCAT(%s SEPARATOR %s)',
$this->compileParameter($values),
$this->compileParameter($separator)
);
}

/**
* @param string|SQLSource $text
* @return int
Expand All @@ -45,7 +58,7 @@ public function like($text) {
}

/**
* @param string|SQLSource haystack
* @param string|SQLSource $haystack
* @param string|SQLSource $needle
* @param int|SQLSource $offset
* @return string
Expand Down
13 changes: 13 additions & 0 deletions src/system/Papaya/Database/Syntax/PostgreSQLSyntax.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,19 @@ function($argument) {
return 'CONCAT('.$serialized.')';
}

/*
* @param string|SQLSource $values
* @param string|SQLSource $separator
*
*/
public function groupConcat($values, $separator = ',') {
return sprintf(
'string_agg(%s, %s)',
$this->compileParameter($values),
$this->compileParameter($separator)
);
}

/**
* @param string|Parameter $text
* @return int
Expand Down
13 changes: 13 additions & 0 deletions src/system/Papaya/Database/Syntax/SQLiteSyntax.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,19 @@ function($argument) {
return '('.$serialized.')';
}

/*
* @param string|SQLSource $values
* @param string|SQLSource $separator
*
*/
public function groupConcat($values, $separator = ',') {
return sprintf(
'GROUP_CONCAT(%s, %s)',
$this->compileParameter($values),
$this->compileParameter($separator)
);
}

/**
* @param string|Parameter $text
* @return int
Expand Down

0 comments on commit 3462341

Please sign in to comment.