diff --git a/CRM/Core/BAO/CustomField.php b/CRM/Core/BAO/CustomField.php index 554eb94dc9ea..dda021c2e8f5 100644 --- a/CRM/Core/BAO/CustomField.php +++ b/CRM/Core/BAO/CustomField.php @@ -230,6 +230,8 @@ public static function create(&$params) { $optionGroup->name = "{$columnName}_" . date('YmdHis'); $optionGroup->title = $params['label']; $optionGroup->is_active = 1; + // Don't set reserved as it's not a built-in option group and may be useful for other custom fields. + $optionGroup->is_reserved = 0; $optionGroup->data_type = $dataType; $optionGroup->save(); $params['option_group_id'] = $optionGroup->id; @@ -2030,6 +2032,8 @@ public static function getTableColumnGroup($fieldID, $force = FALSE) { /** * Get custom option groups. * + * @deprecated Use the API OptionGroup.get + * * @param array $includeFieldIds * Ids of custom fields for which option groups must be included. * diff --git a/CRM/Custom/Form/Field.php b/CRM/Custom/Form/Field.php index 5326a2ff108e..014ae6ad6e0e 100644 --- a/CRM/Custom/Form/Field.php +++ b/CRM/Custom/Form/Field.php @@ -318,21 +318,26 @@ public function buildQuickForm() { if ($this->_action == CRM_Core_Action::UPDATE) { $this->freeze('data_type'); } - $includeFieldIds = NULL; + + $optionGroupParams = [ + 'is_reserved' => 0, + 'is_active' => 1, + 'options' => ['limit' => 0, 'sort' => "title ASC"], + 'return' => ['title'], + ]; if ($this->_action == CRM_Core_Action::UPDATE) { - $includeFieldIds = $this->_values['id']; - } - $optionGroups = CRM_Core_BAO_CustomField::customOptionGroup($includeFieldIds); - $emptyOptGroup = FALSE; - if (empty($optionGroups)) { - $emptyOptGroup = TRUE; - $optionTypes = array('1' => ts('Create a new set of options')); + $optionGroupParams['id'] = $this->_values['id']; } - else { - $optionTypes = array( - '1' => ts('Create a new set of options'), - '2' => ts('Reuse an existing set'), - ); + // Get all custom (is_reserved=0) option groups + $optionGroupMetadata = civicrm_api3('OptionGroup', 'get', $optionGroupParams); + + // OptionGroup selection + $optionTypes = array('1' => ts('Create a new set of options')); + + if (!empty($optionGroupMetadata['values'])) { + $emptyOptGroup = FALSE; + $optionGroups = CRM_Utils_Array::collect('title', $optionGroupMetadata['values']); + $optionTypes['2'] = ts('Reuse an existing set'); $this->add('select', 'option_group_id', @@ -342,6 +347,10 @@ public function buildQuickForm() { ) + $optionGroups ); } + else { + // No custom (non-reserved) option groups + $emptyOptGroup = TRUE; + } $element = &$this->addRadio('option_type', ts('Option Type'), @@ -350,6 +359,10 @@ public function buildQuickForm() { 'onclick' => "showOptionSelect();", ), '
' ); + // if empty option group freeze the option type. + if ($emptyOptGroup) { + $element->freeze(); + } $contactGroups = CRM_Core_PseudoConstant::group(); asort($contactGroups); @@ -370,11 +383,6 @@ public function buildQuickForm() { $this->add('hidden', 'filter_selected', 'Group', array('id' => 'filter_selected')); - //if empty option group freeze the option type. - if ($emptyOptGroup) { - $element->freeze(); - } - // form fields of Custom Option rows $defaultOption = array(); $_showHide = new CRM_Core_ShowHideBlocks('', ''); diff --git a/CRM/Upgrade/Incremental/sql/5.5.alpha1.mysql.tpl b/CRM/Upgrade/Incremental/sql/5.5.alpha1.mysql.tpl index d8f9bd573ad3..7a3d52b0592e 100644 --- a/CRM/Upgrade/Incremental/sql/5.5.alpha1.mysql.tpl +++ b/CRM/Upgrade/Incremental/sql/5.5.alpha1.mysql.tpl @@ -7,3 +7,10 @@ ALTER TABLE civicrm_option_group MODIFY COLUMN is_locked TINYINT(4) NOT NULL DE #is_reserved already has a default so is effectively required but let's be explicit. UPDATE civicrm_option_group SET `is_reserved` = 0 WHERE `is_reserved` IS NULL; ALTER TABLE civicrm_option_group MODIFY COLUMN `is_reserved` tinyint(4) NOT NULL DEFAULT 1 COMMENT 'Is this a predefined system option group (i.e. it can not be deleted)?'; + +#https://lab.civicrm.org/dev/core/issues/155 +{* Fix is_reserved flag on civicrm_option_group table *} +UPDATE civicrm_option_group AS cog INNER JOIN civicrm_custom_field AS ccf +ON cog.id = ccf.option_group_id +SET cog.is_reserved = 0 WHERE cog.is_active = 1 AND ccf.is_active = 1; +UPDATE civicrm_option_group SET is_reserved = 1 WHERE name='environment'; diff --git a/xml/templates/civicrm_data.tpl b/xml/templates/civicrm_data.tpl index d101300576df..d20de95e1c7a 100644 --- a/xml/templates/civicrm_data.tpl +++ b/xml/templates/civicrm_data.tpl @@ -212,7 +212,7 @@ VALUES ('wysiwyg_presets' , '{ts escape="sql"}WYSIWYG Editor Presets{/ts}' , NULL, 1, 1, 0), ('relative_date_filters' , '{ts escape="sql"}Relative Date Filters{/ts}' , NULL, 1, 1, 0), ('pledge_status' , '{ts escape="sql"}Pledge Status{/ts}' , NULL, 1, 1, 1), - ('environment' , '{ts escape="sql"}Environment{/ts}' , NULL, 0, 1, 0); + ('environment' , '{ts escape="sql"}Environment{/ts}' , NULL, 1, 1, 0); SELECT @option_group_id_pcm := max(id) from civicrm_option_group where name = 'preferred_communication_method'; SELECT @option_group_id_act := max(id) from civicrm_option_group where name = 'activity_type';