HR-287 - CRM_Core_BAO_Setting - Guard against duplicate settings folders
authorTim Otten <totten@civicrm.org>
Tue, 25 Feb 2014 01:16:53 +0000 (17:16 -0800)
committerTim Otten <totten@civicrm.org>
Tue, 25 Feb 2014 01:16:53 +0000 (17:16 -0800)
Not sure this is needed, but there's been some example code floating around
in which extensions use buggy self-defenses to avoid duplicates.

CRM/Core/BAO/Setting.php

index 7449521ab12e83c33ee96dedd7868feddfd35f19..5278501212053b886c849ba07999bc3e230ee138 100644 (file)
@@ -637,13 +637,10 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting {
     if ($settingsMetadata === NULL) {
       $settingsMetadata = CRM_Core_BAO_Cache::getItem('CiviCRM setting Spec', 'All', $componentID);
       if (empty($settingsMetadata)) {
-        $settingsMetadata = array();
         global $civicrm_root;
         $metaDataFolders = array($civicrm_root. '/settings');
         CRM_Utils_Hook::alterSettingsFolders($metaDataFolders);
-        foreach ($metaDataFolders as $metaDataFolder) {
-          $settingsMetadata = $settingsMetadata + self::loadSettingsMetaData($metaDataFolder);
-        }
+        $settingsMetadata = self::loadSettingsMetaDataFolders($metaDataFolders);
         CRM_Core_BAO_Cache::setItem($settingsMetadata,'CiviCRM setting Spec', 'All', $componentID);
       }
       $cached = 0;
@@ -667,6 +664,24 @@ class CRM_Core_BAO_Setting extends CRM_Core_DAO_Setting {
 
   }
 
+  /**
+   * Load the settings files defined in a series of folders
+   * @param array $metaDataFolders list of folder paths
+   * @return array
+   */
+  public static function loadSettingsMetaDataFolders($metaDataFolders) {
+    $settingsMetadata = array();
+    $loadedFolders = array();
+    foreach ($metaDataFolders as $metaDataFolder) {
+      $realFolder = realpath($metaDataFolder);
+      if (is_dir($realFolder) && !isset($loadedFolders[$realFolder])) {
+        $loadedFolders[$realFolder] = TRUE;
+        $settingsMetadata = $settingsMetadata + self::loadSettingsMetaData($metaDataFolder);
+      }
+    }
+    return $settingsMetadata;
+  }
+
   /**
    * Load up settings metadata from files
    */