Fix Participant batch update to work with multiple value custom fields
authoreileen <emcnaughton@wikimedia.org>
Sun, 29 Apr 2018 06:17:02 +0000 (18:17 +1200)
committereileen <emcnaughton@wikimedia.org>
Sun, 29 Apr 2018 07:50:47 +0000 (19:50 +1200)
CRM/Event/Form/Task/Batch.php
tests/phpunit/CRM/Event/Form/Task/BatchTest.php

index fe71dc15e0fe40d00686f9715528a6f02b1f0116..04927e1d09d97f34482e95bbb93fb5bfe0a93627 100644 (file)
@@ -474,6 +474,14 @@ class CRM_Event_Form_Task_Batch extends CRM_Event_Form_Task {
           $key,
           'Participant'
         );
+        foreach (array_keys($value) as $fieldName) {
+          // Unset the original custom field now that it has been formatting to the 'custom'
+          // array as it may not be in the right format for the api as is (notably for
+          // multiple checkbox values).
+          if (substr($fieldName, 0, 7) === 'custom_') {
+            unset($value[$fieldName]);
+          }
+        }
 
         $value['id'] = $key;
 
index ad9b895a15c84af2508c3ac644dce0921f969ca1..812c26ca18e51b8f64d32381074778d0f9e41bae 100644 (file)
@@ -9,14 +9,17 @@
 class CRM_Event_Form_Task_BatchTest extends CiviUnitTestCase {
 
   public function testSubmit() {
+    $group = $this->CustomGroupCreate(['extends' => 'Participant', 'title' => 'Participant']);
+    $field = $this->customFieldCreate(['custom_group_id' => $group['id'], 'html_type' => 'CheckBox', 'option_values' => ['two' => 'A couple', 'three' => 'A few', 'four' => 'Too Many']]);
     $participantID = $this->participantCreate();
     $participant = $this->callAPISuccessGetSingle('Participant', ['id' => $participantID]);
     $this->assertEquals(2, $participant['participant_status_id']);
 
     $form = $this->getFormObject('CRM_Event_Form_Task_Batch');
-    $form->submit(['field' => [$participantID => ['participant_status_id' => 1]]]);
+    $form->submit(['field' => [$participantID => ['participant_status_id' => 1, 'custom_' . $field['id'] => ['two' => 1, 'four' => 1]]]]);
 
     $participant = $this->callAPISuccessGetSingle('Participant', ['id' => $participantID]);
     $this->assertEquals(1, $participant['participant_status_id']);
   }
+
 }