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()`.
$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;
+ }
+
}
);
CRM_Utils_Hook::alterBundle($bundle);
- self::useRegion($bundle, self::REGION);
+ $bundle->fillDefaults();
return $bundle;
}
$bundle->addStyleFile('civicrm', 'css/crm-i.css', -101);
CRM_Utils_Hook::alterBundle($bundle);
- self::useRegion($bundle, self::REGION);
+ $bundle->fillDefaults();
return $bundle;
}
]);
CRM_Utils_Hook::alterBundle($bundle);
- self::useRegion($bundle, self::REGION);
+ $bundle->fillDefaults();
return $bundle;
}
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;
- }
-
}
$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']);
+ }
+
}