Просмотр исходного кода

#3284 Search by location should treat '-' as space and vice versa

Alex Trofimov 5 лет назад
Родитель
Сommit
6c85fc285b
2 измененных файлов с 11 добавлено и 5 удалено
  1. 10 4
      inc/classes/BxDolDb.php
  2. 1 1
      inc/classes/BxDolMetatagsQuery.php

+ 10 - 4
inc/classes/BxDolDb.php

@@ -1080,14 +1080,20 @@ class BxDolDb extends BxDolFactory implements iBxDolSingleton
      * Array keys are field names and array values are field values.
      * @param $a array
      * @param $sDiv fields separator, by default it is ',', another useful value is ' AND '
+     * @param $sOperator operator for comparision: '=' or 'LIKE'
+     * @param $bWildcardSpaceChars substiture any space and dash characters with single wildcard symbol
      * @return part of SQL query string
      */
-    public function arrayToSQL($a, $sDiv = ',')
+    public function arrayToSQL($a, $sDiv = ',', $sOperator = '=', $bWildcardSpaceChars = false)
     {
+        $aOperators = ['=', 'LIKE', 'like'];
+        $sOperator = in_array($sOperator, $aOperators) ? $sOperator : '=';
         $s = '';
-        foreach($a as $k => $v)
-            $s .= "`{$k}` = " . $this->escape($v) . $sDiv;
-
+        foreach($a as $k => $v) {
+            if ($bWildcardSpaceChars)
+                $v = preg_replace('/[\p{Zs}\p{Cc}\p{Pd}]/', '_', $v);
+            $s .= "`{$k}` {$sOperator} " . $this->escape($v) . $sDiv;
+        }
         return trim($s, $sDiv);
     }
 

+ 1 - 1
inc/classes/BxDolMetatagsQuery.php

@@ -126,7 +126,7 @@ class BxDolMetatagsQuery extends BxDolDb
         }
 
         return array(
-            'where' => $sWhereBounds . (!empty($aWhere) ? ' AND ' . $this->arrayToSQL($aWhere, ' AND ') : ''),
+            'where' => $sWhereBounds . (!empty($aWhere) ? ' AND ' . $this->arrayToSQL($aWhere, ' AND ', 'LIKE', true) : ''),
             'join' => 'INNER JOIN `' . $this->_aObject['table_locations'] . '` AS `tl` ON `' . $sContentTable . '`.`' . $sContentField . '`=`tl`.`object_id`'
         );
     }