Esempio n. 1
0
/**
 * Defines 'uf field' within a group.
 *
 * @param array $params
 *   Array per getfields metadata.
 *
 * @throws API_Exception
 *
 * @return array
 *   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_type = CRM_Utils_Array::value('field_type', $params);
    $field_name = CRM_Utils_Array::value('field_name', $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));
    if (strpos($field_name, 'formatting') !== 0 && !CRM_Core_BAO_UFField::isValidFieldName($field_name)) {
        throw new API_Exception('The field_name is not valid');
    }
    $params['field_name'] = array($field_type, $field_name, $location_type_id, $phone_type);
    if (!CRM_Utils_Array::value('group_id', $params)) {
        $params['group_id'] = $groupId;
    }
    $ids = $ufFieldArray = array();
    $ids['uf_group'] = $groupId;
    $fieldId = CRM_Utils_Array::value('id', $params);
    if (!empty($fieldId)) {
        $UFField = new CRM_Core_BAO_UFField();
        $UFField->id = $fieldId;
        if ($UFField->find(TRUE)) {
            $ids['uf_group'] = $UFField->uf_group_id;
            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");
        }
        $ids['uf_field'] = $fieldId;
    }
    if (CRM_Core_BAO_UFField::duplicateField($params, $ids)) {
        throw new API_Exception("The field was not added. It already exists in this profile.");
    }
    //@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);
}
Esempio n. 2
0
/**
 * Defines 'uf field' within a group.
 *
 * @param array $params
 *   Array per getfields metadata.
 *
 * @throws API_Exception
 *
 * @return array
 *   Newly created $ufFieldArray
 */
