diff options
Diffstat (limited to 'app/Query/Media.php')
| -rw-r--r-- | app/Query/Media.php | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/app/Query/Media.php b/app/Query/Media.php new file mode 100644 index 0000000000..cd1e41fb95 --- /dev/null +++ b/app/Query/Media.php @@ -0,0 +1,143 @@ +<?php +namespace Webtrees; + +/** + * webtrees: online genealogy + * Copyright (C) 2015 webtrees development team + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/** + * Class WT_Query_Media - generate lists of files for admin_media.php + * + * @package webtrees + * @copyright (c) 2014 webtrees development team + * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 + */ +class WT_Query_Media { + /** + * Generate a list of all the folders in the current tree - for the media list. + * + * @return string[] + */ + public static function folderList() { + $folders = Database::prepare( + "SELECT SQL_CACHE LEFT(m_filename, CHAR_LENGTH(m_filename) - CHAR_LENGTH(SUBSTRING_INDEX(m_filename, '/', -1))) AS media_path" . + " FROM `##media`" . + " WHERE m_file = ?" . + " AND m_filename NOT LIKE 'http://%'" . + " AND m_filename NOT LIKE 'https://%'" . + " GROUP BY 1" . + " ORDER BY 1" + )->execute(array(WT_GED_ID))->fetchOneColumn(); + + if (!$folders || reset($folders) != '') { + array_unshift($folders, ''); + } + + return array_combine($folders, $folders); + } + + /** + * Generate a list of all folders from all the trees - for the media admin. + * + * @return array + */ + public static function folderListAll() { + $folders = Database::prepare( + "SELECT SQL_CACHE LEFT(m_filename, CHAR_LENGTH(m_filename) - CHAR_LENGTH(SUBSTRING_INDEX(m_filename, '/', -1))) AS media_path" . + " FROM `##media`" . + " WHERE m_filename NOT LIKE 'http://%'" . + " AND m_filename NOT LIKE 'https://%'" . + " GROUP BY 1" . + " ORDER BY 1" + )->execute()->fetchOneColumn(); + + if ($folders) { + return array_combine($folders, $folders); + } else { + return array(); + } + } + + /** + * Generate a filtered, sourced, privacy-checked list of media objects - for the media list. + * + * @param string $folder folder to search + * @param string $subfolders either "include" or "exclude" + * @param string $sort either "file" or "title" + * @param string $filter optional search string + * + * @return Media[] + * @throws Exception + */ + public static function mediaList($folder, $subfolders, $sort, $filter) { + // All files in the folder, plus external files + $sql = + "SELECT m_id AS xref, m_file AS gedcom_id, m_gedcom AS gedcom" . + " FROM `##media`" . + " WHERE m_file=?"; + $args = array( + WT_GED_ID, + ); + + // Only show external files when we are looking at the root folder + if ($folder == '') { + $sql_external = " OR m_filename LIKE 'http://%' OR m_filename LIKE 'https://%'"; + } else { + $sql_external = ""; + } + + // Include / exclude subfolders (but always include external) + switch ($subfolders) { + case 'include': + $sql .= " AND (m_filename LIKE CONCAT(?, '%') $sql_external)"; + $args[] = Filter::escapeLike($folder); + break; + case 'exclude': + $sql .= " AND (m_filename LIKE CONCAT(?, '%') AND m_filename NOT LIKE CONCAT(?, '%/%') $sql_external)"; + $args[] = Filter::escapeLike($folder); + $args[] = Filter::escapeLike($folder); + break; + default: + throw new \Exception('Bad argument (subfolders=' . $subfolders . ') in WT_Query_Media::mediaList()'); + } + + // Apply search terms + if ($filter) { + $sql .= " AND (SUBSTRING_INDEX(m_filename, '/', -1) LIKE CONCAT('%', ?, '%') OR m_titl LIKE CONCAT('%', ?, '%'))"; + $args[] = Filter::escapeLike($filter); + $args[] = Filter::escapeLike($filter); + } + + switch ($sort) { + case 'file': + $sql .= " ORDER BY m_filename"; + break; + case 'title': + $sql .= " ORDER BY m_titl"; + break; + default: + throw new \Exception('Bad argument (sort=' . $sort . ') in WT_Query_Media::mediaList()'); + } + + $rows = Database::prepare($sql)->execute($args)->fetchAll(); + $list = array(); + foreach ($rows as $row) { + $media = Media::getInstance($row->xref, $row->gedcom_id, $row->gedcom); + if ($media->canShow()) { + $list[] = $media; + } + } + return $list; + } +} |
