diff --git a/CRM/Core/InnoDBIndexer.php b/CRM/Core/InnoDBIndexer.php index 5c2c8fb44d20..6d7ae283d4b8 100644 --- a/CRM/Core/InnoDBIndexer.php +++ b/CRM/Core/InnoDBIndexer.php @@ -91,6 +91,10 @@ public static function singleton($fresh = FALSE) { * Specification of the setting (per *.settings.php). */ public static function onToggleFts($oldValue, $newValue, $metadata) { + if (empty($oldValue) && empty($newValue)) { + return; + } + $indexer = CRM_Core_InnoDBIndexer::singleton(); $indexer->setActive($newValue); $indexer->fixSchemaDifferences(); diff --git a/Civi/Core/SettingsBag.php b/Civi/Core/SettingsBag.php index 2aee1eb1c205..66a663e93bad 100644 --- a/Civi/Core/SettingsBag.php +++ b/Civi/Core/SettingsBag.php @@ -352,9 +352,11 @@ protected function setDb($name, $value) { } $dao->find(TRUE); - // string comparison with 0 always return true, so to be ensure the type use === - // ref - https://stackoverflow.com/questions/8671942/php-string-comparasion-to-0-integer-returns-true - if (isset($metadata['on_change']) && !($value === 0 && ($dao->value === NULL || unserialize($dao->value) == 0))) { + // Call 'on_change' listeners. It would be nice to only fire when there's + // a genuine change in the data. However, PHP developers have mixed + // expectations about whether 0, '0', '', NULL, and FALSE represent the same + // value, so there's no universal way to determine if a change is genuine. + if (isset($metadata['on_change'])) { foreach ($metadata['on_change'] as $callback) { call_user_func( \Civi\Core\Resolver::singleton()->get($callback),