Merge pull request #4635 from colemanw/comments
[civicrm-core.git] / CRM / Dedupe / Merger.php
index 688cc8885b6a1f1caf5a73403f327727465587cb..4c273c795c258ea0a4842c95680808808979ef59 100644 (file)
@@ -291,7 +291,7 @@ WHERE
   }
 
   /**
-   * return payment related table.
+   * Return payment related table.
    */
   static function paymentTables() {
     static $tables;
@@ -303,7 +303,7 @@ WHERE
   }
 
   /**
-   * return payment update Query.
+   * Return payment update Query.
    */
   static function paymentSql($tableName, $mainContactId, $otherContactId) {
     $sqls = array();
@@ -349,9 +349,9 @@ INNER JOIN  civicrm_participant participant ON ( participant.id = payment.partic
   }
 
   /**
-   * @param $mainId
-   * @param $otherId
-   * @param $tableName
+   * @param int $mainId
+   * @param int $otherId
+   * @param string $tableName
    * @param array $tableOperations
    * @param string $mode
    *
@@ -537,7 +537,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
   }
 
   /**
-   * Function to batch merge a set of contacts based on rule-group and group.
+   * Batch merge a set of contacts based on rule-group and group.
    *
    * @param  int $rgid rule group id
    * @param  int $gid group id
@@ -545,13 +545,9 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
    *                              A 'safe' value skips the merge if there are any un-resolved conflicts.
    *                              Does a force merge otherwise.
    * @param  boolean $autoFlip wether to let api decide which contact to retain and which to delete.
-   *
-   *
    * @param bool $redirectForPerformance
    *
    * @return array|bool
-   * @internal param array $cacheParams prev-next-cache params based on which next pair of contacts are computed.
-   *                              Generally used with batch-merge.
    * @static
    * @access public
    */
@@ -583,7 +579,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
   }
 
   /**
-   * Function to merge given set of contacts. Performs core operation.
+   * Merge given set of contacts. Performs core operation.
    *
    * @param  array $dupePairs set of pair of contacts for whom merge is to be done.
    * @param  array $cacheParams prev-next-cache params based on which next pair of contacts are computed.
@@ -600,8 +596,7 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
    * @static
    * @access public
    */
-  static function merge($dupePairs = array(
-    ), $cacheParams = array(), $mode = 'safe',
+  static function merge($dupePairs = array(), $cacheParams = array(), $mode = 'safe',
     $autoFlip = TRUE, $redirectForPerformance = FALSE
   ) {
     $cacheKeyString = CRM_Utils_Array::value('cache_key_string', $cacheParams);
@@ -816,6 +811,9 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
       CRM_Core_DAO::freeResult();
     }
 
+    // get all contact subtypes
+    $contactSubTypes = CRM_Contact_BAO_ContactType::subTypePairs(NULL, TRUE, '');
+
     // FIXME: there must be a better way
     foreach (array('main', 'other') as $moniker) {
       $contact = &$$moniker;
@@ -823,6 +821,8 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
       $value = empty($preferred_communication_method) ? array() : $preferred_communication_method;
       $specialValues[$moniker] = array(
         'preferred_communication_method' => $value,
+        'contact_sub_type' => $value,
+        'communication_style_id' => $value,
       );
 
       if (!empty($contact['preferred_communication_method'])){
@@ -840,6 +840,21 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
         ),
       );
       CRM_Core_OptionGroup::lookupValues($specialValues[$moniker], $names);
+
+      if (!empty($contact['contact_sub_type'])) {
+        $specialValues[$moniker]['contact_sub_type'] = implode(CRM_Core_DAO::VALUE_SEPARATOR, $contact['contact_sub_type']);
+
+        // fix contact sub type label for contact with sub type
+        $subtypes = array();
+        foreach ($contact['contact_sub_type'] as $key => $value) {
+          $subtypes[] = CRM_Utils_Array::retrieveValueRecursive($contactSubTypes, $value);
+        }
+        $contact['contact_sub_type_display'] = $specialValues[$moniker]['contact_sub_type_display'] = implode(', ', $subtypes);
+      }
+
+      if (!empty($contact['communication_style'])) {
+        $specialValues[$moniker]['communication_style_id_display'] = $contact['communication_style'];
+      }
     }
 
     static $optionValueFields = array();
@@ -1346,6 +1361,9 @@ INNER JOIN  civicrm_membership membership2 ON membership1.membership_type_id = m
     foreach ($submitted as $key => $value) {
       if (substr($key, 0, 7) == 'custom_') {
         $fid = (int) substr($key, 7);
+        if (empty($cFields[$fid])) {
+          continue;
+        }
         $htmlType = $cFields[$fid]['attributes']['html_type'];
         switch ($htmlType) {
           case 'File':