aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorplegall <plg@piwigo.org>2016-02-15 14:50:57 +0100
committerplegall <plg@piwigo.org>2016-02-15 14:50:57 +0100
commite03dff12b15fde7f5326e1e3fe9dd42102b55fe2 (patch)
treec452a36d22d4d4b2a10d4a4e185caada9b3618d0
parenta6fbaf69c71c3b39666a6323c4c6bbb7cbb98310 (diff)
parent8897e75fc28679b5003b8abf9ecdb50234c9199f (diff)
Merge branch 'feature/355-search-by-words-on-tags'
-rw-r--r--include/functions_search.inc.php47
-rw-r--r--search.php5
-rw-r--r--themes/default/template/search.tpl3
3 files changed, 50 insertions, 5 deletions
diff --git a/include/functions_search.inc.php b/include/functions_search.inc.php
index 69c57faa7..d8df4eea8 100644
--- a/include/functions_search.inc.php
+++ b/include/functions_search.inc.php
@@ -90,7 +90,7 @@ function get_sql_search_clause($search)
}
}
- if (isset($search['fields']['allwords']))
+ if (isset($search['fields']['allwords']) and count($search['fields']['allwords']['fields']) > 0)
{
$fields = array('file', 'name', 'comment');
@@ -98,7 +98,7 @@ function get_sql_search_clause($search)
{
$fields = array_intersect($fields, $search['fields']['allwords']['fields']);
}
-
+
// in the OR mode, request bust be :
// ((field1 LIKE '%word1%' OR field2 LIKE '%word1%')
// OR (field1 LIKE '%word2%' OR field2 LIKE '%word2%'))
@@ -199,7 +199,10 @@ function get_sql_search_clause($search)
*/
function get_regular_search_results($search, $images_where='')
{
- global $conf;
+ global $conf, $logger;
+
+ $logger->debug(__FUNCTION__, 'search', $search);
+
$forbidden = get_sql_condition_FandF(
array
(
@@ -213,12 +216,35 @@ function get_regular_search_results($search, $images_where='')
$items = array();
$tag_items = array();
+ if (isset($search['fields']['search_in_tags']))
+ {
+ $word_clauses = array();
+ foreach ($search['fields']['allwords']['words'] as $word)
+ {
+ $word_clauses[] = "name LIKE '%".$word."%'";
+ }
+
+ $query = '
+SELECT
+ id
+ FROM '.TAGS_TABLE.'
+ WHERE '.implode(' OR ', $word_clauses).'
+;';
+ $tag_ids = query2array($query, null, 'id');
+
+ $search_in_tags_items = get_image_ids_for_tags($tag_ids, 'OR');
+
+ $logger->debug(__FUNCTION__.' '.count($search_in_tags_items).' items in $search_in_tags_items');
+ }
+
if (isset($search['fields']['tags']))
{
$tag_items = get_image_ids_for_tags(
$search['fields']['tags']['words'],
$search['fields']['tags']['mode']
);
+
+ $logger->debug(__FUNCTION__.' '.count($tag_items).' items in $tag_items');
}
$search_clause = get_sql_search_clause($search);
@@ -237,6 +263,18 @@ SELECT DISTINCT(id)
$query .= $forbidden.'
'.$conf['order_by'];
$items = array_from_query($query, 'id');
+
+ $logger->debug(__FUNCTION__.' '.count($items).' items in $items');
+ }
+
+ if (isset($search_in_tags_items))
+ {
+ $items = array_unique(
+ array_merge(
+ $items,
+ $search_in_tags_items
+ )
+ );
}
if ( !empty($tag_items) )
@@ -244,7 +282,7 @@ SELECT DISTINCT(id)
switch ($search['mode'])
{
case 'AND':
- if (empty($search_clause))
+ if (empty($search_clause) and !isset($search_in_tags_items))
{
$items = $tag_items;
}
@@ -254,7 +292,6 @@ SELECT DISTINCT(id)
}
break;
case 'OR':
- $before_count = count($items);
$items = array_unique(
array_merge(
$items,
diff --git a/search.php b/search.php
index 9d33c7b3c..f8f0a1949 100644
--- a/search.php
+++ b/search.php
@@ -72,6 +72,11 @@ if (isset($_POST['submit']))
'mode' => $_POST['mode'],
'fields' => $_POST['fields'],
);
+
+ if (isset($_POST['search_in_tags']))
+ {
+ $search['fields']['search_in_tags'] = true;
+ }
}
if (isset($_POST['tags']))
diff --git a/themes/default/template/search.tpl b/themes/default/template/search.tpl
index 1a12e9832..4129746bd 100644
--- a/themes/default/template/search.tpl
+++ b/themes/default/template/search.tpl
@@ -47,6 +47,9 @@ jQuery(document).ready(function() {
<label><input type="checkbox" name="fields[]" value="name" checked="checked"> {'Photo title'|translate}</label>
<label><input type="checkbox" name="fields[]" value="comment" checked="checked"> {'Photo description'|translate}</label>
<label><input type="checkbox" name="fields[]" value="file" checked="checked"> {'File name'|translate}</label>
+{if isset($TAGS)}
+ <label><input type="checkbox" name="search_in_tags" value="tags"> {'Tags'|translate}</label>
+{/if}
</p>
</fieldset>