From 2fea9ed9978df8a7618e66ee87fe9ad98fdb5b3e Mon Sep 17 00:00:00 2001 From: Coleman Watts Date: Thu, 3 Apr 2014 19:13:37 -0400 Subject: [PATCH] HR-322 - Ensure customFieldOptions hook is always called for custom fields --- CRM/Core/BAO/CustomField.php | 21 ++++++++------------- CRM/Core/BAO/CustomOption.php | 4 ++-- CRM/Core/PseudoConstant.php | 8 ++++---- 3 files changed, 14 insertions(+), 19 deletions(-) diff --git a/CRM/Core/BAO/CustomField.php b/CRM/Core/BAO/CustomField.php index a99fe523ee..e255b0d4f7 100644 --- a/CRM/Core/BAO/CustomField.php +++ b/CRM/Core/BAO/CustomField.php @@ -758,9 +758,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { } } // Add data so popup link. Normally this is handled by CRM_Core_Form->addSelect - //HR-322, For html type Select sometime we don't rely on $field->option_group_id but - //use customFieldOptions hook to populate options, so we include that on condition - if (in_array($field->html_type, array('Select', 'Multi-Select')) && $field->option_group_id && !$search && CRM_Core_Permission::check('administer CiviCRM')) { + if ($field->option_group_id && !$search && in_array($field->html_type, array('Select', 'Multi-Select')) && CRM_Core_Permission::check('administer CiviCRM')) { $selectAttributes += array( 'data-api-entity' => 'contact', // FIXME: This works because the getoptions api isn't picky about custom fields, but it's WRONG 'data-api-field' => 'custom_' . $field->id, @@ -853,7 +851,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { case 'Radio': $choice = array(); if ($field->data_type != 'Boolean') { - $customOption = &CRM_Core_BAO_CustomOption::valuesByID($field->id, + $customOption = CRM_Core_BAO_CustomOption::valuesByID($field->id, $field->option_group_id ); foreach ($customOption as $v => $l) { @@ -875,13 +873,9 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { break; case 'Select': - if ($field->option_group_id) { - $selectOption = &CRM_Core_BAO_CustomOption::valuesByID($field->id, - $field->option_group_id - ); - } - //HR-322, extend Select type custom field which use customFieldOptions hook to populate its option - CRM_Utils_Hook::customFieldOptions($field->id, $selectOption, FALSE, $selectAttributes); + $selectOption = CRM_Core_BAO_CustomOption::valuesByID($field->id, + $field->option_group_id + ); $qf->add('select', $elementName, $label, array('' => $placeholder) + $selectOption, @@ -893,7 +887,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { //added for select multiple case 'AdvMulti-Select': - $selectOption = &CRM_Core_BAO_CustomOption::valuesByID($field->id, + $selectOption = CRM_Core_BAO_CustomOption::valuesByID($field->id, $field->option_group_id ); if ($search && @@ -923,7 +917,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { break; case 'Multi-Select': - $selectOption = &CRM_Core_BAO_CustomOption::valuesByID($field->id, + $selectOption = CRM_Core_BAO_CustomOption::valuesByID($field->id, $field->option_group_id ); if ($search && @@ -1044,6 +1038,7 @@ class CRM_Core_BAO_CustomField extends CRM_Core_DAO_CustomField { $qf->addRule($elementName, ts('Select a valid contact for %1.', array(1 => $label)), 'validContact', $actualElementValue); } else { + // FIXME: This won't work with customFieldOptions hook $attributes = array(); // Fixme: why is this a string in the first place??? if ($field->attributes) { diff --git a/CRM/Core/BAO/CustomOption.php b/CRM/Core/BAO/CustomOption.php index 3bd36cd0a4..2035dc37cb 100644 --- a/CRM/Core/BAO/CustomOption.php +++ b/CRM/Core/BAO/CustomOption.php @@ -277,7 +277,7 @@ SET {$dao->columnName} = REPLACE( {$dao->columnName}, %1, %2 )"; } } - static function &valuesByID($customFieldID, $optionGroupID = NULL) { + static function valuesByID($customFieldID, $optionGroupID = NULL) { if (!$optionGroupID) { $optionGroupID = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_CustomField', $customFieldID, @@ -285,7 +285,7 @@ SET {$dao->columnName} = REPLACE( {$dao->columnName}, %1, %2 )"; ); } - $options = CRM_Core_OptionGroup::valuesByID($optionGroupID); + $options = $optionGroupID ? CRM_Core_OptionGroup::valuesByID($optionGroupID) : array(); CRM_Utils_Hook::customFieldOptions($customFieldID, $options, FALSE); diff --git a/CRM/Core/PseudoConstant.php b/CRM/Core/PseudoConstant.php index 721748c528..0213b7ce7d 100644 --- a/CRM/Core/PseudoConstant.php +++ b/CRM/Core/PseudoConstant.php @@ -247,7 +247,7 @@ class CRM_Core_PseudoConstant { if (!empty($customField->option_group_id)) { $options = CRM_Core_OptionGroup::valuesByID($customField->option_group_id, - $flip, + FALSE, $params['grouping'], $params['localize'], // Note: for custom fields the 'name' column is NULL @@ -266,10 +266,10 @@ class CRM_Core_PseudoConstant { elseif ($customField->data_type === 'Boolean') { $options = $context == 'validate' ? array(0, 1) : array(1 => ts('Yes'), 0 => ts('No')); } - $options = $options && $flip ? array_flip($options) : $options; } - if ($options !== FALSE) { - CRM_Utils_Hook::customFieldOptions($customField->id, $options, FALSE); + CRM_Utils_Hook::customFieldOptions($customField->id, $options, FALSE); + if ($options && $flip) { + $options = array_flip($options); } $customField->free(); return $options; -- 2.25.1