SettingsBag - Fix upgrade failure for WP 4.4=>4.7
authorTim Otten <totten@civicrm.org>
Tue, 26 Jan 2016 01:49:32 +0000 (17:49 -0800)
committerTim Otten <totten@civicrm.org>
Tue, 26 Jan 2016 09:01:43 +0000 (01:01 -0800)
The WP integration attempts to define a new setting (`wpLoadPhp`) during
bootstrap -- before upgrade logic has run.  This was failing because the
`group_name` property wouldn't get passed through by DAO (because the DAO is
newer than the schema).

CRM/Core/Config.php
CRM/Utils/SQL/Insert.php
Civi/Core/SettingsBag.php

index 79757178ea29280a2fa253c35ebd39e3da6255cf..a0b34fad49a0be10feec7e0d759509beb7c23b8e 100644 (file)
@@ -413,6 +413,15 @@ class CRM_Core_Config extends CRM_Core_Config_MagicMerge {
       return TRUE;
     }
 
+    if ($path && preg_match('/^civicrm\/ajax\/l10n-js/', $path)
+      && !empty($_SERVER['HTTP_REFERER'])
+    ) {
+      $ref = parse_url($_SERVER['HTTP_REFERER']);
+      if (preg_match('/civicrm\/upgrade/', $ref['path']) || preg_match('/civicrm\/upgrade/', urldecode($ref['query']))) {
+        return TRUE;
+      }
+    }
+
     return FALSE;
   }
 
index 627473df145e1f8d9d1cc5108abad9958ce5b54d..e7f6d69dfd2e46b7275d74e4a0c0368fb124fce0 100644 (file)
@@ -50,6 +50,28 @@ class CRM_Utils_SQL_Insert {
     return new self($table);
   }
 
+  /**
+   * Insert a record based on a DAO.
+   *
+   * @param \CRM_Core_DAO $dao
+   * @return \CRM_Utils_SQL_Insert
+   * @throws \CRM_Core_Exception
+   */
+  public static function dao(CRM_Core_DAO $dao) {
+    $table = CRM_Core_DAO::getLocaleTableName($dao->getTableName());
+    $row = array();
+    foreach ((array) $dao as $key => $value) {
+      if ($value === 'null') {
+        $value = NULL; // Blerg!!!
+      }
+      // Skip '_foobar' and '{\u00}*_options' and 'N'.
+      if (preg_match('/[a-zA-Z]/', $key{0}) && $key !== 'N') {
+        $row[$key] = $value;
+      }
+    }
+    return self::into($table)->row($row);
+  }
+
   /**
    * Create a new SELECT query.
    *
index 05fe3a1229cd3f5b5ac2a1253c982b3c91228fc2..14585e999a70c8f8a486045ec292b8aeacb9b3d8 100644 (file)
@@ -385,7 +385,14 @@ class SettingsBag {
       $dao->created_id = $session->get('userID');
     }
 
-    $dao->save();
+    if ($dao->id) {
+      $dao->save();
+    }
+    else {
+      // Cannot use $dao->save(); in upgrade mode (eg WP + Civi 4.4=>4.7), the DAO will refuse
+      // to save the field `group_name`, which is required in older schema.
+      \CRM_Core_DAO::executeQuery(\CRM_Utils_SQL_Insert::dao($dao)->toSQL());
+    }
     $dao->free();
   }