CiviGrant - Fix upgrade to work on multiple domains
authorColeman Watts <coleman@civicrm.org>
Fri, 28 Apr 2023 00:46:59 +0000 (20:46 -0400)
committerColeman Watts <coleman@civicrm.org>
Fri, 28 Apr 2023 00:53:25 +0000 (20:53 -0400)
CRM/Core/BAO/ConfigSetting.php
CRM/Upgrade/Incremental/php/FiveFortySeven.php
CRM/Upgrade/Incremental/php/FiveSixtyTwo.php

index 44b71780621b6192a5da56e572838547094ce1ef..00698964cfe7b16251ca4c458a8c01b5e70c65a3 100644 (file)
@@ -310,8 +310,8 @@ class CRM_Core_BAO_ConfigSetting {
    */
   public static function enableComponent($componentName) {
     $enabledComponents = Civi::settings()->get('enable_components');
-    if (in_array($componentName, $enabledComponents)) {
-      // component is already enabled
+    if (in_array($componentName, $enabledComponents, TRUE)) {
+      // Component is already enabled
       return TRUE;
     }
 
@@ -346,20 +346,13 @@ class CRM_Core_BAO_ConfigSetting {
    * @return bool
    */
   public static function disableComponent($componentName) {
-    $config = CRM_Core_Config::singleton();
-    if (!in_array($componentName, $config->enableComponents) ||
-      !array_key_exists($componentName, CRM_Core_Component::getComponents())
-    ) {
-      // Post-condition is satisfied.
+    $enabledComponents = Civi::settings()->get('enable_components');
+    if (!in_array($componentName, $enabledComponents, TRUE)) {
+      // Component is already disabled.
       return TRUE;
     }
 
-    // get enabled-components from DB and add to the list
-    $enabledComponents = Civi::settings()->get('enable_components');
-    $enabledComponents = array_diff($enabledComponents, [$componentName]);
-
-    self::setEnabledComponents($enabledComponents);
-
+    self::setEnabledComponents(array_diff($enabledComponents, [$componentName]));
     return TRUE;
   }
 
@@ -369,8 +362,7 @@ class CRM_Core_BAO_ConfigSetting {
    * @param array $enabledComponents
    */
   public static function setEnabledComponents($enabledComponents) {
-    // The on_change trigger on this setting will trigger a cache flush
-    Civi::settings()->set('enable_components', $enabledComponents);
+    Civi::settings()->set('enable_components', array_values($enabledComponents));
   }
 
   /**
index b28ab386041a5b1394fdb41a6c895460e9799255..d5a830071571461d81ab75f279bb04fffcc633fb 100644 (file)
@@ -101,9 +101,11 @@ class CRM_Upgrade_Incremental_php_FiveFortySeven extends CRM_Upgrade_Incremental
    */
   public static function migrateCiviGrant(CRM_Queue_TaskContext $ctx): bool {
     $civiGrantEnabled = CRM_Core_Component::isEnabled('CiviGrant');
-    if ($civiGrantEnabled) {
-      CRM_Core_BAO_ConfigSetting::disableComponent('CiviGrant');
-    }
+    // This was failing on multi-domain setups. See  https://github.com/civicrm/civicrm-core/pull/26043
+    // Instead, we'll handle it in FiveSixtyTwo::consolidateComponents.
+    //  if ($civiGrantEnabled) {
+    //    CRM_Core_BAO_ConfigSetting::disableComponent('CiviGrant');
+    //  }
     $civiGrantId = CRM_Core_DAO::getFieldValue('CRM_Core_DAO_Component', 'CiviGrant', 'id', 'name');
     if ($civiGrantId) {
       foreach (['civicrm_menu', 'civicrm_option_value'] as $table) {
index 2678ee99def2d6c4bd4023be944003d22d75d87c..39d2e0da2fcbe53f1cb6b6d934507199276248aa 100644 (file)
@@ -63,6 +63,10 @@ class CRM_Upgrade_Incremental_php_FiveSixtyTwo extends CRM_Upgrade_Incremental_B
 
   public static function consolidateComponents($ctx): bool {
     $final = static::findAllEnabledComponents();
+    // Ensure CiviGrant is removed from the setting, as this may have been incomplete in a previous upgrade.
+    // @see FiveFortySeven::migrateCiviGrant
+    $final = array_values(array_diff($final, ['CiviGrant']));
+
     $lowestDomainId = CRM_Core_DAO::singleValueQuery('SELECT min(domain_id) FROM civicrm_setting WHERE name = "enable_components"');
     if (!is_numeric($lowestDomainId)) {
       return TRUE;