| GNU Affero General Public License or the licensing of CiviCRM, |
| see the CiviCRM license FAQ at http://civicrm.org/licensing |
+--------------------------------------------------------------------+
-*/
+ */
/**
*
* Array for valid combinations of data_type & descriptions
*
* @var array
- * @static
*/
public static $_dataType = NULL;
* Array for valid combinations of data_type & html_type
*
* @var array
- * @static
*/
public static $_dataToHtml = NULL;
* Array to hold (formatted) fields for import
*
* @var array
- * @static
*/
public static $_importFields = NULL;
/**
- * Build and retrieve the list of data types and descriptions
- *
- * @param NULL
+ * Build and retrieve the list of data types and descriptions.
*
- * @return array Data type => Description
- * @static
+ * @return array
+ * Data type => Description
*/
public static function &dataType() {
if (!(self::$_dataType)) {
}
/**
- * Takes an associative array and creates a custom field object
+ * Takes an associative array and creates a custom field object.
*
* This function is invoked from within the web form layer and also from the api layer
*
* @param array $params
* (reference) an assoc array of name/value pairs.
*
- * @return CRM_Core_DAO_CustomField object
- * @static
+ * @return CRM_Core_DAO_CustomField
*/
public static function create(&$params) {
$origParams = array_merge(array(), $params);
$customField->is_searchable = CRM_Utils_Array::value('is_searchable', $params, FALSE);
$customField->in_selector = CRM_Utils_Array::value('in_selector', $params, FALSE);
$customField->is_search_range = CRM_Utils_Array::value('is_search_range', $params, FALSE);
- $customField->is_active = CRM_Utils_Array::value('is_active', $params, FALSE);
+ //CRM-15792 - Custom field gets disabled if is_active not set
+ $customField->is_active = CRM_Utils_Array::value('is_active', $params, TRUE);
$customField->is_view = CRM_Utils_Array::value('is_view', $params, FALSE);
$customField->save();
}
/**
- * Fetch object based on array of properties
+ * Fetch object based on array of properties.
*
* @param array $params
* (reference ) an assoc array of name/value pairs.
* @param array $defaults
* (reference ) an assoc array to hold the flattened values.
*
- * @return CRM_Core_DAO_CustomField object
- * @static
+ * @return CRM_Core_DAO_CustomField
*/
public static function retrieve(&$params, &$defaults) {
return CRM_Core_DAO::commonRetrieve('CRM_Core_DAO_CustomField', $params, $defaults);
}
/**
- * Update the is_active flag in the db
+ * Update the is_active flag in the db.
*
* @param int $id
* Id of the database record.
* @param bool $is_active
* Value we want to set the is_active field.
*
- * @return Object DAO object on sucess, null otherwise
+ * @return Object
+ * DAO object on sucess, null otherwise
*
- * @static
*/
public static function setIsActive($id, $is_active) {
* @param int $id
* Id of field.
*
- * @return string name
- *
- * @static
+ * @return string
+ * name
*
*/
public static function getTitle($id) {
* @param bool $checkPermission
* If false, do not include permissioning clause.
*
- * @return array $fields - an array of active custom fields.
+ * @return array
+ * an array of active custom fields.
*
- * @static
*/
public static function &getFields(
$customDataType = 'Individual',
$cfTable.option_group_id,
$cfTable.date_format,
$cfTable.time_format,
- $cgTable.is_multiple
+ $cgTable.is_multiple,
+ og.name as option_group_name
FROM $cfTable
INNER JOIN $cgTable
- ON $cfTable.custom_group_id = $cgTable.id
+ ON $cfTable.custom_group_id = $cgTable.id
+ LEFT JOIN civicrm_option_group og
+ ON $cfTable.option_group_id = og.id
WHERE ( 1 ) ";
if (!$showAll) {
$fields[$dao->id]['date_format'] = $dao->date_format;
$fields[$dao->id]['time_format'] = $dao->time_format;
$fields[$dao->id]['is_required'] = $dao->is_required;
+ self::getOptionsForField($fields[$dao->id], $dao->option_group_name);
}
CRM_Core_BAO_Cache::setItem($fields,
*
* @param bool $withMultiple
*
- * @return array $fields -
+ * @return array
+ *
*
- * @static
*/
public static function &getFieldsForImport(
$contactType = 'Individual',
}
/**
- * Get the field id from an import key
+ * Get the field id from an import key.
*
* @param string $key
* The key to parse.
*
* @param bool $all
- * @return int|null The id (if exists)
- * @static
+ * @return int|null
+ * The id (if exists)
*/
public static function getKeyID($key, $all = FALSE) {
$match = array();
}
/**
- * Use the cache to get all values of a specific custom field
+ * Use the cache to get all values of a specific custom field.
*
* @param int $fieldID
* The custom field ID.
*
- * @return CRM_Core_DAO_CustomField $field the field object
- * @static
- * public
+ * @return CRM_Core_DAO_CustomField
+ * The field object.
*/
public static function getFieldObject($fieldID) {
$field = new CRM_Core_DAO_CustomField();
}
/**
- * This function for building custom fields
+ * This function for building custom fields.
*
* @param CRM_Core_Form $qf
* Form object (reference).
* @param string $label
* Label for custom field.
*
- * @static
*/
public static function addQuickFormElement(
&$qf,
*
* @param object $field
* The field object.
- *
- * @return boolean
- *
- * @static
- *
*/
public static function deleteField($field) {
CRM_Utils_System::flushCache();
$field->delete();
CRM_Core_BAO_UFField::delUFField($field->id);
CRM_Utils_Weight::correctDuplicateWeights('CRM_Core_DAO_CustomField');
-
- return;
}
/**
* @param int $contactID
* @param int $fieldID
*
- * @return string the display value
+ * @return string
+ * the display value
*
- * @static
*/
public static function getDisplayValue($value, $id, &$options, $contactID = NULL, $fieldID = NULL) {
$option = &$options[$id];
*
* @return array|mixed|null|string
*/
- static function getDisplayValueCommon(
+ public static function getDisplayValueCommon(
$value,
&$option,
$html_type,
break;
case 'File':
- if ($contactID) {
+ // In the context of displaying a profile, show file/image
+ if ($contactID && $value) {
$url = self::getFileURL($contactID, $fieldID, $value);
if ($url) {
$display = $url['file_url'];
}
}
+ // In other contexts show a paperclip icon
+ elseif ($value) {
+ $icons = CRM_Core_BAO_File::paperIconAttachment('*', $value);
+ $display = $icons[$value];
+ }
break;
case 'TextArea':
}
/**
- * Set default values for custom data used in profile
+ * Set default values for custom data used in profile.
*
* @param int $customFieldId
* Custom field id.
* If passed - dont fetch value from db,.
* just format the given value
*
- * @static
*/
- static function setProfileDefaults(
+ public static function setProfileDefaults(
$customFieldId,
$elementName,
&$defaults,
}
/**
- * Format custom fields before inserting
+ * Format custom fields before inserting.
*
* @param int $customFieldId
* Custom field id.
* @param bool $includeViewOnly
* If true, fields marked 'View Only' are included. Required for APIv3.
*
- * @return array $customFormatted formatted custom field array
- * @static
+ * @return array|NULL
+ * formatted custom field array
*/
- static function formatCustomField(
+ public static function formatCustomField(
$customFieldId, &$customFormatted, $value,
$customFieldExtend, $customValueId = NULL,
$entityId = NULL,
//subtype and basic type
$customDataSubType = NULL;
if (is_array($customFieldExtend)) {
- $customFieldExtend = $customFieldExtend[0];
- }
-
- if (in_array($customFieldExtend,
- CRM_Contact_BAO_ContactType::subTypes()
- )) {
// This is the case when getFieldsForImport() requires fields
// of subtype and its parent.CRM-5143
- $customDataSubType = $customFieldExtend;
- $customFieldExtend = CRM_Contact_BAO_ContactType::getBasicType($customDataSubType);
+ // CRM-16065 - Custom field set data not being saved if contact has more than one contact sub type
+ $customDataSubType = array_intersect(CRM_Contact_BAO_ContactType::subTypes(), (array) $customFieldExtend);
+ if (!empty($customDataSubType) && is_array($customDataSubType)) {
+ $customFieldExtend = array_unique(array_values(CRM_Contact_BAO_ContactType::getBasicType($customDataSubType)));
+ }
}
$customFields = CRM_Core_BAO_CustomField::getFields($customFieldExtend,
);
if (!array_key_exists($customFieldId, $customFields)) {
- return;
+ return NULL;
}
// return if field is a 'code' field
if (!$includeViewOnly && !empty($customFields[$customFieldId]['is_view'])) {
- return;
+ return NULL;
}
list($tableName, $columnName, $groupID) = self::getTableColumnGroup($customFieldId);
}
/**
- * Determine whether it would be safe to move a field
+ * Determine whether it would be safe to move a field.
*
* @param int $fieldID
* FK to civicrm_custom_field.
* @param int $newGroupID
* FK to civicrm_custom_group.
*
- * @return array(
- * string) or TRUE
+ * @return array
+ * array(string) or TRUE
*/
public static function _moveFieldValidate($fieldID, $newGroupID) {
$errors = array();
}
/**
- * Get the database table name and column name for a custom field
+ * Get the database table name and column name for a custom field.
*
* @param int $fieldID
* The fieldID of the custom field.
* @param bool $force
* Force the sql to be run again (primarily used for tests).
*
- * @return array - fatal is fieldID does not exists, else array of tableName, columnName
- * @static
+ * @return array
+ * fatal is fieldID does not exists, else array of tableName, columnName
*/
public static function getTableColumnGroup($fieldID, $force = FALSE) {
$cacheKey = "CRM_Core_DAO_CustomField_CustomGroup_TableColumn_{$fieldID}";
}
/**
- * Get custom option groups
+ * Get custom option groups.
*
* @param array $includeFieldIds
* Ids of custom fields for which.
- * option groups must be included.
+ * option groups must be included.
*
* Currently this is required in the cases where option groups are to be included
* for inactive fields : CRM-5369
*
*
- * @return mixed $customOptionGroup@static
+ * @return mixed
*/
public static function &customOptionGroup($includeFieldIds = NULL) {
static $customOptionGroup = NULL;
}
/**
- * Fix orphan groups
+ * Fix orphan groups.
*
* @param int $customFieldId
* Custom field id.
* Option group id.
*
* @return void
- * @static
*/
public static function fixOptionGroups($customFieldId, $optionGroupId) {
// check if option group belongs to any custom Field else delete
* Option group id.
*
* @return void
- * @static
*/
public static function checkOptionGroup($optionGroupId) {
$query = "
*
* @return array
*/
- static function postProcess(
+ public static function postProcess(
&$params,
&$customFields,
$entityID,
/**
* Given ID of a custom field, return its name as well as the name of the custom group it belongs to.
*
+ * @param array $ids
+ *
+ * @return array
*/
public static function getNameFromID($ids) {
if (is_array($ids)) {
*
* @param array $params
* Custom data submitted.
- * ie array( 'custom_1' => 'validate me' );
+ * ie array( 'custom_1' => 'validate me' );
*
- * @return array $errors validation errors.
- * @static
+ * @return array
+ * validation errors.
*/
public static function validateCustomData($params) {
$errors = array();
// FIXME: Currently the only way to know if data is serialized is by looking at the html_type. It would be cleaner to decouple this.
return ($field['html_type'] == 'CheckBox' || strpos($field['html_type'], 'Multi') !== FALSE);
}
+
+ /**
+ * @param array $field
+ * @param string|null $optionGroupName
+ */
+ private static function getOptionsForField(&$field, $optionGroupName) {
+ if ($optionGroupName) {
+ $field['pseudoconstant'] = array(
+ 'optionGroupName' => $optionGroupName,
+ 'optionEditPath' => 'civicrm/admin/options/' . $optionGroupName,
+ );
+ }
+ elseif ($field['data_type'] == 'Boolean') {
+ $field['pseudoconstant'] = array(
+ 'callback' => 'CRM_Core_SelectValues::boolean',
+ );
+ }
+ elseif ($field['data_type'] == 'Country') {
+ $field['pseudoconstant'] = array(
+ 'table' => 'civicrm_country',
+ 'keyColumn' => 'id',
+ 'labelColumn' => 'name',
+ 'nameColumn' => 'iso_code',
+ );
+ }
+ elseif ($field['data_type'] == 'StateProvince') {
+ $field['pseudoconstant'] = array(
+ 'table' => 'civicrm_state_province',
+ 'keyColumn' => 'id',
+ 'labelColumn' => 'name',
+ );
+ }
+ }
+
}