* Create a 'custom field' within a custom field group.
*
* We also empty the static var in the getfields
- * function after deletion so that the field is available for us (getfields manages date conversion
- * among other things
+ * function after deletion so that the field is available for us (getfields
+ * manages date conversion among other things
*
* @param array $params
* Array per getfields metadata.
*
* @return array
* API success array
+ * @throws \CiviCRM_API3_Exception
*/
-function civicrm_api3_custom_field_create($params) {
+function civicrm_api3_custom_field_create(array $params): array {
// Legacy handling for old way of naming serialized fields
if (!empty($params['html_type'])) {
- if ($params['html_type'] == 'CheckBox' || strpos($params['html_type'], 'Multi-') === 0) {
+ if ($params['html_type'] === 'CheckBox' || strpos($params['html_type'], 'Multi-') === 0) {
$params['serialize'] = 1;
}
$params['html_type'] = str_replace(['Multi-Select', 'Select Country', 'Select State/Province'], 'Select', $params['html_type']);
$params['option_weight'][$key] = $value['weight'];
}
}
+ elseif (
+ // Legacy handling for historical apiv3 behaviour.
+ empty($params['id'])
+ && !empty($params['html_type'])
+ && $params['html_type'] !== 'Text'
+ && empty($params['option_group_id'])
+ && empty($params['option_value'])
+ && in_array($params['data_type'] ?? '', ['String', 'Int', 'Float', 'Money'])) {
+ // Trick the BAO into creating an option group even though no option values exist
+ // because that odd behaviour is locked in via a test.
+ $params['option_value'] = 1;
+ }
$values = [];
$customField = CRM_Core_BAO_CustomField::create($params);
_civicrm_api3_object_to_array_unique_fields($customField, $values[$customField->id]);