Fix enotice when updating a custom group with is_multiple = 1
authoreileen <emcnaughton@wikimedia.org>
Fri, 1 Jun 2018 04:26:03 +0000 (16:26 +1200)
committereileen <emcnaughton@wikimedia.org>
Fri, 1 Jun 2018 04:26:03 +0000 (16:26 +1200)
When updating a group with is_multiple = 1 there should be no change unless ['is_multiple']
is set but existing code is pretty confusing.

CRM/Core/BAO/CustomGroup.php
tests/phpunit/api/v3/CustomGroupTest.php

index 282bc2e7db7f9088e20b01987a0f840984f637f8..6558987c848bf1064690e889beb2f3c74dc4b8a3 100644 (file)
@@ -136,23 +136,24 @@ class CRM_Core_BAO_CustomGroup extends CRM_Core_DAO_CustomGroup {
       $params['max_multiple'] >= '0'
     ) ? $params['max_multiple'] : 'null' : 'null';
 
-    $tableName = $oldTableName = NULL;
+    $tableName = $tableNameNeedingIndexUpdate = NULL;
     if (isset($params['id'])) {
       $group->id = $params['id'];
-      //check whether custom group was changed from single-valued to multiple-valued
-      $isMultiple = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup',
-        $params['id'],
-        'is_multiple'
-      );
 
-      if ((!empty($params['is_multiple']) || $isMultiple) &&
-        ($params['is_multiple'] != $isMultiple)
-      ) {
-        $oldTableName = CRM_Core_DAO::getFieldValue(
-          'CRM_Core_DAO_CustomGroup',
+      if (isset($params['is_multiple'])) {
+        //check whether custom group was changed from single-valued to multiple-valued
+        $isMultiple = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomGroup',
           $params['id'],
-          'table_name'
+          'is_multiple'
         );
+
+        if ($params['is_multiple'] != $isMultiple) {
+          $tableNameNeedingIndexUpdate = CRM_Core_DAO::getFieldValue(
+            'CRM_Core_DAO_CustomGroup',
+            $params['id'],
+            'table_name'
+          );
+        }
       }
     }
     else {
@@ -202,8 +203,8 @@ class CRM_Core_BAO_CustomGroup extends CRM_Core_DAO_CustomGroup {
       // now create the table associated with this group
       self::createTable($group);
     }
-    elseif ($oldTableName) {
-      CRM_Core_BAO_SchemaHandler::changeUniqueToIndex($oldTableName, CRM_Utils_Array::value('is_multiple', $params));
+    elseif ($tableNameNeedingIndexUpdate) {
+      CRM_Core_BAO_SchemaHandler::changeUniqueToIndex($tableNameNeedingIndexUpdate, CRM_Utils_Array::value('is_multiple', $params));
     }
 
     if (CRM_Utils_Array::value('overrideFKConstraint', $params) == 1) {
index f5b8d570263f4bff13dfa45d8df3b21aa0d81bf4..56f4870f1af2efa451896e27aeaa04398015a7ea 100644 (file)
@@ -300,11 +300,19 @@ class api_v3_CustomGroupTest extends CiviUnitTestCase {
       'help_post' => 'This is Post Help For Test Group 8',
     );
 
-    $customGroup = $this->callAPISuccess('custom_group', 'create', $params);
+    $customGroup = $this->callAPISuccess('CustomGroup', 'create', $params);
     $this->assertNotNull($customGroup['id']);
     $this->assertEquals($customGroup['values'][$customGroup['id']]['extends'], 'Group');
   }
 
+  /**
+   * Test an empty update does not trigger e-notices when is_multiple has been set.
+   */
+  public function testCustomGroupEmptyUpdate() {
+    $customGroup = $this->callAPISuccess('CustomGroup', 'create', array_merge($this->_params, ['is_multiple' => 1]));
+    $this->callAPISuccess('CustomGroup', 'create', ['id' => $customGroup['id']]);
+  }
+
   /**
    * Check with Activity - Meeting Type
    */