CRM-17129 fix - Checkbox custom fields for participants are not not rendered properly
authormonishdeb <monish.deb@webaccessglobal.com>
Wed, 21 Oct 2015 11:15:24 +0000 (16:45 +0530)
committermonishdeb <monish.deb@webaccessglobal.com>
Wed, 21 Oct 2015 20:29:21 +0000 (01:59 +0530)
https://issues.civicrm.org/jira/browse/CRM-17129

CRM/Contact/BAO/Query.php
CRM/Core/BAO/CustomField.php
CRM/Utils/Array.php

index 5659fcd932381e12b07bd373c2ac4c6e59f04222..44fcca890f2592a3564e1e19d3bbedeb13648c94 100644 (file)
@@ -1623,17 +1623,7 @@ class CRM_Contact_BAO_Query {
     if (in_array($id, $legacyElements) && is_array($values)) {
       // prior to 4.7, formValues for some attributes (e.g. group, tag) are stored in array(id1 => 1, id2 => 1),
       // as per the recent Search fixes $values need to be in standard array(id1, id2) format
-      $ids = array_keys($values, 1);
-      if (count($ids) > 1 ||
-        (count($ids) == 1 &&
-          (key($values) > 1 ||
-            is_string(key($values)) ||
-            (key($values) == 1 && $values[1] == 1) // handle (0 => 4), (1 => 1)
-          )
-        )
-      ) {
-        $values = $ids;
-      }
+      CRM_Utils_Array::formatArrayKeys($values);
     }
   }
 
index 419c829a5e049924cdb808f7b5d83c7ada70db50..b5e12552eecdccc2e4fe29bc90982d3bd3f1683e 100644 (file)
@@ -1214,6 +1214,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField {
       case 'AdvMulti-Select':
       case 'Multi-Select':
         if (is_array($value)) {
+          // CRM-12989 fix
+          CRM_Utils_Array::formatArrayKeys($value);
+
           $checkedData = $value;
         }
         else {
index 57c03e139101c7eab2726a0024b73c45fddf1e80..d04dd607f07bdd819252fc41ec426051e3efcce6 100644 (file)
@@ -1018,4 +1018,25 @@ class CRM_Utils_Array {
     return $result;
   }
 
+  /**
+   * Convert array where key(s) holds the actual value and value(s) as 1 into array of actual values
+   *  Ex: array('foobar' => 1, 4 => 1) formatted into array('foobar', 4)
+   *
+   * @param array $array
+   * @return void
+   */
+  public static function formatArrayKeys(&$array) {
+    $keys = array_keys($array, 1);
+    if (count($keys) > 1 ||
+      (count($keys) == 1 &&
+        (key($array) > 1 ||
+          is_string(key($array)) ||
+          (key($array) == 1 && $array[1] == 1) // handle (0 => 4), (1 => 1)
+        )
+      )
+    ) {
+      $array = $keys;
+    }
+  }
+
 }