Towards CRM-20474 Refactor UFField api to be standardised - move functionality to...
authorSaurabh Batra <saurabh.batra96@gmail.com>
Thu, 27 Apr 2017 22:41:10 +0000 (10:41 +1200)
committereileen <emcnaughton@wikimedia.org>
Thu, 27 Apr 2017 22:41:10 +0000 (10:41 +1200)
CRM/Core/BAO/UFField.php
api/v3/UFField.php

index 00bc96c9e1d76ba82937addde0ad3423980e95d2..df50241ce749e187bfff0de3a6a418f4b91d167c 100644 (file)
@@ -42,6 +42,75 @@ class CRM_Core_BAO_UFField extends CRM_Core_DAO_UFField {
   private static $_contriBatchEntryFields = NULL;
   private static $_memberBatchEntryFields = NULL;
 
+  /**
+   * Create UFField object.
+   *
+   * @param array $params
+   *   Array per getfields metadata.
+   *
+   * @return \CRM_Core_BAO_UFField
+   * @throws \API_Exception
+   */
+  public static function create(&$params) {
+    // CRM-14756: kind of a hack-ish fix. If the user gives the id, uf_group_id is retrieved and then set.
+    if (isset($params['id'])) {
+      $groupId = civicrm_api3('UFField', 'getvalue', array(
+        'return' => 'uf_group_id',
+        'id' => $params['id'],
+      ));
+    }
+    else {
+      $groupId = CRM_Utils_Array::value('uf_group_id', $params);
+    }
+
+    $field_name = CRM_Utils_Array::value('field_name', $params);
+
+    if (strpos($field_name, 'formatting') !== 0 && !CRM_Core_BAO_UFField::isValidFieldName($field_name)) {
+      throw new API_Exception('The field_name is not valid');
+    }
+
+    if (!(CRM_Utils_Array::value('group_id', $params))) {
+      $params['group_id'] = $groupId;
+    }
+
+    $fieldId = CRM_Utils_Array::value('id', $params);
+    if (!empty($fieldId)) {
+      $UFField = new CRM_Core_BAO_UFField();
+      $UFField->id = $fieldId;
+      if ($UFField->find(TRUE)) {
+        if (!(CRM_Utils_Array::value('group_id', $params))) {
+          // this copied here from previous api function - not sure if required
+          $params['group_id'] = $UFField->uf_group_id;
+        }
+      }
+      else {
+        throw new API_Exception("there is no field for this fieldId");
+      }
+    }
+    $params['uf_group_id'] = $params['group_id'];
+
+    if (CRM_Core_BAO_UFField::duplicateField($params)) {
+      throw new API_Exception("The field was not added. It already exists in this profile.");
+    }
+
+    // @todo fix BAO to be less weird.
+    $field_type       = CRM_Utils_Array::value('field_type', $params);
+    $location_type_id = CRM_Utils_Array::value('location_type_id', $params, CRM_Utils_Array::value('website_type_id', $params));
+    $phone_type       = CRM_Utils_Array::value('phone_type_id', $params, CRM_Utils_Array::value('phone_type', $params));
+    $params['field_name'] = array($field_type, $field_name, $location_type_id, $phone_type);
+    //@todo why is this even optional? Surely weight should just be 'managed' ??
+    if (CRM_Utils_Array::value('option.autoweight', $params, TRUE)) {
+      $params['weight'] = CRM_Core_BAO_UFField::autoWeight($params);
+    }
+    $ufField = CRM_Core_BAO_UFField::add($params);
+
+    $fieldsType = CRM_Core_BAO_UFGroup::calculateGroupType($groupId, TRUE);
+    CRM_Core_BAO_UFGroup::updateGroupTypes($groupId, $fieldsType);
+
+    civicrm_api3('profile', 'getfields', array('cache_clear' => TRUE));
+    return $ufField;
+  }
+
 
   /**
    * Fetch object based on array of properties.
index 0f6e9fc270fba3b4275206c2374862bda0204607..5dba94ecee614144f91f3507e452c6ca709ed013 100644 (file)
  *   Newly created $ufFieldArray
  */
 function civicrm_api3_uf_field_create($params) {
-  // CRM-14756: kind of a hack-ish fix. If the user gives the id, uf_group_id is retrieved and then set.
-  if (isset($params['id'])) {
-    $groupId = civicrm_api3('UFField', 'getvalue', array(
-      'return' => 'uf_group_id',
-      'id' => $params['id'],
-    ));
-  }
-  else {
-    $groupId = CRM_Utils_Array::value('uf_group_id', $params);
-  }
-
-  $field_name = CRM_Utils_Array::value('field_name', $params);
-
-  if (strpos($field_name, 'formatting') !== 0 && !CRM_Core_BAO_UFField::isValidFieldName($field_name)) {
-    throw new API_Exception('The field_name is not valid');
-  }
-
-  if (!(CRM_Utils_Array::value('group_id', $params))) {
-    $params['group_id'] = $groupId;
-  }
-
-  $ufFieldArray = array();
-
-  $fieldId = CRM_Utils_Array::value('id', $params);
-  if (!empty($fieldId)) {
-    $UFField = new CRM_Core_BAO_UFField();
-    $UFField->id = $fieldId;
-    if ($UFField->find(TRUE)) {
-      if (!(CRM_Utils_Array::value('group_id', $params))) {
-        // this copied here from previous api function - not sure if required
-        $params['group_id'] = $UFField->uf_group_id;
-      }
-    }
-    else {
-      throw new API_Exception("there is no field for this fieldId");
-    }
-  }
-  $params['uf_group_id'] = $params['group_id'];
-
-  if (CRM_Core_BAO_UFField::duplicateField($params)) {
-    throw new API_Exception("The field was not added. It already exists in this profile.");
-  }
-
-  // @todo fix BAO to be less weird.
-  $field_type       = CRM_Utils_Array::value('field_type', $params);
-  $location_type_id = CRM_Utils_Array::value('location_type_id', $params, CRM_Utils_Array::value('website_type_id', $params));
-  $phone_type       = CRM_Utils_Array::value('phone_type_id', $params, CRM_Utils_Array::value('phone_type', $params));
-  $params['field_name'] = array($field_type, $field_name, $location_type_id, $phone_type);
-  //@todo why is this even optional? Surely weight should just be 'managed' ??
-  if (CRM_Utils_Array::value('option.autoweight', $params, TRUE)) {
-    $params['weight'] = CRM_Core_BAO_UFField::autoWeight($params);
-  }
-  $ufField = CRM_Core_BAO_UFField::add($params);
-
-  $fieldsType = CRM_Core_BAO_UFGroup::calculateGroupType($groupId, TRUE);
-  CRM_Core_BAO_UFGroup::updateGroupTypes($groupId, $fieldsType);
-
-  _civicrm_api3_object_to_array($ufField, $ufFieldArray[$ufField->id]);
-  civicrm_api3('profile', 'getfields', array('cache_clear' => TRUE));
-  return civicrm_api3_create_success($ufFieldArray, $params);
+  return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }
 
 /**