(REF) Convert hidden function 'useRegion' to public 'fillDefaults'
authorTim Otten <totten@civicrm.org>
Fri, 2 Oct 2020 00:16:44 +0000 (17:16 -0700)
committerTim Otten <totten@civicrm.org>
Fri, 2 Oct 2020 05:51:17 +0000 (22:51 -0700)
This mostly affects a hypothetical bundle defined outside of core's `Common.php`:

* Before: You cannot re-use `useRegion()`. You'd have to write it again.

* After: You can re-use and/or override `fillDefaults()`.

CRM/Core/Resources/Bundle.php
CRM/Core/Resources/Common.php
tests/phpunit/CRM/Core/Resources/BundleTest.php

index 62c1a04269589c1d920fea34b483eb8290e29f69..7c89dd1aa3a63cb1125483410da85770053377d5 100644 (file)
@@ -38,4 +38,27 @@ class CRM_Core_Resources_Bundle implements CRM_Core_Resources_CollectionInterfac
     $this->types = $types ?: ['script', 'scriptFile', 'scriptUrl', 'settings', 'style', 'styleFile', 'styleUrl'];
   }
 
+  /**
+   * Fill in default values for the 'region' property.
+   *
+   * @return static
+   */
+  public function fillDefaults() {
+    $this->filter(function ($s) {
+      if (!isset($s['region'])) {
+        if ($s['type'] === 'settings') {
+          $s['region'] = NULL;
+        }
+        elseif (preg_match(';^(markup|template|callback);', $s['type'])) {
+          $s['region'] = 'page-header';
+        }
+        else {
+          $s['region'] = CRM_Core_Resources_Common::REGION;
+        }
+      }
+      return $s;
+    });
+    return $this;
+  }
+
 }
index c85abeaec0a1f8cd0df96490cc7629377eac688b..44b36873760adc0b44b753e9669256dc6a3e389d 100644 (file)
@@ -47,7 +47,7 @@ class CRM_Core_Resources_Common {
     );
 
     CRM_Utils_Hook::alterBundle($bundle);
-    self::useRegion($bundle, self::REGION);
+    $bundle->fillDefaults();
     return $bundle;
   }
 
@@ -76,7 +76,7 @@ class CRM_Core_Resources_Common {
     $bundle->addStyleFile('civicrm', 'css/crm-i.css', -101);
 
     CRM_Utils_Hook::alterBundle($bundle);
-    self::useRegion($bundle, self::REGION);
+    $bundle->fillDefaults();
     return $bundle;
   }
 
@@ -133,7 +133,7 @@ class CRM_Core_Resources_Common {
     ]);
 
     CRM_Utils_Hook::alterBundle($bundle);
-    self::useRegion($bundle, self::REGION);
+    $bundle->fillDefaults();
     return $bundle;
   }
 
@@ -273,21 +273,4 @@ class CRM_Core_Resources_Common {
     return $items;
   }
 
-  /**
-   * Ensure that all elements of the bundle are in the same region.
-   *
-   * @param CRM_Core_Resources_Bundle $bundle
-   * @param string $region
-   * @return CRM_Core_Resources_Bundle
-   */
-  protected static function useRegion($bundle, $region) {
-    $bundle->filter(function ($s) use ($region) {
-      if ($s['type'] !== 'settings' && !isset($s['region'])) {
-        $s['region'] = $region;
-      }
-      return $s;
-    });
-    return $bundle;
-  }
-
 }
index 87630bf0214ffe3f2e27fffda4386bfc44768bba..08490b979471e6d522d0f5531b8b97d15de78305 100644 (file)
@@ -56,4 +56,20 @@ class CRM_Core_Resources_BundleTest extends CiviUnitTestCase {
     $this->assertEquals('http://example.com/region.css', $region->get('http://example.com/region.css')['styleUrl']);
   }
 
+  /**
+   * Add some resources - sometimes forgetting to set a 'region'. Fill in missing regions.
+   */
+  public function testFillDefaults() {
+    $bundle = new CRM_Core_Resources_Bundle(__FUNCTION__, ['scriptUrl', 'styleUrl', 'markup']);
+    $bundle->addScriptUrl('http://example.com/myscript.js');
+    $bundle->addStyleUrl('http://example.com/yonder-style.css', ['region' => 'yonder']);
+    $bundle->addMarkup('<b>Cheese</b>', ['name' => 'cheese']);
+
+    $bundle->fillDefaults();
+
+    $this->assertEquals('html-header', $bundle->get('http://example.com/myscript.js')['region']);
+    $this->assertEquals('yonder', $bundle->get('http://example.com/yonder-style.css')['region']);
+    $this->assertEquals('page-header', $bundle->get('cheese')['region']);
+  }
+
 }