CRM-14301
authorJKingsnorth <john@johnkingsnorth.co.uk>
Mon, 3 Mar 2014 13:23:15 +0000 (13:23 +0000)
committerJKingsnorth <john@johnkingsnorth.co.uk>
Mon, 3 Mar 2014 13:23:15 +0000 (13:23 +0000)
Add 'is not one of' to report filtering on multiple select fields

CRM/Report/Form.php

index 9f3a2beec8cf86e91d293d70f18f5ef47f59dc9a..68b524b37911a7897799066e4cf18d95120b344b 100644 (file)
@@ -1186,6 +1186,7 @@ class CRM_Report_Form extends CRM_Core_Form {
         // multiple options for a column is stored as ^A{val1}^A{val2}^A
         return array(
           'mhas' => ts('Is one of'),
+          'mnot' => ts('Is not one of'),
         );
 
       default:
@@ -1377,6 +1378,14 @@ class CRM_Report_Form extends CRM_Core_Form {
           $clause = "{$field['dbAlias']} REGEXP '[[:<:]]" . implode('|', $value) . "[[:>:]]'";
         }
         break;
+        
+      case 'mnot':
+        // mnot == multiple is not one of
+        if ($value !== NULL && count($value) > 0) {
+          $sqlOP = $this->getSQLOperator($op);
+          $clause = "( {$field['dbAlias']} NOT REGEXP '[[:<:]]" . implode('|', $value) . "[[:>:]]' OR {$field['dbAlias']} IS NULL )";
+        }
+        break;
 
       case 'sw':
       case 'ew':
@@ -2488,7 +2497,7 @@ WHERE cg.extends IN ('" . implode("','", $this->_customGroupExtends) . "') AND
                     $val[$key] = $options[$valIds];
                   }
                 }
-                $pair[$op] = (count($val) == 1) ? (($op == 'notin') ? ts('Is Not') : ts('Is')) : CRM_Utils_Array::value($op, $pair);
+                $pair[$op] = (count($val) == 1) ? (($op == 'notin' || $op == 'mnot') ? ts('Is Not') : ts('Is')) : CRM_Utils_Array::value($op, $pair);
                 $val       = implode(', ', $val);
                 $value     = "{$pair[$op]} " . $val;
               }