Fix fatal error on loading extension page when an extension has been deleted
authoreileen <emcnaughton@wikimedia.org>
Wed, 11 Mar 2020 23:38:10 +0000 (12:38 +1300)
committereileen <emcnaughton@wikimedia.org>
Wed, 11 Mar 2020 23:38:29 +0000 (12:38 +1300)
Since we added the concept of 'hidden' tags we are loading them in a way where the exceptions are not caught. This means
that the whole page cannot load - which is needed to disable the missing extension

CRM/Extension/Mapper.php

index c86226cba17bad4ef168ab083fa51bdb10c47a3d..ce50f74495d3a000f28f9cadcaf7fc39c13acb4a 100644 (file)
@@ -171,10 +171,11 @@ class CRM_Extension_Mapper {
       }
       catch (CRM_Extension_Exception $e) {
         // file has more detailed info, but we'll fallback to DB if it's missing -- DB has enough info to uninstall
-        $this->infos[$key] = CRM_Extension_System::singleton()->getManager()->createInfoFromDB($key);
-        if (!$this->infos[$key]) {
+        $dbInfo = CRM_Extension_System::singleton()->getManager()->createInfoFromDB($key);
+        if (!$dbInfo) {
           throw $e;
         }
+        $this->infos[$key] = $dbInfo;
       }
     }
     return $this->infos[$key];
@@ -441,7 +442,16 @@ class CRM_Extension_Mapper {
    */
   public function getAllInfos() {
     foreach ($this->container->getKeys() as $key) {
-      $this->keyToInfo($key);
+      try {
+        $this->keyToInfo($key);
+      }
+      catch (CRM_Extension_Exception_ParseException $e) {
+        CRM_Core_Session::setStatus(ts('Parse error in extension: %1', [
+          1 => $e->getMessage(),
+        ]), '', 'error');
+        CRM_Core_Error::debug_log_message("Parse error in extension: " . $e->getMessage());
+        continue;
+      }
     }
     return $this->infos;
   }