When syncing to UF record, use API instead of DAO to create email
authorAidan Saunders <aidan.saunders@squiffle.uk>
Mon, 10 Jun 2019 12:42:13 +0000 (13:42 +0100)
committerAidan Saunders <aidan.saunders@squiffle.uk>
Mon, 10 Jun 2019 20:15:42 +0000 (21:15 +0100)
 - with the addition of a default location in this change, this fixes core#1026

Bonus code tidy: if UF email matches the contact primary email, avoid unnecessary update.
If update is needed, use API not direct SQL.

CRM/Core/BAO/UFMatch.php

index 18ce81f8aa223c64c193fde5417bcece30585e5d..cab931e41b5d8a4f7d9060a2bbc7a7058ea449a2 100644 (file)
@@ -431,25 +431,23 @@ AND    domain_id    = %4
       $contactDetails = CRM_Contact_BAO_Contact_Location::getEmailDetails($contactId);
 
       if (trim($contactDetails[1])) {
+        //update if record is found but different
         $emailID = $contactDetails[3];
-        //update if record is found
-        $query = "UPDATE  civicrm_email
-                     SET email = %1
-                     WHERE id =  %2";
-        $p = [
-          1 => [$emailAddress, 'String'],
-          2 => [$emailID, 'Integer'],
-        ];
-        $dao = CRM_Core_DAO::executeQuery($query, $p);
+        if (trim($contactDetails[1]) != $emailAddress) {
+          civicrm_api3('Email', 'create', [
+            'id' => $emailID,
+            'email' => $emailAddress,
+          ]);
+        }
       }
       else {
         //else insert a new email record
-        $email = new CRM_Core_DAO_Email();
-        $email->contact_id = $contactId;
-        $email->is_primary = 1;
-        $email->email = $emailAddress;
-        $email->save();
-        $emailID = $email->id;
+        $result = civicrm_api3('Email', 'create', [
+          'contact_id' => $contactId,
+          'email' => $emailAddress,
+          'is_primary' => 1,
+        ]);
+        $emailID = $result->id;
       }
 
       CRM_Core_BAO_Log::register($contactId,