*
* @return CRM_Core_BAO_CustomField
* The field object.
+ * @throws CRM_Core_Exception
*/
public static function getFieldObject($fieldID) {
$field = new CRM_Core_BAO_CustomField();
if (empty($fieldValues)) {
$field->id = $fieldID;
if (!$field->find(TRUE)) {
- CRM_Core_Error::fatal();
+ throw new CRM_Core_Exception('Cannot find Custom Field');
}
$fieldValues = [];
case 'Autocomplete-Select':
static $customUrls = [];
// Fixme: why is this a string in the first place??
- $attributes = array();
+ $attributes = [];
if ($field->attributes) {
foreach (explode(' ', $field->attributes) as $at) {
if (strpos($at, '=')) {
}
else {
$display = CRM_Utils_Array::value($value, $field['options'], '');
+ // For float type (see Number and Money) $value would be decimal like
+ // 1.00 (because it is stored in db as decimal), while options array
+ // key would be integer like 1. In this case expression on line above
+ // would return empty string (default value), despite the fact that
+ // matching option exists in the array.
+ // In such cases we could just get intval($value) and fetch matching
+ // option again, but this would not work if key is float like 5.6.
+ // So we need to truncate trailing zeros to make it work as expected.
+ if ($display === '' && strpos($value, '.') !== FALSE) {
+ // Use round() to truncate trailing zeros, e.g:
+ // 10.00 -> 10, 10.60 -> 10.6, 10.69 -> 10.69.
+ $value = (string) round($value, 5);
+ $display = $field['options'][$value] ?? '';
+ }
}
break;
if ($customField->data_type == 'Money' && isset($value)) {
$value = number_format($value, 2);
}
- if (self::isSerialized($customField)) {
+ if (self::isSerialized($customField) && $value) {
$customOption = CRM_Core_BAO_CustomOption::getCustomOption($customFieldId, FALSE);
$defaults[$elementName] = [];
$checkedValue = CRM_Utils_Array::explodePadded($value);
],
];
+ // If on MySQL 5.6 include ROW_FORMAT=DYNAMIC to fix unit tests
+ $databaseVersion = CRM_Utils_SQL::getDatabaseVersion();
+ if (version_compare($databaseVersion, '5.7', '<') && version_compare($databaseVersion, '5.6', '>=')) {
+ $table['attributes'] = $table['attributes'] . ' ROW_FORMAT=DYNAMIC';
+ }
+
if (!$params['is_multiple']) {
$table['indexes'] = [
[
* FK to civicrm_custom_field.
* @param int $newGroupID
* FK to civicrm_custom_group.
+ *
+ * @throws CRM_Core_Exception
*/
public static function moveField($fieldID, $newGroupID) {
$validation = self::_moveFieldValidate($fieldID, $newGroupID);
if (TRUE !== $validation) {
- CRM_Core_Error::fatal(implode(' ', $validation));
+ throw new CRM_Core_Exception(implode(' ', $validation));
}
$field = new CRM_Core_DAO_CustomField();
$field->id = $fieldID;
// retrieve it from one of the other custom fields which use this option group
if (empty($params['default_value'])) {
//don't insert only value separator as default value, CRM-4579
- $defaultValue = self::getOptionGroupDefault($params['option_group_id'], $htmlType);
+ $defaultValue = self::getOptionGroupDefault($params['option_group_id'], !empty($params['serialize']));
if (!CRM_Utils_System::isNull(explode(CRM_Core_DAO::VALUE_SEPARATOR, $defaultValue))) {
$params['default_value'] = $defaultValue;
*
* @return array
* fatal is fieldID does not exists, else array of tableName, columnName
- * @throws \Exception
+ * @throws \CRM_Core_Exception
*/
public static function getTableColumnGroup($fieldID, $force = FALSE) {
$cacheKey = "CRM_Core_DAO_CustomField_CustomGroup_TableColumn_{$fieldID}";
$dao = CRM_Core_DAO::executeQuery($query, $params);
if (!$dao->fetch()) {
- CRM_Core_Error::fatal();
+ throw new CRM_Core_Exception("Cannot find table and column information for Custom Field " . $fieldID);
}
$fieldValues = [$dao->table_name, $dao->column_name, $dao->id];
$cache->set($cacheKey, $fieldValues);
* Get option group default.
*
* @param int $optionGroupId
- * @param string $htmlType
+ * @param bool $serialize
*
* @return null|string
*/
- public static function getOptionGroupDefault($optionGroupId, $htmlType) {
+ public static function getOptionGroupDefault($optionGroupId, $serialize) {
$query = "
-SELECT default_value, html_type
+SELECT default_value, serialize
FROM civicrm_custom_field
WHERE option_group_id = {$optionGroupId}
-AND default_value IS NOT NULL
-ORDER BY html_type";
+AND default_value IS NOT NULL";
$dao = CRM_Core_DAO::executeQuery($query);
- $defaultValue = NULL;
- $defaultHTMLType = NULL;
while ($dao->fetch()) {
- if ($dao->html_type == $htmlType) {
+ if ($dao->serialize == $serialize) {
return $dao->default_value;
}
- if ($defaultValue == NULL) {
- $defaultValue = $dao->default_value;
- $defaultHTMLType = $dao->html_type;
- }
+ $defaultValue = $dao->default_value;
}
- // some conversions are needed if either the old or new has a html type which has potential
- // multiple default values.
- if (($htmlType == 'CheckBox' || $htmlType == 'Multi-Select') &&
- ($defaultHTMLType != 'CheckBox' && $defaultHTMLType != 'Multi-Select')
- ) {
- $defaultValue = CRM_Core_DAO::VALUE_SEPARATOR . $defaultValue . CRM_Core_DAO::VALUE_SEPARATOR;
+ // Convert serialization
+ if (isset($defaultValue) && $serialize) {
+ return CRM_Utils_Array::implodePadded([$defaultValue]);
}
- elseif (($defaultHTMLType == 'CheckBox' || $defaultHTMLType == 'Multi-Select') &&
- ($htmlType != 'CheckBox' && $htmlType != 'Multi-Select')
- ) {
- $defaultValue = substr($defaultValue, 1, -1);
- $values = explode(CRM_Core_DAO::VALUE_SEPARATOR,
- substr($defaultValue, 1, -1)
- );
- $defaultValue = $values[0];
+ elseif (isset($defaultValue)) {
+ return CRM_Utils_Array::explodePadded($defaultValue)[0];
}
-
- return $defaultValue;
+ return NULL;
}
/**