Custom Field display code assumes option values are numeric
Overview
Custom Field display code assumes option values are numeric. This leads to crashing when searching using regex/LIKE
in Search Builder, and possibly less obsolete parts of Civi as well.
Reproduction steps
- Create a new custom field of data type Alphanumeric, HTML type of Select.
- Go to Search Builder.
- Search on that field using regex or
LIKE
, with a period in the search term. See attached screenshot.
Current behaviour
TypeError: round(): Argument #1 ($num) must be of type int|float, string given in round() (line 1332 of /home/jon/local/civicrm-buildkit/build/dmaster/web/sites/all/modules/civicrm/CRM/Core/BAO/CustomField.php).
Expected behaviour
Search should complete as normal.
Comments
This happens because we assume that a select value either has a corresponding label, or it's a number. Which is true when you're searching for a specific value, but fails when the value is a regex or LIKE statement.
This doesn't happen in SearchKit, but it does happen when you use a smart group based on the search.
This is a regression in the technical sense, but it's been broken since at least 5.53.
Backtrace is below:
#0 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/BAO/CustomField.php(1278): round()
#1 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/BAO/CustomField.php(1194): CRM_Core_BAO_CustomField::formatDisplayValue()
#2 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/BAO/CustomQuery.php(197): CRM_Core_BAO_CustomField::displayValue()
#3 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/BAO/CustomQuery.php(369): CRM_Core_BAO_CustomQuery->where()
#4 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Contact/BAO/Query.php(569): CRM_Core_BAO_CustomQuery->query()
#5 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Contact/BAO/Query.php(524): CRM_Contact_BAO_Query->initialize()
#6 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Contact/BAO/GroupContactCache.php(585): CRM_Contact_BAO_Query->__construct()
#7 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Contact/BAO/GroupContactCache.php(777): CRM_Contact_BAO_GroupContactCache::getQueryObjectSQL()
#8 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Contact/BAO/GroupContactCache.php(616): CRM_Contact_BAO_GroupContactCache::insertGroupContactsIntoTempTable()
#9 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Contact/BAO/GroupContactCache.php(359): CRM_Contact_BAO_GroupContactCache::buildGroupContactTempTable()
#10 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Mailing/BAO/Mailing.php(477): CRM_Contact_BAO_GroupContactCache::load()
#11 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Mailing/BAO/Mailing.php(1647): CRM_Mailing_BAO_Mailing::doSubmitActions()
#12 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/api/v3/utils.php(1294): CRM_Mailing_BAO_Mailing::create()
#13 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/api/v3/Mailing.php(55): _civicrm_api3_basic_create()
#14 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Provider/MagicFunctionProvider.php(89): civicrm_api3_mailing_create()
#15 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Kernel.php(156): Civi\API\Provider\MagicFunctionProvider->invoke()
#16 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Kernel.php(79): Civi\API\Kernel->runRequest()
#17 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/api/api.php(136): Civi\API\Kernel->runSafe()
#18 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/api/v3/Mailing.php(307): civicrm_api3()
#19 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Provider/MagicFunctionProvider.php(89): civicrm_api3_mailing_submit()
#20 /home/members/mysite/sites/crm.mysite.org/web/wp-content/civicrm-custom/extensions/uk.co.vedaconsulting.mosaico/CRM/Mosaico/AbDemux.php(128): Civi\API\Provider\MagicFunctionProvider->invoke()
#21 [internal function]: CRM_Mosaico_AbDemux->onSubmitMailing()
#22 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Provider/WrappingProvider.php(48): call_user_func()
#23 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Kernel.php(156): Civi\API\Provider\WrappingProvider->invoke()
#24 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/Civi/API/Kernel.php(79): Civi\API\Kernel->runRequest()
#25 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/api/api.php(28): Civi\API\Kernel->runSafe()
#26 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Utils/REST.php(288): civicrm_api()
#27 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Utils/REST.php(533): CRM_Utils_REST::process()
#28 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/Invoke.php(288): CRM_Utils_REST::ajax()
#29 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/Invoke.php(69): CRM_Core_Invoke::runItem()
#30 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm/CRM/Core/Invoke.php(36): CRM_Core_Invoke::_invoke()
#31 /home/members/mysite/sites/crm.mysite.org/web/wp-content/plugins/civicrm/civicrm.php(1199): CRM_Core_Invoke::invoke()
#32 /home/members/mysite/sites/crm.mysite.org/web/wp-includes/class-wp-hook.php(310): CiviCRM_For_WordPress->invoke()
#33 /home/members/mysite/sites/crm.mysite.org/web/wp-includes/class-wp-hook.php(334): WP_Hook->apply_filters()
#34 /home/members/mysite/sites/crm.mysite.org/web/wp-includes/plugin.php(517): WP_Hook->do_action()
#35 /home/members/mysite/sites/crm.mysite.org/web/wp-admin/admin.php(259): do_action()
#36 {main}