Fix for IN and NOT IN operators on Search Builder validation
authormonishdeb <monish.deb@webaccessglobal.com>
Thu, 28 May 2015 08:53:37 +0000 (14:23 +0530)
committermonishdeb <monish.deb@webaccessglobal.com>
Thu, 4 Jun 2015 22:18:38 +0000 (03:48 +0530)
CRM/Contact/BAO/Query.php
CRM/Contact/Form/Search/Builder.php
CRM/Core/BAO/Mapping.php

index b049465f0015f52079c2261a5fbce80c5b2c0656..1ed08a1ae38ee3ab7db3451597bc6351b99d8070 100644 (file)
@@ -5047,16 +5047,18 @@ SELECT COUNT( conts.total_amount ) as cancel_count,
         $op = key($value);
         $value = $value[$op];
       }
-        print_r(strpos($op, 'IN') );
 
-      if ($op == 'IN' || $op == 'NOT IN') {
+      if (strstr($op, 'IN')) {
+        $format = array();
         foreach ($value as &$date) {
           $date = CRM_Utils_Date::processDate($date);
           if (!$appendTimeStamp) {
             $date = substr($date, 0, 8);
           }
+          $format[] = CRM_Utils_Date::customFormat($date);
         }
         $date = "('" . implode("','", $value) . "')";
+        $format = implode(', ', $format);
       }
       else {
         $date = CRM_Utils_Date::processDate($value);
@@ -5064,6 +5066,7 @@ SELECT COUNT( conts.total_amount ) as cancel_count,
           $date = substr($date, 0, 8);
         }
         $date = "'$date'";
+        $format = CRM_Utils_Date::customFormat($date);
       }
 
       if ($date) {
@@ -5075,7 +5078,6 @@ SELECT COUNT( conts.total_amount ) as cancel_count,
       $this->_tables[$tableName] = $this->_whereTables[$tableName] = 1;
 
       $op = CRM_Utils_Array::value($op, CRM_Core_SelectValues::getSearchBuilderOperators(), $op);
-      $format = CRM_Utils_Date::customFormat($date);
       $this->_qill[$grouping][] = "$fieldTitle $op \"$format\"";
     }
   }
index 142281ac0dc960a6ca1c6fa3b94c4bb1f65a2433..7fab36c8c3a08dadf853b7c9b61f02c39930fc39 100644 (file)
@@ -229,8 +229,14 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
             $fldValue = CRM_Utils_Array::value($fldName, $fields);
             $fldType = CRM_Utils_Array::value('type', $fldValue);
             $type = CRM_Utils_Type::typeToString($fldType);
+
+            if (strstr($v[1], 'IN')) {
+              if (empty($v[2])) {
+                $errorMsg["value[$v[3]][$v[4]]"] = ts("Please enter a value.");
+              }
+            }
             // Check Empty values for Integer Or Boolean Or Date type For operators other than IS NULL and IS NOT NULL.
-            if (!in_array($v[1],
+            elseif (!in_array($v[1],
               array('IS NULL', 'IS NOT NULL', 'IS EMPTY', 'IS NOT EMPTY'))
             ) {
               if ((($type == 'Int' || $type == 'Boolean') && !is_array($v[2]) && !trim($v[2])) && $v[2] != '0') {
@@ -244,7 +250,7 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
 
           if ($type && empty($errorMsg)) {
             // check for valid format while using IN Operator
-            if ($v[1] == 'IN') {
+            if (strstr($v[1], 'IN')) {
               if (!is_array($v[2])) {
                 $inVal = trim($v[2]);
                 //checking for format to avoid db errors
@@ -265,7 +271,15 @@ class CRM_Contact_Form_Search_Builder extends CRM_Contact_Form_Search {
                 $parenValues = array();
                 $parenValues = is_array($v[2]) ? $v[2] : explode(',', trim($inVal, "(..)"));
                 foreach ($parenValues as $val) {
-                  $val = trim($val);
+                  if ($type == 'Date' || $type == 'Timestamp') {
+                    $val = CRM_Utils_Date::processDate($val);
+                    if ($type == 'Date') {
+                      $val = substr($val, 0, 8);
+                    }
+                  }
+                  else {
+                    $val = trim($val);
+                  }
                   if (!$val && $val != '0') {
                     $errorMsg["value[$v[3]][$v[4]]"] = ts("Please enter the values correctly.");
                   }
index 2ea67c4becb7237ff44a6f45721681bd6cd11d4e..52d5581114b9ec4a2afda7d6e7d2e9d61a59c8ed 100644 (file)
@@ -1061,10 +1061,8 @@ class CRM_Core_BAO_Mapping extends CRM_Core_DAO_Mapping {
           }
 
           // CRM-14983: verify if values are comma separated convert to array
-          if (!is_array($value) && (strpos($value, ',') !== FALSE || strstr($value, '(')) && empty($isCustomField) && $params['operator'][$key][$k] == 'IN') {
-            preg_match('#\((.*?)\)#', $value, $match);
-            $tmpArray = explode(',', $match[1]);
-            $value = array_combine(array_values($tmpArray), array_values($tmpArray));
+          if (strstr($params['operator'][$key][$k], 'IN') && !is_array($value) && (strpos($value, ',') !== FALSE || strstr($value, '(') || !empty($value)) && empty($isCustomField)) {
+            $value = explode(',', str_replace(array('(', ')'), '', $value));
           }
 
           if ($row) {