* @param string Order by DESC or ASC
* @param string Only fetch files from a specific directory
* @param string Only fetch specific filenames
+ * @param string Only fetch media with specific keyword
* @return array Resultset of images
*/
-function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order = false, $ordermode = false, $directory = '', $filename = '') {
+function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order = false, $ordermode = false, $directory = '', $filename = '', $keywords = '') {
global $serendipity;
$orderfields = serendipity_getImageFields();
$ordermode = 'DESC';
}
+ if ($order == 'name') {
+ $order = 'realname ' . $ordermode . ', name';
+ }
+
if ($limit != 0) {
$limitsql = serendipity_db_limit_sql(serendipity_db_limit($start, $limit));
}
if (!empty($directory)) {
- $directorysql = ' WHERE path LIKE \'' . serendipity_db_escape_string($directory) . '%\' ';
+ $directorysql = ' WHERE i.path LIKE \'' . serendipity_db_escape_string($directory) . '%\' ';
}
if (!empty($filename)) {
+ $fsql = "(i.name like '%" . serendipity_db_escape_string($filename) . "%' OR
+ i.realname like '%" . serendipity_db_escape_string($filename) . "%')";
+ if (empty($directorysql)) {
+ $directorysql = " WHERE $fsql";
+ } else {
+ $directorysql .= " AND $fsql";
+ }
+ }
+
+ if (!is_array($keywords)) {
+ if (!empty($keywords)) {
+ $keywords = explode(';', $keywords);
+ } else {
+ $keywords = array();
+ }
+ }
+
+ foreach($keywords AS $i => $keyword) {
+ $keywords[$i] = serendipity_db_escape_string($keyword);
+ }
+
+ if (count($keywords) > 0) {
+ $fsql = "(mk.property IN ('" . implode("', '", $keywords) . "'))";
if (empty($directorysql)) {
- $directorysql = " WHERE name like '%" . serendipity_db_escape_string($filename) . "%'";
+ $directorysql = " WHERE $fsql";
} else {
- $directorysql .= " AND name like '%" . serendipity_db_escape_string($filename) . "%'";
+ $directorysql .= " AND $fsql";
}
}
);
serendipity_ACL_SQL($cond, false, 'directory');
+ if (count($keywords) > 0) {
+ $cond['joins'] .= "LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS mk
+ ON (mk.mediaid = i.id AND mk.property_group = 'base_keyword')";
+ }
+
+ if (substr($order, 0, 3) === 'bp.') {
+ $cond['orderproperty'] = substr($order, 3);
+ $cond['joins'] .= "LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS bp
+ ON (bp.mediaid = i.id AND bp.property_group = 'base_property' AND bp.property = '{$cond['orderproperty']}')";
+ $cond['orderkey'] = 'bp.value';
+ $order = 'bp.value';
+ } else {
+ $cond['orderkey'] = "''";
+ }
+
if ($serendipity['dbType'] == 'postgres') {
$cond['group'] = '';
$cond['distinct'] = 'DISTINCT';
{$cond['and']}";
- $query = "SELECT {$cond['distinct']} i.id, i.name, i.extension, i.mime, i.size, i.dimensions_width, i.dimensions_height, i.date, i.thumbnail_name, i.authorid, i.path, i.hotlink, i.realname,
+ $query = "SELECT {$cond['distinct']} i.id, {$cond[orderkey]} AS orderkey, i.name, i.extension, i.mime, i.size, i.dimensions_width, i.dimensions_height, i.date, i.thumbnail_name, i.authorid, i.path, i.hotlink, i.realname,
a.realname AS authorname
$basequery
{$cond['group']}
$rs = serendipity_db_query($query, false, 'assoc');
if (!is_array($rs)) {
+ echo '<div>' . $rs . '</div>';
return array();
}
static $debug = false;
$sortParams = array('perpage', 'order', 'ordermode');
- $importParams = array('adminModule', 'htmltarget', 'filename_only', 'textarea', 'subpage');
+ $importParams = array('adminModule', 'htmltarget', 'filename_only', 'textarea', 'subpage', 'keywords');
$extraParems = '';
$filterParams = array('only_path', 'only_filename');
(isset($serendipity['GET']['sortorder']['order']) ? $serendipity['GET']['sortorder']['order'] : false),
(isset($serendipity['GET']['sortorder']['ordermode']) ? $serendipity['GET']['sortorder']['ordermode'] : false),
(isset($serendipity['GET']['only_path']) ? $serendipity['GET']['only_path'] : ''),
- (isset($serendipity['GET']['only_filename']) ? $serendipity['GET']['only_filename'] : '')
+ (isset($serendipity['GET']['only_filename']) ? $serendipity['GET']['only_filename'] : ''),
+ (isset($serendipity['GET']['keywords']) ? $serendipity['GET']['keywords'] : '')
);
$pages = ceil($totalImages / $perPage);
* @return array Array with available, sortable fields
*/
function serendipity_getImageFields() {
- return array(
- 'date' => SORT_ORDER_DATE,
- 'name' => SORT_ORDER_NAME,
- 'authorid' => AUTHOR,
- 'extension' => SORT_ORDER_EXTENSION,
- 'size' => SORT_ORDER_SIZE,
- 'dimensions_width' => SORT_ORDER_WIDTH,
- 'dimensions_height' => SORT_ORDER_HEIGHT
+ global $serendipity;
+
+ $x = array(
+ 'date' => array('desc' => SORT_ORDER_DATE,
+ 'type' => 'date'
+ ),
+
+ 'name' => array('desc' => SORT_ORDER_NAME
+ ),
+
+ 'authorid' => array('desc' => AUTHOR,
+ 'type' => 'authors'
+ ),
+
+ 'extension' => array('desc' => SORT_ORDER_EXTENSION
+ ),
+
+ 'size' => array('desc' => SORT_ORDER_SIZE,
+ 'type' => 'intrange'
+ ),
+
+ 'dimensions_width' => array('desc' => SORT_ORDER_WIDTH,
+ 'type' => 'intrange'
+ ),
+
+ 'dimensions_height' => array('desc' => SORT_ORDER_HEIGHT,
+ 'type' => 'intrange'
+ )
);
+
+ $addProp = explode(';', $serendipity['mediaProperties']);
+ foreach($addProp AS $prop) {
+ $parts = explode(':', $prop);
+ $name = $parts[0];
+ $x['bp.' . $name] = array('desc' => (defined('MEDIA_PROPERTY_' . $name) ? constant('MEDIA_PROPERTY_' . $name) : htmlspecialchars($name)));
+ if (preg_match('@date@i', $name)) {
+ $x['bp.' . $name]['type'] = 'date';
+ }
+ if (preg_match('@length@i', $name)) {
+ $x['bp.' . $name]['type'] = 'intrange';
+ }
+ }
+
+ return $x;
}
/**
'only_path' => $serendipity['GET']['only_path'],
'only_filename' => $serendipity['GET']['only_filename'],
'sortorder' => $serendipity['GET']['sortorder'],
+ 'keywords_selected' => $serendipity['GET']['keywords'],
+ 'filter' => $serendipity['GET']['filter'],
'sort_order' => serendipity_getImageFields(),
'sort_row_interval' => array(8, 16, 50, 100),
'nr_files' => count($file),
+ 'keywords' => explode(';', $serendipity['mediaKeywords']),
);
$media = array_merge($media, $smarty_vars);
+<script type="text/javascript" language="javascript">
+ function showFilters() {ldelim}
+ s = document.getElementById('moreFilter').style;
+ if (s.display == 'none') {ldelim}
+ s.display = 'block';
+ {rdelim} else {ldelim}
+ s.display = 'none';
+ {rdelim}
+ {rdelim}
+
+ function AddKeyword(keyword) {ldelim}
+ s = document.getElementById('keyword_input').value;
+ document.getElementById('keyword_input').value = (s != '' ? s + ';' : '') + keyword;
+ {rdelim}
+</script>
+
<form style="display: inline; margin: 0px; padding: 0px;" method="get" action="?">
{$media.token}
{$media.form_hidden}
<table class="serendipity_admin_filters" width="100%">
+ <colgroup>
+ <col width="13%" />
+ <col width="20%" />
+
+ <col width="13%" />
+ <col width="20%" />
+
+ <col width="13%" />
+ <col width="20%" />
+ </colgroup>
<tr>
<td class="serendipity_admin_filters_headline" colspan="6"><strong>{$CONST.FILTERS}</strong> - {$CONST.FIND_MEDIA}</td>
</tr>
</select>
</td>
<td>{$CONST.SORT_ORDER_NAME}</td>
- <td colspan="3"><input type="text" name="serendipity[only_filename]" value="{$media.only_filename|@escape}" /></td>
+ <td><input type="text" name="serendipity[only_filename]" value="{$media.only_filename|@escape}" /></td>
+ <td colspan="2"><a href="#" class="serendipityPrettyButton" onclick="showFilters(); return false">» {$CONST.FILTERS}</a></td>
</tr>
+ <tr>
+ <td colspan="6">
+ <div class="serendipity_pluginlist_section" style="height: auto; padding: 1px; margin-top: 5px; display: none" id="moreFilter">
+ <table width="100%" cellpadding="5" cellspacing="0" border="0">
+ <tr>
+ <td valign="top"><span style="white-space: nowrap">{$CONST.MEDIA_KEYWORDS}</span></td>
+ <td><input id="keyword_input" type="text" name="serendipity[keywords]" value="{$media.keywords_selected|@escape}" /></td>
+ <td width="98%">
+ {foreach from=$media.keywords item="keyword"}
+ <a href="#" onclick="AddKeyword('{$keyword|@escape}'); return false">{$keyword|@escape}</a>
+ {/foreach}
+ </td>
+ </tr>
+ {foreach from=$media.sort_order item="so_val" key="so_key"}
+ <tr>
+ <td valign="top"><span style="white-space: nowrap">{$so_val.desc}</span></td>
+ <td><input type="text" name="serendipity[filter][{$so_key}]" value="{$media.filter[$so_key]|@escape}" /></td>
+ <td> </td>
+ </td>
+ </tr>
+ {/foreach}
+ </table>
+ </div>
+ <script type="text/javascript" language="javascript">
+ if (document.getElementById('keyword_input') != '') showFilters();
+ </script>
+ </td>
+ </tr>
+
<tr>
<td class="serendipity_admin_filters_headline" colspan="6"><strong>{$CONST.SORT_ORDER}</strong></td>
</tr>
<td>
<select name="serendipity[sortorder][order]">
{foreach from=$media.sort_order item="so_val" key="so_key"}
- <option value="{$so_key}" {if $media.sortorder.order == $so_key}selected="selected"{/if}>{$so_val}</option>
+ <option value="{$so_key}" {if $media.sortorder.order == $so_key}selected="selected"{/if}>{$so_val.desc}</option>
{/foreach}
</select>
</td>