* @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 = '', $keywords = '') {
+function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order = false, $ordermode = false, $directory = '', $filename = '', $keywords = '', $filter = array()) {
global $serendipity;
$orderfields = serendipity_getImageFields();
if (empty($order) || !isset($orderfields[$order])) {
- $order = 'date';
+ $order = 'i.date';
+ }
+
+ if (!is_array($filter)) {
+ $filter = array();
}
if (empty($ordermode) || ($ordermode != 'DESC' && $ordermode != 'ASC')) {
$limitsql = serendipity_db_limit_sql(serendipity_db_limit($start, $limit));
}
+ $where_sql = "WHERE 1 \n";
if (!empty($directory)) {
- $directorysql = ' WHERE i.path LIKE \'' . serendipity_db_escape_string($directory) . '%\' ';
+ $where_sql .= " AND i.path LIKE '" . serendipity_db_escape_string($directory) . "'%'\n";
}
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";
- }
+ $where_sql .= " AND (i.name like '%" . serendipity_db_escape_string($filename) . "%' OR
+ i.realname like '%" . serendipity_db_escape_string($filename) . "%')\n";
}
if (!is_array($keywords)) {
$keywords[$i] = serendipity_db_escape_string($keyword);
}
+ $join_properties = $join_keywords = $join_filterproperties = false;
if (count($keywords) > 0) {
- $fsql = "(mk.property IN ('" . implode("', '", $keywords) . "'))";
- if (empty($directorysql)) {
- $directorysql = " WHERE $fsql";
+ $where_sql .= " AND (mk.property IN ('" . implode("', '", $keywords) . "'))\n";
+ $join_keywords = true;
+ }
+
+ foreach($filter AS $f => $fval) {
+ if (!isset($orderfields[$f]) || empty($fval)) {
+ continue;
+ }
+
+ if (is_array($fval)) {
+ if (empty($fval['from']) || empty($fval['to'])) {
+ continue;
+ }
+
+ if ($orderfields[$f]['type'] == 'date') {
+ $fval['from'] = serendipity_convertToTimestamp(trim($fval['from']));
+ $fval['to'] = serendipity_convertToTimestamp(trim($fval['to']));
+ }
+
+ if (substr($f, 0, 3) === 'bp.') {
+ $realf = substr($f, 3);
+ $where_sql .= " AND (bp2.property = '$realf' AND bp2.value >= " . (int)$fval['from'] . " AND bp2.value <= " . (int)$fval['to'] . ")\n";
+ } else {
+ $where_sql .= " AND ($f >= " . (int)$fval['from'] . " AND $f <= " . (int)$fval['to'] . ")\n";
+ }
+ } elseif ($orderfields[$f]['type'] == 'int') {
+ if (substr($f, 0, 3) === 'bp.') {
+ $realf = substr($f, 3);
+ $where_sql .= " AND (bp2.property = '$realf' AND bp2.value = '" . serendipity_db_escape_string(trim($fval)) . "')\n";
+ } else {
+ $where_sql .= " AND ($f = '" . serendipity_db_escape_string(trim($fval)) . "')\n";
+ }
} else {
- $directorysql .= " AND $fsql";
+ if (substr($f, 0, 3) === 'bp.') {
+ $realf = substr($f, 3);
+ $where_sql .= " AND (bp2.property = '$realf' AND bp2.value LIKE '%" . serendipity_db_escape_string(trim($fval)) . "%')\n";
+ } else {
+ $where_sql .= " AND ($f LIKE '%" . serendipity_db_escape_string(trim($fval)) . "%')\n";
+ }
}
+ $join_filterproperties = true;
}
- $perm = $permsql = '';
if (isset($serendipity['authorid']) && !serendipity_checkPermission('adminImagesViewOthers')) {
- $perm = " (i.authorid = 0 OR i.authorid = " . (int)$serendipity['authorid'] . ")";
- if (empty($directorysql)) {
- $directorysql = " WHERE $perm";
- } else {
- $directorysql .= " AND $perm";
- }
- $permsql = " WHERE $perm";
+ $where_sql .= " AND (i.authorid = 0 OR i.authorid = " . (int)$serendipity['authorid'] . ")\n";
}
$cond = array(
- 'and' => $directorysql
+ 'and' => $where_sql
);
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 ($join_keywords) {
+ $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS mk
+ ON (mk.mediaid = i.id AND mk.property_group = 'base_keyword')\n";
}
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';
+ $join_properties = true;
} else {
$cond['orderkey'] = "''";
}
+ if ($join_properties) {
+ $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS bp
+ ON (bp.mediaid = i.id AND bp.property_group = 'base_property' AND bp.property = '{$cond['orderproperty']}')\n";
+ }
+
+ if ($join_filterproperties) {
+ $cond['joins'] .= "\n LEFT OUTER JOIN {$serendipity['dbPrefix']}mediaproperties AS bp2
+ ON (bp2.mediaid = i.id AND bp2.property_group = 'base_property')\n";
+ }
+
if ($serendipity['dbType'] == 'postgres') {
$cond['group'] = '';
$cond['distinct'] = 'DISTINCT';
(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']['keywords']) ? $serendipity['GET']['keywords'] : '')
+ (isset($serendipity['GET']['keywords']) ? $serendipity['GET']['keywords'] : ''),
+ (isset($serendipity['GET']['filter']) ? $serendipity['GET']['filter'] : '')
);
$pages = ceil($totalImages / $perPage);
global $serendipity;
$x = array(
- 'date' => array('desc' => SORT_ORDER_DATE,
+ 'i.date' => array('desc' => SORT_ORDER_DATE,
'type' => 'date'
),
- 'name' => array('desc' => SORT_ORDER_NAME
+ 'i.name' => array('desc' => SORT_ORDER_NAME
),
- 'authorid' => array('desc' => AUTHOR,
+ 'i.authorid' => array('desc' => AUTHOR,
'type' => 'authors'
),
- 'extension' => array('desc' => SORT_ORDER_EXTENSION
+ 'i.extension' => array('desc' => SORT_ORDER_EXTENSION
),
- 'size' => array('desc' => SORT_ORDER_SIZE,
+ 'i.size' => array('desc' => SORT_ORDER_SIZE,
'type' => 'intrange'
),
- 'dimensions_width' => array('desc' => SORT_ORDER_WIDTH,
+ 'i.dimensions_width' => array('desc' => SORT_ORDER_WIDTH,
'type' => 'intrange'
),
- 'dimensions_height' => array('desc' => SORT_ORDER_HEIGHT,
+ 'i.dimensions_height' => array('desc' => SORT_ORDER_HEIGHT,
'type' => 'intrange'
)
);
if (preg_match('@length@i', $name)) {
$x['bp.' . $name]['type'] = 'intrange';
}
+ if (preg_match('@dpi@i', $name)) {
+ $x['bp.' . $name]['type'] = 'int';
+ }
}
return $x;
if (!$is_edit) {
$type = 'readonly';
}
- $val =& $props['base_property'][$parts[0]];
+ $val =& serendipity_mediaTypeCast($parts[0], $props['base_property'][$parts[0]], true);
+
$propkey = htmlspecialchars($parts[0]) . $idx;
$show[$idx]['base_property'][$propkey] = array(
$smarty_vars);
}
+/**
+ * Tries to auto-convert specific fields into DB-storable values
+ *
+ * @param string The keyname
+ * @param string The value
+ * @param string Invert?
+ * @return array array('image_id') holding the last created thumbnail for immediate processing
+ *
+ */
+function serendipity_mediaTypeCast($key, $val, $invert = false) {
+ if (stristr($key, 'date') !== FALSE) {
+ if ($invert && is_int($val)) {
+ return serendipity_strftime(DATE_FORMAT_SHORT, $val, false);
+ } elseif ($invert === false) {
+ $tmp = strtotime($val);
+ if ($tmp !== FALSE && $tmp > 1) {
+ return $tmp;
+ }
+ }
+ } elseif ($invert && stristr($key, 'length') !== FALSE) {
+ $tmp = '';
+
+ $hours = intval(intval($val) / 3600);
+ $minutes = intval(($val / 60) % 60);
+ $seconds = intval($val % 60);
+ $mseconds = intval((($val - $seconds) * 100) % 100);
+
+ $tmp .= str_pad($hours, 2, '0', STR_PAD_LEFT) . ':';
+ $tmp .= str_pad($minutes, 2, '0', STR_PAD_LEFT). ':';
+ $tmp .= str_pad($seconds, 2, '0', STR_PAD_LEFT) . '.';
+ $tmp .= str_pad($mseconds, 2, '0', STR_PAD_LEFT);
+
+ return $tmp;
+ } elseif ($invert === false && preg_match('@^([0-9]+):([0-9]+):([0-9]+).([0-9]+)$@i', $val, $m)) {
+ $tmp = ($m[1] * 3600)
+ + ($m[2] * 60)
+ + ($m[3])
+ + ($m[4] / 100);
+ return $tmp;
+ }
+
+ return $val;
+}
+
/**
* Inserts the submitted properties of uploaded media items
*
AND property_group = 'base_property'");
foreach($media AS $key => $val) {
if ($key == 'image_id') continue;
+ $val = serendipity_mediaTypeCast($key, $val);
$q = sprintf("INSERT INTO {$serendipity['dbPrefix']}mediaproperties
(mediaid, property_group, property_subgroup, property, value)
VALUES (%d, 'base_property', '', '%s', '%s')",
property_group = 'base_metadata'");
foreach($s9y_img['metadata'] AS $maingroup => $items) {
foreach($items AS $key => $val) {
+ $val = serendipity_mediaTypeCast($key, $val);
$q = sprintf("INSERT INTO {$serendipity['dbPrefix']}mediaproperties
(mediaid, property_group, property_subgroup, property, value)
VALUES (%d, 'base_metadata', '%s', '%s', '%s')",
'keywords_selected' => $serendipity['GET']['keywords'],
'filter' => $serendipity['GET']['filter'],
'sort_order' => serendipity_getImageFields(),
+ 'authors' => serendipity_fetchUsers(),
'sort_row_interval' => array(8, 16, 50, 100),
'nr_files' => count($file),
'keywords' => explode(';', $serendipity['mediaKeywords']),