Fix saving of relationship permissions when relationship is b_a on form
authorMatthew Wire (MJW Consulting) <mjw@mjwconsult.co.uk>
Mon, 17 Sep 2018 21:33:41 +0000 (22:33 +0100)
committerMatthew Wire (MJW Consulting) <mjw@mjwconsult.co.uk>
Mon, 17 Sep 2018 21:33:41 +0000 (22:33 +0100)
CRM/Contact/Form/Relationship.php
templates/CRM/Contact/Form/Relationship.tpl

index fc115dcf92524ceda91d4ebfcf2841f52c4b4b5a..2ce6c062f01151ef96923cb29f752d1765df38e5 100644 (file)
@@ -578,22 +578,23 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
   /**
    * Prepares parameters to be used for create/update actions
    *
-   * @param array $params
+   * @param array $values
    *
    * @return array
    */
-  private function preparePostProcessParameters($params) {
-    $relationshipTypeParts = explode('_', $params['relationship_type_id']);
+  private function preparePostProcessParameters($values) {
+    $params = $values;
+    list($relationshipTypeId, $relationshipContactA, $relationshipContactB) = explode('_', $params['relationship_type_id']);
 
-    $params['relationship_type_id'] = $relationshipTypeParts[0];
-    $params['contact_id_' . $relationshipTypeParts[1]] = $this->_contactId;
+    $params['relationship_type_id'] = $relationshipTypeId;
+    $params['contact_id_' . $relationshipContactA] = $this->_contactId;
 
     if (empty($this->_relationshipId)) {
-      $params['contact_id_' . $relationshipTypeParts[2]] = explode(',', $params['related_contact_id']);
+      $params['contact_id_' . $relationshipContactB] = explode(',', $params['related_contact_id']);
     }
     else {
       $params['id'] = $this->_relationshipId;
-      $params['contact_id_' . $relationshipTypeParts[2]] = $params['related_contact_id'];
+      $params['contact_id_' . $relationshipContactB] = $params['related_contact_id'];
 
       foreach (array('start_date', 'end_date') as $dateParam) {
         if (!empty($params[$dateParam])) {
@@ -602,11 +603,12 @@ class CRM_Contact_Form_Relationship extends CRM_Core_Form {
       }
     }
 
-    // CRM-14612 - Don't use adv-checkbox as it interferes with the form js
-    $params['is_permission_a_b'] = CRM_Utils_Array::value('is_permission_a_b', $params, 0);
-    $params['is_permission_b_a'] = CRM_Utils_Array::value('is_permission_b_a', $params, 0);
+    // The javascript on the form will swap these fields if it is a b_a relationship, so we compensate here
+    $relationshipType = "${relationshipContactA}_${relationshipContactB}";
+    $params['is_permission_a_b'] = CRM_Utils_Array::value('is_permission_' . $relationshipType, $values, 0);
+    $params['is_permission_b_a'] = CRM_Utils_Array::value('is_permission_' . strrev($relationshipType), $values, 0);
 
-    return array($params, $relationshipTypeParts[1]);
+    return array($params, $relationshipContactA);
   }
 
   /**
index ad0efe0c0a8f8c6b72477019f213e11a8e47a577..8165519e2711d9d1914deb28439e35bb5c508d3a 100644 (file)
           </td>
         </tr>
         <tr class="crm-relationship-form-block-is_permission_b_a">
-          <td class="label"></td>
+          <td class="label"> </td>
           <td>
             {ts 1=$contact_b|ucfirst 2=$display_name_a}Permission for <strong>%1</strong> to access information about <strong>%2</strong>{/ts}<br />
             {$form.is_permission_b_a.html}