]> git.mjollnir.org Git - s9y.git/commitdiff
Media search/filter
authorgarvinhicking <garvinhicking>
Wed, 19 Apr 2006 17:07:57 +0000 (17:07 +0000)
committergarvinhicking <garvinhicking>
Wed, 19 Apr 2006 17:07:57 +0000 (17:07 +0000)
docs/NEWS
include/admin/images.inc.php
include/functions_images.inc.php
templates/default/admin/media_items.tpl
templates/default/admin/media_pane.tpl

index ed32e251e4f3dc85de25fd536571434bf633cf02..3778be164f7e869fd6af2839390f88d9fd41f81a 100644 (file)
--- a/docs/NEWS
+++ b/docs/NEWS
@@ -31,13 +31,14 @@ Version 1.1-alpha4()
            already exists
          - Restrict file upload by size/dimensions via configuration
            options
+         - Sort media files by all custom property fields
+         - Enhanced media filter for keywords
 
      TODO:
          - Search/Filter for specific properties/keywords:
-            Sort by: Title, Filename, Creation date, Upload date,
-            file type, author
-            Search by: Title, Creation date (From-To), Filetype,
-            Comment(s), Keyword, Author
+            Search by: custom property fields. Evaluate input data from
+            serendipity_getImageFields(): 'date', 'intrange', 'text'
+           Make sure timestamps are saved as UNIX timestamp always!
 
          - New option for image_Selector to save a specific sized version
            (?fid=XXX&targetSize=XX)
index ee16f869d7e89b1f88e841482a258c042f530664..ca59240ac82578f9daa35590c18fa3ae4dc1ce0a 100644 (file)
@@ -729,8 +729,7 @@ switch ($serendipity['GET']['adminAction']) {
             }
         }
     //-->
-    </script>
-
+</script>
 
 <?php
         if (!isset($serendipity['thumbPerPage'])) {
index 5d60fec6bbd0a875c889c10da29e8833bc487efd..3a06068d3ce2f0d810f54ea0da4f327e5c161f13 100644 (file)
@@ -35,9 +35,10 @@ function serendipity_isActiveFile($file) {
  * @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();
@@ -49,19 +50,46 @@ function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order
         $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";
         }
     }
 
@@ -81,6 +109,21 @@ function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order
     );
     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';
@@ -96,7 +139,7 @@ function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order
 
                        {$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']}
@@ -105,6 +148,7 @@ function serendipity_fetchImagesFromDatabase($start=0, $limit=0, &$total, $order
     $rs = serendipity_db_query($query, false, 'assoc');
 
     if (!is_array($rs)) {
+        echo '<div>' . $rs . '</div>';
         return array();
     }
 
@@ -1175,7 +1219,7 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa
     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');
 
@@ -1336,7 +1380,8 @@ function serendipity_displayImageList($page = 0, $lineBreak = NULL, $manage = fa
                                   (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);
@@ -1649,15 +1694,50 @@ function serendipity_getimagesize($file, $ft_mime = '', $suf = '') {
  * @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;
 }
 
 /**
@@ -2331,9 +2411,12 @@ function serendipity_showMedia(&$file, &$paths, $url = '', $manage = false, $lin
         '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);
index 672bece5db5dcd49c0620c44ee453a4173c54b41..5e31eaba95465f1fcdb850384a5101f697fe6100 100644 (file)
@@ -4,7 +4,7 @@
     {/if}
 
     {if NOT $media.manage}
-        {$file.preview}
+        {$file.preview}{if $file.orderkey != ''}: {$file.orderkey|@escape}{/if}
     {else}
         <table width="100%" border="0" cellspacing="0" cellpadding="3">
             <tr>
                 {/if}
                 </td>
                 <td colspan="2">
-                    <div class="serendipity_media_filename" style="font-weight: bold; font-size: 8pt">{$file.realname}</div>
+                    <div class="serendipity_media_filename" style="font-weight: bold; font-size: 8pt">{$file.realname}{if $file.orderkey != ''}: {$file.orderkey|@escape}{/if}</div>
                     <div class="serendipity_media_author"   style="font-size: 8pt">{if $file.authorid != 0}{$file.authorname}{else}<br />{/if}</div>
                 </td>
             </tr>
             <tr>
                 <td align="center" colspan="2">
                     {$file.preview}
-                    {if $file.realname != $file.diskname} [{$file.diskname}]{/if}
                 </td>
             </tr>
             <tr>
@@ -39,7 +38,8 @@
                     {$CONST.ORIGINAL_SHORT}: {$file.dimensions_width}x{$file.dimensions_height},
                     {$CONST.THUMBNAIL_SHORT}: {$file.dim.0}x{$file.dim.1}<br />
                     {/if}
-                    {$file.nice_size}kb
+                    {$file.nice_size}kb {if $file.realname != $file.diskname} [{$file.diskname}]{/if}
+
                 {/if}
                 </td>
             </tr>
index da263904ab3fe679ca857a4f3b090e500da9780e..ff9a3d319ff6ef2e959fa54bf8d13cc6ad1e11ab 100644 (file)
@@ -1,7 +1,33 @@
+<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">&raquo; {$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>&nbsp;</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>
@@ -25,7 +81,7 @@
             <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>