Merge pull request #6041 from mallezie/crm-16706
[civicrm-core.git] / CRM / Core / BAO / Website.php
index 868382130e6630450a0792561fd8cebede022a53..e20e43de390de7a82025fccfbffaa107cd3a4f02 100644 (file)
@@ -3,7 +3,7 @@
  +--------------------------------------------------------------------+
  | CiviCRM version 4.6                                                |
  +--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2014                                |
+ | Copyright CiviCRM LLC (c) 2004-2015                                |
  +--------------------------------------------------------------------+
  | This file is a part of CiviCRM.                                    |
  |                                                                    |
  | GNU Affero General Public License or the licensing of CiviCRM,     |
  | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
  +--------------------------------------------------------------------+
-*/
+ */
 
 /**
  *
  * @package CRM
- * @copyright CiviCRM LLC (c) 2004-2014
+ * @copyright CiviCRM LLC (c) 2004-2015
  * $Id$
  *
  */
 class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
 
   /**
-   * Takes an associative array and adds im
+   * Takes an associative array and adds im.
    *
    * @param array $params
    *   (reference ) an assoc array of name/value pairs.
    *
    * @return object
    *   CRM_Core_BAO_Website object on success, null otherwise
-   * @static
    */
   public static function add(&$params) {
     $hook = empty($params['id']) ? 'create' : 'edit';
@@ -61,65 +60,76 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
   }
 
   /**
-   * Process website
+   * Process website.
    *
    * @param array $params
-   *   Associated array.
    * @param int $contactID
    *   Contact id.
    *
-   * @param $skipDelete
-   *
    * @return void
-   * @static
    */
-  public static function create(&$params, $contactID, $skipDelete) {
-    if (empty($params)) {
+  public static function create(&$params, $contactID) {
+
+    if (empty($params['website'])) {
       return FALSE;
     }
 
-    $ids = self::allWebsites($contactID);
-    foreach ($params as $key => $values) {
-      $websiteId = CRM_Utils_Array::value('id', $values);
+    // CRM-10551
+    // Use updateBlankLocInfo to overwrite blanked values of matching type
+    $updateBlankLocInfo = CRM_Utils_Array::value('updateBlankLocInfo', $params, FALSE);
+
+    // Get websites submitted in the form, and already on the Contact
+    $submittedWebsites = $params['website'];
+    $existingWebsites = self::allWebsites($contactID);
+
+    // For each website submitted on the form
+    foreach ($submittedWebsites as $key => $submittedValue) {
+
+      // Check for matching IDs on submitted / existing data
+      $websiteId = CRM_Utils_Array::value('id', $submittedValue);
       if ($websiteId) {
-        if (array_key_exists($websiteId, $ids)) {
-          unset($ids[$websiteId]);
+        if (array_key_exists($websiteId, $existingWebsites)) {
+          unset($existingWebsites[$websiteId]);
         }
         else {
-          unset($values['id']);
+          unset($submittedValue['id']);
         }
       }
 
-      if (empty($values['id']) &&
-        is_array($ids) && !empty($ids)
-      ) {
-        foreach ($ids as $id => $value) {
-          if (($value['website_type_id'] == $values['website_type_id']) && !empty($values['url'])) {
-            $values['id'] = $id;
-            unset($ids[$id]);
+      // Match up submitted values to existing ones, based on type
+      if (empty($submittedValue['id']) && !empty($existingWebsites)) {
+        foreach ($existingWebsites as $id => $existingValue) {
+          if ($existingValue['website_type_id'] == $submittedValue['website_type_id']) {
+            $submittedValue['id'] = $id;
+            unset($existingWebsites[$id]);
             break;
           }
         }
       }
-      $values['contact_id'] = $contactID;
-      if (!empty($values['url'])) {
-        self::add($values);
+
+      $submittedValue['contact_id'] = $contactID;
+
+      // CRM-10551
+      // If there is a matching ID, the URL is empty and we are deleting blanked values
+      // Then remove it from the contact
+      if (!empty($submittedValue['id']) && empty($submittedValue['url']) && $updateBlankLocInfo) {
+        self::del(array($submittedValue['id']));
       }
-    }
 
-    if ($skipDelete && !empty($ids)) {
-      self::del(array_keys($ids));
+      // Otherwise, add the website if the URL isn't empty
+      elseif (!empty($submittedValue['url'])) {
+        self::add($submittedValue);
+      }
     }
   }
 
   /**
-   * Delete website
+   * Delete website.
    *
    * @param array $ids
    *   Website ids.
    *
    * @return void
-   * @static
    */
   public static function del($ids) {
     $query = 'DELETE FROM civicrm_website WHERE id IN ( ' . implode(',', $ids) . ')';
@@ -135,8 +145,7 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
    * @param array $params
    * @param $values
    *
-   * @return boolean
-   * @static
+   * @return bool
    */
   public static function &getValues(&$params, &$values) {
     $websites = array();
@@ -157,7 +166,7 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
   }
 
   /**
-   * Get all the websites for a specified contact_id
+   * Get all the websites for a specified contact_id.
    *
    * @param int $id
    *   The contact id.
@@ -166,7 +175,6 @@ class CRM_Core_BAO_Website extends CRM_Core_DAO_Website {
    *
    * @return array
    *   the array of website details
-   * @static
    */
   public static function allWebsites($id, $updateBlankLocInfo = FALSE) {
     if (!$id) {
@@ -197,4 +205,5 @@ SELECT  id, website_type_id
     }
     return $websites;
   }
+
 }