Files
breadcrumb-the-shire/core/Support/helpers/admin_settings.php

48 lines
1.5 KiB
PHP
Raw Normal View History

<?php
/**
* Merge a single-section POST body with current DB values so that
* AdminSettingsService::updateFromAdmin() only updates the fields owned
* by that section.
*
* Why this exists:
* updateFromAdmin() reads all known keys from the POST array and defaults
* missing keys to 0/empty/false (see sanitize* methods). Subpages that post
* only their own fields would otherwise wipe unrelated sections. This helper
* overlays the section's POST fields onto the current DB values formatted as
* POST scalars, preserving checkbox semantics (omitted key = unchecked).
*
* @param array<string, mixed> $currentValues 'values' map from buildPageData()
* @param array<string, mixed> $post user POST body (bodyAll())
* @param list<string> $sectionKeys keys owned by this section
* @return array<string, mixed>
*/
function settingsSectionMergePost(array $currentValues, array $post, array $sectionKeys): array
{
$seed = [];
foreach ($currentValues as $key => $value) {
if (is_bool($value)) {
if ($value) {
$seed[$key] = '1';
}
continue;
}
if (is_array($value)) {
$seed[$key] = $value;
continue;
}
if ($value !== null) {
$seed[$key] = (string) $value;
}
}
foreach ($sectionKeys as $key) {
unset($seed[$key]);
if (array_key_exists($key, $post)) {
$seed[$key] = $post[$key];
}
}
return $seed;
}