') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); feat: add `getMany()` settings API by memleakd · Pull Request #163 · codeigniter4/settings · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions docs/basic-usage.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -15,6 +15,17 @@ To retrieve a config value use the `settings` service.
$siteName = service('settings')->get('App.siteName');
```

You can retrieve multiple values with `getMany()`. This behaves like calling `get()` for each key.

```php
$settings = service('settings')->getMany([
'App.siteName',
'App.siteEmail',
]);
```

Comment thread
memleakd marked this conversation as resolved.
Unlike `get()`, which returns a single value, `getMany()` returns an array keyed by the exact setting names you requested.

In this case we used the short class name, `App`, which the `config()` method automatically locates within the
`app/Config` directory. If it was from a module, it would be found there. Either way, the fully qualified name
is automatically detected by the Settings class to keep values separated from config files that may share the
Expand DownExpand Up@@ -119,6 +130,10 @@ setting('App.siteName', 'My Great Site');

// Using the service through the helper
$name = setting()->get('App.siteName');
$settings = setting()->getMany([
'App.siteName',
'App.siteEmail',
]);
setting()->set('App.siteName', 'My Great Site');
setting()->setMany([
'App.siteName' => 'My Great Site',
Expand Down
18 changes: 18 additions & 0 deletions src/Settings.php
Original file line numberDiff line numberDiff line change
Expand Up@@ -72,6 +72,24 @@ public function get(string $key, ?string $context = null)
return $config->{$property} ?? null;
}

/**
* Retrieve multiple values using the same behavior as get().
*
* @param list<string> $keys
*
* @return array<string, mixed>
*/
public function getMany(array $keys, ?string $context = null): array
{
$settings = [];

foreach ($keys as $key) {
$settings[$key] = $this->get($key, $context);
}

return $settings;
}

/**
* Save a value to the writable handler for later retrieval.
*
Expand Down
64 changes: 64 additions & 0 deletions tests/SettingsTest.php
Original file line numberDiff line numberDiff line change
Expand Up@@ -57,6 +57,70 @@ public function testGetWithContext(): void
$this->assertSame('YesContext', $this->settings->get('Example.siteName', 'testing:true'));
}

public function testGetManyReturnsMultipleValues(): void
{
$this->settings->setMany([
'Example.siteName' => 'BatchName',
'Example.siteEmail' => 'batch@example.com',
]);

$this->assertSame([
'Example.siteName' => 'BatchName',
'Example.siteEmail' => 'batch@example.com',
], $this->settings->getMany([
'Example.siteName',
'Example.siteEmail',
]));
}

public function testGetManyFallsBackToConfigValues(): void
{
$this->assertSame([
'Example.siteName' => 'Settings Test',
'Example.siteEmail' => null,
], $this->settings->getMany([
'Example.siteName',
'Example.siteEmail',
]));
}

public function testGetManyWithContext(): void
{
$this->settings->setMany([
'Example.siteName' => 'NoContext',
'Example.siteEmail' => 'general@example.com',
]);
$this->settings->setMany([
'Example.siteName' => 'YesContext',
], 'testing:true');

$this->assertSame([
'Example.siteName' => 'YesContext',
'Example.siteEmail' => 'general@example.com',
], $this->settings->getMany([
'Example.siteName',
'Example.siteEmail',
], 'testing:true'));
}

public function testGetManyPreservesRequestedKeys(): void
{
$this->settings->set('Example.siteName', 'BatchName');

$this->assertSame([
Example::class . '.siteName' => 'BatchName',
'Nada.siteName' => null,
], $this->settings->getMany([
Example::class . '.siteName',
'Nada.siteName',
]));
}

public function testGetManyAcceptsEmptyArray(): void
{
$this->assertSame([], $this->settings->getMany([]));
}

public function testSetManyStoresMultipleValues(): void
{
$this->settings->setMany([
Expand Down
Loading