[],'fields'=>[]]; } $d = json_decode($raw, true); if (json_last_error() !== JSON_ERROR_NONE) { logger('assoc_profile: fields file malformed'); return ['groups'=>[],'fields'=>[]]; } return $d; } function assoc_write_fields($data) { // Write the fields definition array to disk; return true on success. $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); if (!$json) return false; return file_put_contents(assoc_fields_path(), $json, LOCK_EX) !== false; } function assoc_get($slug) { // Return a single registry entry by slug, or null if not found. $r = assoc_load_registry(); return $r[$slug] ?? null; } // ---------------------------------------------------------------------------- // FIELD HELPERS // ---------------------------------------------------------------------------- function assoc_field_map() { // Return fields array keyed by nickname. $def = assoc_load_fields(); $map = []; foreach ($def['fields'] ?? [] as $f) { $map[$f['nickname']] = $f; } return $map; } function assoc_blank_entry() { // Return a new registry entry with all fields set to their defaults. $map = assoc_field_map(); $entry = []; foreach ($map as $nick => $f) { $entry[$nick] = $f['default'] ?? ''; } return $entry; } function assoc_backfill_all($new_field_def) { // Add a new field with its default to every existing registry entry. $registry = assoc_load_registry(); $nick = $new_field_def['nickname']; $default = $new_field_def['default'] ?? ''; foreach ($registry as $slug => &$entry) { if (!isset($entry[$nick])) { $entry[$nick] = $default; } } unset($entry); return $registry; } function assoc_remove_field_from_all($nickname) { // Remove a field key from every registry entry. $registry = assoc_load_registry(); foreach ($registry as $slug => &$entry) { unset($entry[$nickname]); } unset($entry); return $registry; }