Enforce is_primary while deleting objects CRM-10732
authorColeman Watts <coleman@civicrm.org>
Tue, 26 Mar 2013 23:17:37 +0000 (16:17 -0700)
committerColeman Watts <coleman@civicrm.org>
Wed, 27 Mar 2013 00:22:59 +0000 (17:22 -0700)
CRM/Contact/BAO/Contact.php
CRM/Core/BAO/Address.php
CRM/Core/BAO/Email.php
CRM/Core/BAO/IM.php
CRM/Core/BAO/OpenID.php
CRM/Core/BAO/Phone.php

index 5988ab2d52263ef9590c80308fb4ac5e16b2ca58..723745e3973579e0141e248e8bb69f5956739a3e 100644 (file)
@@ -2974,4 +2974,46 @@ LEFT JOIN civicrm_address add2 ON ( add1.master_id = add2.id )
       return FALSE;
     }
   }
+
+  
+  /**
+   * Delete a contact-related object that has an 'is_primary' field
+   * Ensures that is_primary gets assigned to another object if available
+   * Also calls pre/post hooks
+   *
+   * @var $type: object type
+   * @var $id: object id
+   */
+  public static function deleteObjectWithPrimary($type, $id) {
+    if (!$id || !is_numeric($id)) {
+      return false;
+    }
+    $daoName = "CRM_Core_DAO_$type";
+    $obj = new $daoName();
+    $obj->id = $id;
+    $obj->find();
+    if ($obj->fetch()) {
+      CRM_Utils_Hook::pre('delete', $type, $id, CRM_Core_DAO::$_nullArray);
+      $contactId = $obj->contact_id;
+      $obj->delete();
+    }
+    else {
+      return false;
+    }
+    $dao = new $daoName();
+    $dao->contact_id = $contactId;
+    $dao->is_primary = 1;
+    // Pick another record to be primary (if one isn't already)
+    if (!$dao->find(TRUE)) {
+      $dao->is_primary = 0;
+      $dao->find();
+      if ($dao->fetch()) {
+        $dao->is_primary = 1;
+        $dao->save();
+      }
+    }
+    $dao->free();
+    CRM_Utils_Hook::post('delete', $type, $id, $obj);
+    $obj->free();
+  }
 }
index 7c6cb7b9df3e1855c1080691c120ea75f59ddddd..fba41e28d3a9f92937c19072fe2e076d7ab4d8a3 100644 (file)
@@ -1130,4 +1130,11 @@ SELECT is_primary,
       );
     }
   }
+
+  /**
+   * Call common delete function
+   */
+  static function del($id) {
+    CRM_Contact_BAO_Contact::deleteObjectWithPrimary('Address', $id);
+  }
 }
index 20b45ed096f3b503ec2010804a257fe42f7b37f2..6de62fdcead70523eba8169d20907f89c565fdef 100644 (file)
@@ -306,5 +306,12 @@ AND    reset_date IS NULL
   static function isMultipleBulkMail() {
     return CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME, 'civimail_multiple_bulk_emails', NULL, FALSE);
   }
+
+  /**
+   * Call common delete function
+   */
+  static function del($id) {
+    CRM_Contact_BAO_Contact::deleteObjectWithPrimary('Email', $id);
+  }
 }
 
index 221a8f5682387e1995f8a28e27dc02406ec67a97..a20f81541ca4377ef8f597255d7f183176f39823 100644 (file)
@@ -166,5 +166,12 @@ ORDER BY cim.is_primary DESC, im_id ASC ";
     }
     return $ims;
   }
+
+  /**
+   * Call common delete function
+   */
+  static function del($id) {
+    CRM_Contact_BAO_Contact::deleteObjectWithPrimary('IM', $id);
+  }
 }
 
index 853c34afed3b43ef14175209ecac59b54460e082..4ece5a75a902bd3326d6e02ddf6887975149ba5c 100644 (file)
@@ -49,13 +49,13 @@ class CRM_Core_BAO_OpenID extends CRM_Core_DAO_OpenID {
    */
   static function add(&$params) {
     $hook = empty($params['id']) ? 'create' : 'edit';
-    CRM_Utils_Hook::pre($hook, 'openId', CRM_Utils_Array::value('id', $params), $params);
+    CRM_Utils_Hook::pre($hook, 'OpenID', CRM_Utils_Array::value('id', $params), $params);
 
     $openId = new CRM_Core_DAO_OpenID();
     $openId->copyValues($params);
     $openId->save();
 
-    CRM_Utils_Hook::post($hook, 'openId', $openId->id, $openId);
+    CRM_Utils_Hook::post($hook, 'OpenID', $openId->id, $openId);
     return $openId;
   }
 
@@ -140,5 +140,12 @@ ORDER BY
     }
     return $openids;
   }
+
+  /**
+   * Call common delete function
+   */
+  static function del($id) {
+    CRM_Contact_BAO_Contact::deleteObjectWithPrimary('OpenID', $id);
+  }
 }
 
index a128d18c9d262aa8b762c9f5f7e5b0fadf5e943c..a514671e193f4532b58530796ea07843df451167 100644 (file)
@@ -247,5 +247,12 @@ ORDER BY ph.is_primary DESC, phone_id ASC ";
       CRM_Core_DAO::executeQuery($query, $params);
     }
   }
+
+  /**
+   * Call common delete function
+   */
+  static function del($id) {
+    CRM_Contact_BAO_Contact::deleteObjectWithPrimary('Phone', $id);
+  }
 }