function civicrm_api3_uf_field_create($params)
{
    civicrm_api3_verify_one_mandatory($params, NULL, array('field_name', 'uf_group_id'));
    $groupId = CRM_Utils_Array::value('uf_group_id', $params);
    if ((int) $groupId < 1) {
        throw new API_Exception('Params must be a field_name-carrying array and a positive integer.');
    }
    $field_type = CRM_Utils_Array::value('field_type', $params);
    $field_name = CRM_Utils_Array::value('field_name', $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));
    if (!CRM_Core_BAO_UFField::isValidFieldName($field_name)) {
        throw new API_Exception('The field_name is not valid');
    }
    $params['field_name'] = array($field_type, $field_name, $location_type_id, $phone_type);
    if (!CRM_Utils_Array::value('group_id', $params)) {
        $params['group_id'] = $groupId;
    }
    $ids = $ufFieldArray = array();
    $ids['uf_group'] = $groupId;
    $fieldId = CRM_Utils_Array::value('id', $params);
    if (!empty($fieldId)) {
        $UFField = new CRM_Core_BAO_UFField();
        $UFField->id = $fieldId;
        if ($UFField->find(TRUE)) {
            $ids['uf_group'] = $UFField->uf_group_id;
            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");
        }
        $ids['uf_field'] = $fieldId;
    }
    if (CRM_Core_BAO_UFField::duplicateField($params, $ids)) {
        throw new API_Exception("The field was not added. It already exists in this profile.");
    }
    //@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, $ids);
    $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);
}
Esempio n. 3
0
 /**
  * Process the form.
  *
  * @return void
  */
 public function postProcess()
 {
     $ids = array('uf_group' => $this->_gid);
     if ($this->_action & CRM_Core_Action::DELETE) {
         $fieldValues = array('uf_group_id' => $this->_gid);
         CRM_Utils_Weight::delWeight('CRM_Core_DAO_UFField', $this->_id, $fieldValues);
         $deleted = CRM_Core_BAO_UFField::del($this->_id);
         //update group_type every time. CRM-3608
         if ($this->_gid && $deleted) {
             //get the profile type.
             $fieldsType = CRM_Core_BAO_UFGroup::calculateGroupType($this->_gid, TRUE);
             CRM_Core_BAO_UFGroup::updateGroupTypes($this->_gid, $fieldsType);
         }
         CRM_Core_Session::setStatus(ts('Selected Profile Field has been deleted.'), ts('Profile Field Deleted'), 'success');
         return;
     }
     // store the submitted values in an array
     $params = $this->controller->exportValues('Field');
     if ($params['visibility'] == 'User and User Admin Only') {
         $params['is_searchable'] = $params['in_selector'] = 0;
     }
     if ($this->_action & CRM_Core_Action::UPDATE) {
         $ids['uf_field'] = $this->_id;
     }
     $name = NULL;
     if (isset($params['field_name'][1]) && isset($this->_selectFields[$params['field_name'][1]])) {
         // we dont get a name for a html formatting element
         $name = $this->_selectFields[$params['field_name'][1]];
     }
     //Hack for Formatting Field Name
     if ($params['field_name'][0] == 'Formatting') {
         $params['field_name'][1] = 'formatting_' . rand(1000, 9999);
     }
     //check for duplicate fields
     if ($params["field_name"][0] != "Formatting" && CRM_Core_BAO_UFField::duplicateField($params, $ids)) {
         CRM_Core_Session::setStatus(ts('The selected field already exists in this profile.'), ts('Field Not Added'), 'error');
         return;
     } else {
         $params['weight'] = CRM_Core_BAO_UFField::autoWeight($params);
         $ufField = CRM_Core_BAO_UFField::add($params, $ids);
         //reset other field is searchable and in selector settings, CRM-4363
         if ($this->_hasSearchableORInSelector && in_array($ufField->field_type, array('Participant', 'Contribution', 'Membership', 'Activity', 'Case'))) {
             CRM_Core_BAO_UFField::resetInSelectorANDSearchable($this->_gid);
         }
         $config = CRM_Core_Config::singleton();
         $showBestResult = FALSE;
         if (in_array($ufField->field_name, array('country', 'state_province')) && count($config->countryLimit) > 1) {
             // get state or country field weight if exists
             $field = 'state_province';
             if ($ufField->field_name == 'state_province') {
                 $field = 'country';
             }
             $ufFieldDAO = new CRM_Core_DAO_UFField();
             $ufFieldDAO->field_name = $field;
             $ufFieldDAO->location_type_id = $ufField->location_type_id;
             $ufFieldDAO->uf_group_id = $ufField->uf_group_id;
             if ($ufFieldDAO->find(TRUE)) {
                 if ($field == 'country' && $ufFieldDAO->weight > $ufField->weight) {
                     $showBestResult = TRUE;
                 } elseif ($field == 'state_province' && $ufFieldDAO->weight < $ufField->weight) {
                     $showBestResult = TRUE;
                 }
             }
         }
         //update group_type every time. CRM-3608
         if ($this->_gid && is_a($ufField, 'CRM_Core_DAO_UFField')) {
             // get the profile type.
             $fieldsType = CRM_Core_BAO_UFGroup::calculateGroupType($this->_gid, TRUE);
             CRM_Core_BAO_UFGroup::updateGroupTypes($this->_gid, $fieldsType);
         }
         CRM_Core_Session::setStatus(ts('Your CiviCRM Profile Field \'%1\' has been saved to \'%2\'.', array(1 => $name, 2 => $this->_title)), ts('Profile Field Saved'), 'success');
     }
     $buttonName = $this->controller->getButtonName();
     $session = CRM_Core_Session::singleton();
     if ($buttonName == $this->getButtonName('next', 'new')) {
         $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/uf/group/field/add', "reset=1&action=add&gid={$this->_gid}&sbr={$showBestResult}"));
     } else {
         $session->replaceUserContext(CRM_Utils_System::url('civicrm/admin/uf/group/field', "reset=1&action=browse&gid={$this->_gid}"));
         $session->set('showBestResult', $showBestResult);
     }
 }