/v2/widgetDesign-Widget anlegen
Fügt ein Widget zu design und template hinzu. design, template, key und config sind erforderlich; key muss in der aktuellen Widget-LUT verfügbar sein. HTML-ID und Layout-CSS werden erzeugt. config.data ist ein offenes, vom Widgettyp und Konto abhängiges Einstellungsobjekt; unbekannte oder ungültige Einträge werden vom Handler abgewiesen. data akzeptiert einen Datensatz oder ein Array mit bis zu 100 Datensätzen; bei einem Batch enthält data.id ein Array öffentlicher IDs.
Operation-ID post_v2_widget
Vertrag & Verhalten
- Dokumentationsstand
- reviewed
- Ändert Zustand
- Ja
- Als readOnly markiert
- Nein
- Für Automation markiert
- Nein
Authentifizierung
Eine der folgenden Alternativen muss erfüllt sein (ODER). Innerhalb jeder Alternative werden alle angegebenen Schemas gemeinsam benötigt (UND).
Alternative 1
bearerAuthhttp · bearerExisting edoobox v2 access token. Never substitute API key/secret headers.
Format: JWT
Security-Schema als JSON
{
"type": "http",
"scheme": "bearer",
"bearerFormat": "JWT",
"description": "Existing edoobox v2 access token. Never substitute API key/secret headers."
}accountContextapiKeySelected login/account context from the JWT, not a database primary key. Required even for a JWT with one account.
header: edid
Security-Schema als JSON
{
"type": "apiKey",
"in": "header",
"name": "edid",
"description": "Selected login/account context from the JWT, not a database primary key. Required even for a JWT with one account."
}Alternative 2
sessionCookieapiKeyExisting browser login session, with the same permission checks as Bearer authentication.
cookie: _edlogin
Security-Schema als JSON
{
"type": "apiKey",
"in": "cookie",
"name": "_edlogin",
"description": "Existing browser login session, with the same permission checks as Bearer authentication."
}accountContextapiKeySelected login/account context from the JWT, not a database primary key. Required even for a JWT with one account.
header: edid
Security-Schema als JSON
{
"type": "apiKey",
"in": "header",
"name": "edid",
"description": "Selected login/account context from the JWT, not a database primary key. Required even for a JWT with one account."
}Parameter
Header
languageoptionalAccount language code, where the resource supports setLanguage().
Schema-Beispiel
"de"Vollständiges Schema als JSON
{
"type": "string",
"examples": [
"de"
]
}X-Edoobox-If-RevisionoptionalOptional account mutation revision from a preceding authenticated auth-context snapshot. The dispatcher compares it while holding the account lock; mismatch409 requires a new review.
- pattern
"^[a-f0-9]{32}$"
Schema-Beispiel
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"Vollständiges Schema als JSON
{
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"examples": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
}Request Body
erforderlichapplication/json
data Typ nicht eingeschränkt erforderlich anyOf · Mindestens eine Variante muss passen
Variante 1 object Source-declared fields; action-specific and account validation still apply.
- minProperties
1
id kein Wert zulässig design string erforderlich bei Anlage erforderlich beim Ändern nicht schreibbar Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.
- pattern
"^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$"
Schema-Beispiel
"design_012345abcdef_123456"Feld-Metadaten aus der Spezifikation
{
"x-edoobox-writableOnUpdate": false,
"x-edoobox-requiredOnCreate": true,
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 38
}template string erforderlich Allowlist a..s; invalid strings returnfalse -> ED80100. Required create field, generic PUT immutable. Non-strict in_array allowlist then aP; manager chooses widget definitions for template/account/style. Runtime preconditions / rejection: Unknown string template -> ED80100. Widget key not offered for template/account/style -> missing_lut_widget. Scope / limitations: Canonical string keys documented; non-strict in_array has unusual scalar-coercion edges, not a separate template API.
"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s"Schema-Beispiel
"a"Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "source-reviewed",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 52,
"lineStart": 52,
"lineEnd": 69,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "d125dfff1f7e616ba3a9089e77e4c41634b8a344f49db1807d72c020939f7e01",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "Before-insert validates selected template/key config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing and capability/Bootstrap filters."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}key string erforderlich Exact widget key from the current account/template/style Widgetmanager LUT. Native before-insert validates the original key; unknown keys fail ED80100 missing_lut_widget. This is not a free text field validated merely by a250-character storage normalizer. Read the widget LUT for currently available keys.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-validation": "array_key_exists(original key, Widgetmanager::getWidgetsTemplate(true, template, new, fid, styleId))",
"x-edoobox-schemaStatus": "source-reviewed-runtime-widget-lookup",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 70,
"lineEnd": 82,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "Key getter exists, but POST acceptance additionally validates the original untruncated key against the exact runtime LUT; generic PUT marks key immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
}order Typ nicht eingeschränkt Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction.
Schema-Beispiel
1Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 84,
"x-edoobox-canonicalType": "integer",
"x-edoobox-normalization": "PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction."
}html_id Typ nicht eingeschränkt Caller input is overwritten by the Widget before-insert hook. Native code generates wdg + original widget key + uniqid; supplied values do not select the stored HTML id. No caller-supplied250-character storage claim is made.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-ignored-input": true,
"x-edoobox-schemaStatus": "source-reviewed-generated-field",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 94,
"lineEnd": 102,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "The input getter is superseded by before-insert generation; response setter uses aQ and generic PUT is immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
}config object | array erforderlich Common widget layout/config envelope for POST/PUT. Unknown top-level config keys ignored; unknown data keys rejected. Nested numeric bounds mostly control copying, not rejection. The object is canonical; no explicit top-level is_array rejection is implemented. PHP JSON object/array values both decode to arrays; empty/non-keyed config arrays leave default/stored config unchanged. POST get is placeholdertrue; before-insert calls validWidgetConfig. PUT calls same validator using existing stored config. Layout numbers cast/ignore invalid entries; names/inputs truncate. GET replaces empty Structure setter and converts per-field types after decode. Runtime preconditions / rejection: Missing template/key definition -> missing_lut_widget. Unknown data property or invalid key spelling -> config_data_field_not_exist. Select/checkbox/datastructure value not in dynamic definition -> config_data_field_value_invalid. Duplicate bformular participant-field binding -> config_data_field_already_linked. Invalid join default -> config_data_field_default_value_not_exist, except promo sale selection fallback. Promo-sale prices must normalize to at least one positive finite decimal, otherwise config_data_field_value_invalid. Scope / limitations: Common envelope is resolved; full per-widget/LUT/account schema union is intentionally not enumerated. Dynamic data map remains permissive with explicit validation description. visibility_tags_include/exclude accepts arrays: documented form is {tag: publicv2ID}. Legacy scalar fallback casts internal IDs, which must never be used in external examples. bformular country/language defaults can transform public country IDs/language keys in their applicable branch. Runtime account languages, membership/Bootstrap filters and definition methods determine exact data keys; no single closed data object is proven.
Schema-Beispiel
{
"name": "Synthetic text block",
"visible": {
"showpho": true,
"type": 1
},
"data": {
"showiframe": "1",
"showsammel": "0"
}
}name Typ nicht eingeschränkt aP(...,true,150), truncates rather than rejecting length.
Kanonischer Typ nach Normalisierung: string. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "string"
}width object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}min Typ nicht eingeschränkt Caller-supplied comparison minimum; not a fixed server validator.
Kanonischer Typ nach Normalisierung: number. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "number"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
height object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}min Typ nicht eingeschränkt Caller-supplied comparison minimum.
Kanonischer Typ nach Normalisierung: number. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "number"
}auto Typ nicht eingeschränkt Only cast values1/2/3 copied; other values ignored.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer",
"x-edoobox-recognizedValues": [
1,
2,
3
]
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
margin object left object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
top object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
visible object showpho Typ nicht eingeschränkt Only stricttrue enables; everything else becomes false.
Kanonischer Typ nach Normalisierung: boolean. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "boolean"
}type Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
data object Widget-definition-specific keys and value forms. Select/checkbox/datastructure/default checks reject; input/integer/join/json/base64 forms normalize. Allowed keys depend on template/key/account languages/features/style.
Schema für zusätzliche Felder
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "reviewed-dynamic-widget-map"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "source-reviewed-dynamic-envelope",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 104,
"lineStart": 104,
"lineEnd": 116,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "8c74e6f4c65610843796bd8bb20351c22fab3f754a8c80b28294eab9bd1b6fa9",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 151,
"lineStart": 151,
"lineEnd": 196,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "284bae8394c5dfde4b955795281105d8eb14e50ca5b9eb0a858250050ae921f5",
"reason": "func delegates to _putWidgetConfig"
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "POST before-insert delegates to config validator."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineStart": 210,
"lineEnd": 578,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "4256de6c9e572438e9ee93564e1c0fd3e3de8130a46717bbdbd9d5bbc6dd2954",
"reason": "Complete config validator: envelope copying, dynamic data dispatch, rejection, normalization and persistence."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 13,
"lineStart": 13,
"lineEnd": 38,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "cc205b761bed5fe381e50ce4ea4852f48d4c71fab9b9024aa5d694c05727ecbc",
"reason": "Visibility-tag public-ID objects and legacy raw-ID fallback; publish only public IDs."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 580,
"lineStart": 580,
"lineEnd": 603,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "c1ece99a73d47b79be3af4614b18c25a2a6da2b8c906819f48112a38ad1b9db2",
"reason": "Promo price normalization to positive finite decimals."
},
{
"file": "application/models/v2/Widget.php",
"line": 213,
"lineStart": 213,
"lineEnd": 329,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "9fdfd0cde04c0a48fa910b0451939838cce8d6946711064e013fc4f8588389ce",
"reason": "Actual GET replaces empty declared setter and returns normalized config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing, capabilities and Bootstrap filtering determine dynamic definitions."
},
{
"file": "application/models/Widgetmanager.php",
"line": 7282,
"lineStart": 7282,
"lineEnd": 7380,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "6c1613bbc268dca6e138f967dcefca91af35b6f5400bfdaa2c5f9ff7d19379f7",
"reason": "Concrete textb definition proves example keys and language-dependent inputs."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Variante 2 array - minItems
1- maxItems
100
Array-Elemente
Source-declared fields; action-specific and account validation still apply.
id kein Wert zulässig design string erforderlich bei Anlage erforderlich beim Ändern nicht schreibbar Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.
- pattern
"^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$"
Schema-Beispiel
"design_012345abcdef_123456"Feld-Metadaten aus der Spezifikation
{
"x-edoobox-writableOnUpdate": false,
"x-edoobox-requiredOnCreate": true,
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 38
}template string erforderlich Allowlist a..s; invalid strings returnfalse -> ED80100. Required create field, generic PUT immutable. Non-strict in_array allowlist then aP; manager chooses widget definitions for template/account/style. Runtime preconditions / rejection: Unknown string template -> ED80100. Widget key not offered for template/account/style -> missing_lut_widget. Scope / limitations: Canonical string keys documented; non-strict in_array has unusual scalar-coercion edges, not a separate template API.
"a""b""c""d""e""f""g""h""i""j""k""l""m""n""o""p""q""r""s"Schema-Beispiel
"a"Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "source-reviewed",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 52,
"lineStart": 52,
"lineEnd": 69,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "d125dfff1f7e616ba3a9089e77e4c41634b8a344f49db1807d72c020939f7e01",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "Before-insert validates selected template/key config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing and capability/Bootstrap filters."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}key string erforderlich Exact widget key from the current account/template/style Widgetmanager LUT. Native before-insert validates the original key; unknown keys fail ED80100 missing_lut_widget. This is not a free text field validated merely by a250-character storage normalizer. Read the widget LUT for currently available keys.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-validation": "array_key_exists(original key, Widgetmanager::getWidgetsTemplate(true, template, new, fid, styleId))",
"x-edoobox-schemaStatus": "source-reviewed-runtime-widget-lookup",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 70,
"lineEnd": 82,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "Key getter exists, but POST acceptance additionally validates the original untruncated key against the exact runtime LUT; generic PUT marks key immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
}order Typ nicht eingeschränkt Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction.
Schema-Beispiel
1Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 84,
"x-edoobox-canonicalType": "integer",
"x-edoobox-normalization": "PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction."
}html_id Typ nicht eingeschränkt Caller input is overwritten by the Widget before-insert hook. Native code generates wdg + original widget key + uniqid; supplied values do not select the stored HTML id. No caller-supplied250-character storage claim is made.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-ignored-input": true,
"x-edoobox-schemaStatus": "source-reviewed-generated-field",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 94,
"lineEnd": 102,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "The input getter is superseded by before-insert generation; response setter uses aQ and generic PUT is immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
}config object | array erforderlich Common widget layout/config envelope for POST/PUT. Unknown top-level config keys ignored; unknown data keys rejected. Nested numeric bounds mostly control copying, not rejection. The object is canonical; no explicit top-level is_array rejection is implemented. PHP JSON object/array values both decode to arrays; empty/non-keyed config arrays leave default/stored config unchanged. POST get is placeholdertrue; before-insert calls validWidgetConfig. PUT calls same validator using existing stored config. Layout numbers cast/ignore invalid entries; names/inputs truncate. GET replaces empty Structure setter and converts per-field types after decode. Runtime preconditions / rejection: Missing template/key definition -> missing_lut_widget. Unknown data property or invalid key spelling -> config_data_field_not_exist. Select/checkbox/datastructure value not in dynamic definition -> config_data_field_value_invalid. Duplicate bformular participant-field binding -> config_data_field_already_linked. Invalid join default -> config_data_field_default_value_not_exist, except promo sale selection fallback. Promo-sale prices must normalize to at least one positive finite decimal, otherwise config_data_field_value_invalid. Scope / limitations: Common envelope is resolved; full per-widget/LUT/account schema union is intentionally not enumerated. Dynamic data map remains permissive with explicit validation description. visibility_tags_include/exclude accepts arrays: documented form is {tag: publicv2ID}. Legacy scalar fallback casts internal IDs, which must never be used in external examples. bformular country/language defaults can transform public country IDs/language keys in their applicable branch. Runtime account languages, membership/Bootstrap filters and definition methods determine exact data keys; no single closed data object is proven.
Schema-Beispiel
{
"name": "Synthetic text block",
"visible": {
"showpho": true,
"type": 1
},
"data": {
"showiframe": "1",
"showsammel": "0"
}
}name Typ nicht eingeschränkt aP(...,true,150), truncates rather than rejecting length.
Kanonischer Typ nach Normalisierung: string. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "string"
}width object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}min Typ nicht eingeschränkt Caller-supplied comparison minimum; not a fixed server validator.
Kanonischer Typ nach Normalisierung: number. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "number"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
height object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}min Typ nicht eingeschränkt Caller-supplied comparison minimum.
Kanonischer Typ nach Normalisierung: number. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "number"
}auto Typ nicht eingeschränkt Only cast values1/2/3 copied; other values ignored.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer",
"x-edoobox-recognizedValues": [
1,
2,
3
]
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
margin object left object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
top object setpc Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}settab Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}setpho Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
visible object showpho Typ nicht eingeschränkt Only stricttrue enables; everything else becomes false.
Kanonischer Typ nach Normalisierung: boolean. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "boolean"
}type Typ nicht eingeschränkt PHP int normalization, not strict rejecting wire numeric restriction.
Kanonischer Typ nach Normalisierung: integer. Dies ist keine zusätzliche Einschränkung des Eingabetyps.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-canonicalType": "integer"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
data object Widget-definition-specific keys and value forms. Select/checkbox/datastructure/default checks reject; input/integer/join/json/base64 forms normalize. Allowed keys depend on template/key/account languages/features/style.
Schema für zusätzliche Felder
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "reviewed-dynamic-widget-map"
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-schemaStatus": "source-reviewed-dynamic-envelope",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 104,
"lineStart": 104,
"lineEnd": 116,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "8c74e6f4c65610843796bd8bb20351c22fab3f754a8c80b28294eab9bd1b6fa9",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 151,
"lineStart": 151,
"lineEnd": 196,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "284bae8394c5dfde4b955795281105d8eb14e50ca5b9eb0a858250050ae921f5",
"reason": "func delegates to _putWidgetConfig"
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "POST before-insert delegates to config validator."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineStart": 210,
"lineEnd": 578,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "4256de6c9e572438e9ee93564e1c0fd3e3de8130a46717bbdbd9d5bbc6dd2954",
"reason": "Complete config validator: envelope copying, dynamic data dispatch, rejection, normalization and persistence."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 13,
"lineStart": 13,
"lineEnd": 38,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "cc205b761bed5fe381e50ce4ea4852f48d4c71fab9b9024aa5d694c05727ecbc",
"reason": "Visibility-tag public-ID objects and legacy raw-ID fallback; publish only public IDs."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 580,
"lineStart": 580,
"lineEnd": 603,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "c1ece99a73d47b79be3af4614b18c25a2a6da2b8c906819f48112a38ad1b9db2",
"reason": "Promo price normalization to positive finite decimals."
},
{
"file": "application/models/v2/Widget.php",
"line": 213,
"lineStart": 213,
"lineEnd": 329,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "9fdfd0cde04c0a48fa910b0451939838cce8d6946711064e013fc4f8588389ce",
"reason": "Actual GET replaces empty declared setter and returns normalized config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing, capabilities and Bootstrap filtering determine dynamic definitions."
},
{
"file": "application/models/Widgetmanager.php",
"line": 7282,
"lineStart": 7282,
"lineEnd": 7380,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "6c1613bbc268dca6e138f967dcefca91af35b6f5400bfdaa2c5f9ff7d19379f7",
"reason": "Concrete textb definition proves example keys and language-dependent inputs."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Feld-Metadaten aus der Spezifikation
{
"x-edoobox-readOnlyFields": [],
"x-edoobox-clientRestriction": "The server-generated id is forbidden. insert:false fields are readOnly and tolerated for existing Vue payloads because the API skips them."
}id string Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.
- pattern
"^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$"
Schema-Beispiel
"widget_012345abcdef_123456"Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Vollständiges Schema als JSON
{
"type": "object",
"properties": {
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"id": false,
"design": {
"type": "string",
"pattern": "^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$",
"description": "Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.",
"examples": [
"design_012345abcdef_123456"
],
"x-edoobox-writableOnUpdate": false,
"x-edoobox-requiredOnCreate": true,
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 38
},
"template": {
"type": "string",
"enum": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s"
],
"description": "Allowlist a..s; invalid strings returnfalse -> ED80100. Required create field, generic PUT immutable.\n\nNon-strict in_array allowlist then aP; manager chooses widget definitions for template/account/style.\n\nRuntime preconditions / rejection: Unknown string template -> ED80100. Widget key not offered for template/account/style -> missing_lut_widget.\n\nScope / limitations: Canonical string keys documented; non-strict in_array has unusual scalar-coercion edges, not a separate template API.",
"x-edoobox-schemaStatus": "source-reviewed",
"examples": [
"a"
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 52,
"lineStart": 52,
"lineEnd": 69,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "d125dfff1f7e616ba3a9089e77e4c41634b8a344f49db1807d72c020939f7e01",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "Before-insert validates selected template/key config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing and capability/Bootstrap filters."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
},
"key": {
"type": "string",
"description": "Exact widget key from the current account/template/style Widgetmanager LUT. Native before-insert validates the original key; unknown keys fail ED80100 missing_lut_widget. This is not a free text field validated merely by a250-character storage normalizer. Read the widget LUT for currently available keys.",
"x-edoobox-validation": "array_key_exists(original key, Widgetmanager::getWidgetsTemplate(true, template, new, fid, styleId))",
"x-edoobox-schemaStatus": "source-reviewed-runtime-widget-lookup",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 70,
"lineEnd": 82,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "Key getter exists, but POST acceptance additionally validates the original untruncated key against the exact runtime LUT; generic PUT marks key immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"order": {
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 84,
"x-edoobox-canonicalType": "integer",
"x-edoobox-normalization": "PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction.",
"examples": [
1
]
},
"html_id": {
"description": "Caller input is overwritten by the Widget before-insert hook. Native code generates wdg + original widget key + uniqid; supplied values do not select the stored HTML id. No caller-supplied250-character storage claim is made.",
"x-edoobox-ignored-input": true,
"x-edoobox-schemaStatus": "source-reviewed-generated-field",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 94,
"lineEnd": 102,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "The input getter is superseded by before-insert generation; response setter uses aQ and generic PUT is immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"config": {
"type": [
"object",
"array"
],
"properties": {
"name": {
"x-edoobox-canonicalType": "string",
"description": "aP(...,true,150), truncates rather than rejecting length."
},
"width": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum; not a fixed server validator."
}
},
"additionalProperties": true
},
"height": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum."
},
"auto": {
"x-edoobox-canonicalType": "integer",
"x-edoobox-recognizedValues": [
1,
2,
3
],
"description": "Only cast values1/2/3 copied; other values ignored."
}
},
"additionalProperties": true
},
"margin": {
"type": "object",
"properties": {
"left": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"top": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"visible": {
"type": "object",
"properties": {
"showpho": {
"x-edoobox-canonicalType": "boolean",
"description": "Only stricttrue enables; everything else becomes false."
},
"type": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"data": {
"type": "object",
"additionalProperties": {},
"description": "Widget-definition-specific keys and value forms. Select/checkbox/datastructure/default checks reject; input/integer/join/json/base64 forms normalize. Allowed keys depend on template/key/account languages/features/style.",
"x-edoobox-schemaStatus": "reviewed-dynamic-widget-map"
}
},
"additionalProperties": true,
"description": "Common widget layout/config envelope for POST/PUT. Unknown top-level config keys ignored; unknown data keys rejected. Nested numeric bounds mostly control copying, not rejection. The object is canonical; no explicit top-level is_array rejection is implemented. PHP JSON object/array values both decode to arrays; empty/non-keyed config arrays leave default/stored config unchanged.\n\nPOST get is placeholdertrue; before-insert calls validWidgetConfig. PUT calls same validator using existing stored config. Layout numbers cast/ignore invalid entries; names/inputs truncate. GET replaces empty Structure setter and converts per-field types after decode.\n\nRuntime preconditions / rejection: Missing template/key definition -> missing_lut_widget. Unknown data property or invalid key spelling -> config_data_field_not_exist. Select/checkbox/datastructure value not in dynamic definition -> config_data_field_value_invalid. Duplicate bformular participant-field binding -> config_data_field_already_linked. Invalid join default -> config_data_field_default_value_not_exist, except promo sale selection fallback. Promo-sale prices must normalize to at least one positive finite decimal, otherwise config_data_field_value_invalid.\n\nScope / limitations: Common envelope is resolved; full per-widget/LUT/account schema union is intentionally not enumerated. Dynamic data map remains permissive with explicit validation description. visibility_tags_include/exclude accepts arrays: documented form is {tag: publicv2ID}. Legacy scalar fallback casts internal IDs, which must never be used in external examples. bformular country/language defaults can transform public country IDs/language keys in their applicable branch. Runtime account languages, membership/Bootstrap filters and definition methods determine exact data keys; no single closed data object is proven.",
"x-edoobox-schemaStatus": "source-reviewed-dynamic-envelope",
"examples": [
{
"name": "Synthetic text block",
"visible": {
"showpho": true,
"type": 1
},
"data": {
"showiframe": "1",
"showsammel": "0"
}
}
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 104,
"lineStart": 104,
"lineEnd": 116,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "8c74e6f4c65610843796bd8bb20351c22fab3f754a8c80b28294eab9bd1b6fa9",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 151,
"lineStart": 151,
"lineEnd": 196,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "284bae8394c5dfde4b955795281105d8eb14e50ca5b9eb0a858250050ae921f5",
"reason": "func delegates to _putWidgetConfig"
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "POST before-insert delegates to config validator."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineStart": 210,
"lineEnd": 578,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "4256de6c9e572438e9ee93564e1c0fd3e3de8130a46717bbdbd9d5bbc6dd2954",
"reason": "Complete config validator: envelope copying, dynamic data dispatch, rejection, normalization and persistence."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 13,
"lineStart": 13,
"lineEnd": 38,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "cc205b761bed5fe381e50ce4ea4852f48d4c71fab9b9024aa5d694c05727ecbc",
"reason": "Visibility-tag public-ID objects and legacy raw-ID fallback; publish only public IDs."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 580,
"lineStart": 580,
"lineEnd": 603,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "c1ece99a73d47b79be3af4614b18c25a2a6da2b8c906819f48112a38ad1b9db2",
"reason": "Promo price normalization to positive finite decimals."
},
{
"file": "application/models/v2/Widget.php",
"line": 213,
"lineStart": 213,
"lineEnd": 329,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "9fdfd0cde04c0a48fa910b0451939838cce8d6946711064e013fc4f8588389ce",
"reason": "Actual GET replaces empty declared setter and returns normalized config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing, capabilities and Bootstrap filtering determine dynamic definitions."
},
{
"file": "application/models/Widgetmanager.php",
"line": 7282,
"lineStart": 7282,
"lineEnd": 7380,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "6c1613bbc268dca6e138f967dcefca91af35b6f5400bfdaa2c5f9ff7d19379f7",
"reason": "Concrete textb definition proves example keys and language-dependent inputs."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}
},
"additionalProperties": true,
"description": "Source-declared fields; action-specific and account validation still apply.",
"required": [
"design",
"template",
"key",
"config"
],
"minProperties": 1
},
{
"type": "array",
"minItems": 1,
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"id": false,
"design": {
"type": "string",
"pattern": "^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$",
"description": "Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.",
"examples": [
"design_012345abcdef_123456"
],
"x-edoobox-writableOnUpdate": false,
"x-edoobox-requiredOnCreate": true,
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 38
},
"template": {
"type": "string",
"enum": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s"
],
"description": "Allowlist a..s; invalid strings returnfalse -> ED80100. Required create field, generic PUT immutable.\n\nNon-strict in_array allowlist then aP; manager chooses widget definitions for template/account/style.\n\nRuntime preconditions / rejection: Unknown string template -> ED80100. Widget key not offered for template/account/style -> missing_lut_widget.\n\nScope / limitations: Canonical string keys documented; non-strict in_array has unusual scalar-coercion edges, not a separate template API.",
"x-edoobox-schemaStatus": "source-reviewed",
"examples": [
"a"
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 52,
"lineStart": 52,
"lineEnd": 69,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "d125dfff1f7e616ba3a9089e77e4c41634b8a344f49db1807d72c020939f7e01",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "Before-insert validates selected template/key config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing and capability/Bootstrap filters."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
},
"key": {
"type": "string",
"description": "Exact widget key from the current account/template/style Widgetmanager LUT. Native before-insert validates the original key; unknown keys fail ED80100 missing_lut_widget. This is not a free text field validated merely by a250-character storage normalizer. Read the widget LUT for currently available keys.",
"x-edoobox-validation": "array_key_exists(original key, Widgetmanager::getWidgetsTemplate(true, template, new, fid, styleId))",
"x-edoobox-schemaStatus": "source-reviewed-runtime-widget-lookup",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 70,
"lineEnd": 82,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "Key getter exists, but POST acceptance additionally validates the original untruncated key against the exact runtime LUT; generic PUT marks key immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"order": {
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 84,
"x-edoobox-canonicalType": "integer",
"x-edoobox-normalization": "PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction.",
"examples": [
1
]
},
"html_id": {
"description": "Caller input is overwritten by the Widget before-insert hook. Native code generates wdg + original widget key + uniqid; supplied values do not select the stored HTML id. No caller-supplied250-character storage claim is made.",
"x-edoobox-ignored-input": true,
"x-edoobox-schemaStatus": "source-reviewed-generated-field",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 94,
"lineEnd": 102,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "The input getter is superseded by before-insert generation; response setter uses aQ and generic PUT is immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"config": {
"type": [
"object",
"array"
],
"properties": {
"name": {
"x-edoobox-canonicalType": "string",
"description": "aP(...,true,150), truncates rather than rejecting length."
},
"width": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum; not a fixed server validator."
}
},
"additionalProperties": true
},
"height": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum."
},
"auto": {
"x-edoobox-canonicalType": "integer",
"x-edoobox-recognizedValues": [
1,
2,
3
],
"description": "Only cast values1/2/3 copied; other values ignored."
}
},
"additionalProperties": true
},
"margin": {
"type": "object",
"properties": {
"left": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"top": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"visible": {
"type": "object",
"properties": {
"showpho": {
"x-edoobox-canonicalType": "boolean",
"description": "Only stricttrue enables; everything else becomes false."
},
"type": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"data": {
"type": "object",
"additionalProperties": {},
"description": "Widget-definition-specific keys and value forms. Select/checkbox/datastructure/default checks reject; input/integer/join/json/base64 forms normalize. Allowed keys depend on template/key/account languages/features/style.",
"x-edoobox-schemaStatus": "reviewed-dynamic-widget-map"
}
},
"additionalProperties": true,
"description": "Common widget layout/config envelope for POST/PUT. Unknown top-level config keys ignored; unknown data keys rejected. Nested numeric bounds mostly control copying, not rejection. The object is canonical; no explicit top-level is_array rejection is implemented. PHP JSON object/array values both decode to arrays; empty/non-keyed config arrays leave default/stored config unchanged.\n\nPOST get is placeholdertrue; before-insert calls validWidgetConfig. PUT calls same validator using existing stored config. Layout numbers cast/ignore invalid entries; names/inputs truncate. GET replaces empty Structure setter and converts per-field types after decode.\n\nRuntime preconditions / rejection: Missing template/key definition -> missing_lut_widget. Unknown data property or invalid key spelling -> config_data_field_not_exist. Select/checkbox/datastructure value not in dynamic definition -> config_data_field_value_invalid. Duplicate bformular participant-field binding -> config_data_field_already_linked. Invalid join default -> config_data_field_default_value_not_exist, except promo sale selection fallback. Promo-sale prices must normalize to at least one positive finite decimal, otherwise config_data_field_value_invalid.\n\nScope / limitations: Common envelope is resolved; full per-widget/LUT/account schema union is intentionally not enumerated. Dynamic data map remains permissive with explicit validation description. visibility_tags_include/exclude accepts arrays: documented form is {tag: publicv2ID}. Legacy scalar fallback casts internal IDs, which must never be used in external examples. bformular country/language defaults can transform public country IDs/language keys in their applicable branch. Runtime account languages, membership/Bootstrap filters and definition methods determine exact data keys; no single closed data object is proven.",
"x-edoobox-schemaStatus": "source-reviewed-dynamic-envelope",
"examples": [
{
"name": "Synthetic text block",
"visible": {
"showpho": true,
"type": 1
},
"data": {
"showiframe": "1",
"showsammel": "0"
}
}
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 104,
"lineStart": 104,
"lineEnd": 116,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "8c74e6f4c65610843796bd8bb20351c22fab3f754a8c80b28294eab9bd1b6fa9",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 151,
"lineStart": 151,
"lineEnd": 196,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "284bae8394c5dfde4b955795281105d8eb14e50ca5b9eb0a858250050ae921f5",
"reason": "func delegates to _putWidgetConfig"
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "POST before-insert delegates to config validator."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineStart": 210,
"lineEnd": 578,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "4256de6c9e572438e9ee93564e1c0fd3e3de8130a46717bbdbd9d5bbc6dd2954",
"reason": "Complete config validator: envelope copying, dynamic data dispatch, rejection, normalization and persistence."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 13,
"lineStart": 13,
"lineEnd": 38,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "cc205b761bed5fe381e50ce4ea4852f48d4c71fab9b9024aa5d694c05727ecbc",
"reason": "Visibility-tag public-ID objects and legacy raw-ID fallback; publish only public IDs."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 580,
"lineStart": 580,
"lineEnd": 603,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "c1ece99a73d47b79be3af4614b18c25a2a6da2b8c906819f48112a38ad1b9db2",
"reason": "Promo price normalization to positive finite decimals."
},
{
"file": "application/models/v2/Widget.php",
"line": 213,
"lineStart": 213,
"lineEnd": 329,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "9fdfd0cde04c0a48fa910b0451939838cce8d6946711064e013fc4f8588389ce",
"reason": "Actual GET replaces empty declared setter and returns normalized config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing, capabilities and Bootstrap filtering determine dynamic definitions."
},
{
"file": "application/models/Widgetmanager.php",
"line": 7282,
"lineStart": 7282,
"lineEnd": 7380,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "6c1613bbc268dca6e138f967dcefca91af35b6f5400bfdaa2c5f9ff7d19379f7",
"reason": "Concrete textb definition proves example keys and language-dependent inputs."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}
},
"additionalProperties": true,
"description": "Source-declared fields; action-specific and account validation still apply.",
"required": [
"design",
"template",
"key",
"config"
]
}
}
],
"x-edoobox-readOnlyFields": [],
"x-edoobox-clientRestriction": "The server-generated id is forbidden. insert:false fields are readOnly and tolerated for existing Vue payloads because the API skips them."
},
"id": {
"type": "string",
"pattern": "^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$",
"description": "Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.",
"examples": [
"widget_012345abcdef_123456"
]
}
},
"additionalProperties": true,
"required": [
"data"
]
}Design-Widget anlegen
{
"data": {
"design": "design_012345abcdef_123456",
"template": "a",
"key": "textb",
"config": {
"name": "Hinweis"
}
}
}Antworten
11HTTP-Status und Antwortinhalt gemeinsam auswerten. In dieser API können auch Antworten mit HTTP 200 einen Fehler enthalten.
200application/json
data enthält insert, öffentliche id und bei Uploads signierte upload_url; öffentliche Dateien liefern zusätzlich cdn_url. Bei fehlgeschlagenem Transaktionsabschluss enthält data insert=false und id=null; error ist ED80100.
Response Header
X-Edoobox-Revision
Rotated account revision supplied for the next action in one reviewed sequence.
- pattern
"^[a-f0-9]{32}$"
Vollständiges Schema als JSON
{
"type": "string",
"pattern": "^[a-f0-9]{32}$"
}application/json
success boolean error boolean | string error_code string data object insert boolean erforderlich id Typ nicht eingeschränkt erforderlich Bei erfolgreichem Einzelinsert öffentliche v2-ID, bei erfolgreichem Batch ein Array öffentlicher IDs; bei fehlgeschlagenem Transaktionsabschluss null zusammen mit insert=false und error=ED80100.
oneOf · Genau eine Variante muss passen
Variante 1 string Öffentliche v2-ID aus diesem Konto; keine Datenbank-ID. Beispiel ist synthetisch.
- pattern
"^widget_[a-f0-9]{12}_-?[0-9]+$"
Schema-Beispiel
"widget_012345abcdef_123456"Variante 2 array Array-Elemente
Öffentliche v2-ID aus diesem Konto; keine Datenbank-ID. Beispiel ist synthetisch.
- pattern
"^widget_[a-f0-9]{12}_-?[0-9]+$"
Schema-Beispiel
"widget_012345abcdef_123456"Variante 3 null Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
type string Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Vollständiges Schema als JSON
{
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"error": {
"type": [
"boolean",
"string"
]
},
"error_code": {
"type": "string"
},
"data": {
"type": "object",
"properties": {
"insert": {
"type": "boolean"
},
"id": {
"oneOf": [
{
"type": "string",
"pattern": "^widget_[a-f0-9]{12}_-?[0-9]+$",
"description": "Öffentliche v2-ID aus diesem Konto; keine Datenbank-ID. Beispiel ist synthetisch.",
"examples": [
"widget_012345abcdef_123456"
]
},
{
"type": "array",
"items": {
"type": "string",
"pattern": "^widget_[a-f0-9]{12}_-?[0-9]+$",
"description": "Öffentliche v2-ID aus diesem Konto; keine Datenbank-ID. Beispiel ist synthetisch.",
"examples": [
"widget_012345abcdef_123456"
]
}
},
{
"type": "null"
}
],
"description": "Bei erfolgreichem Einzelinsert öffentliche v2-ID, bei erfolgreichem Batch ein Array öffentlicher IDs; bei fehlgeschlagenem Transaktionsabschluss null zusammen mit insert=false und error=ED80100."
}
},
"additionalProperties": true,
"required": [
"id",
"insert"
]
},
"type": {
"type": "string"
}
},
"additionalProperties": true
}Beispiel
{
"success": true,
"error": false,
"data": {
"id": "widget_012345abcdef_123456",
"insert": true
}
}400application/json
Invalid request.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED40006"
}401application/json
Missing/expired token, missing account context, account paused or model-specific authorization failure.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED40103"
}402application/json
Missing/invalid action data or subscription/operation restriction.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED80100"
}403application/json
Permission denied. Browser CORS rejection may have an empty body.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED40340"
}404application/json
Unknown resource/action or unsupported method.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED80019"
}409application/json
The account changed after the reviewed read. No domain operation is dispatched; obtain fresh state and review again.
application/json
Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Vollständiges Schema als JSON
{
"type": "object",
"additionalProperties": true
}Beispiel
{
"error": "ED40901",
"error_code": "mutation_revision_conflict"
}422application/json
Validation failed.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED80020"
}429application/json
Request/login rate limit exceeded. Honor Retry-After when supplied; legacy rate-limit paths may omit it. Retry only proven reads within a bounded deadline; a mutation is never automatically replayed after an ambiguous response.
Response Header
Retry-After
Optional server delay in whole seconds or an HTTP date. Absence is not permission for an immediate retry.
Schema-Beispiel
"30"Vollständiges Schema als JSON
{
"type": "string",
"examples": [
"30"
]
}application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED42902"
}502application/json
Server-side operation failed.
application/json
Kein Schema angegeben. Daraus lässt sich kein vollständiger Feldvertrag ableiten.
Beispiel
{
"success": false,
"error": "ED50201"
}503application/json
The account mutation lock or revision store is unavailable. No unprotected fallback is executed.
Response Header
Retry-After
Fester Wert: 1
Vollständiges Schema als JSON
{
"type": "integer",
"const": 1
}application/json
Zusätzliche, hier nicht aufgeführte Felder sind erlaubt.
Vollständiges Schema als JSON
{
"type": "object",
"additionalProperties": true
}Beispiel
{
"error": "ED50301",
"error_code": "mutation_revision_busy"
}Quelle & Metadaten
application/models/v2/Widget.php:139postWidget()Diese Angaben stammen unverändert aus der gelieferten OpenAPI-Datei. Zusätzliche Freigaben, Vorbedingungen, sensible Felder und Hinweise stehen in den Erweiterungen.
x-edoobox-mutates-state
truex-edoobox-runtimeMutationGuard
truex-edoobox-documentationReview
{
"file": "docs/openapi/operation-contracts/07-layout-files.json",
"notes": []
}x-edoobox-source
{
"file": "application/models/v2/Widget.php",
"method": "postWidget",
"line": 139
}x-edoobox-documentationStatus
"reviewed"x-edoobox-readOnly
falsex-edoobox-safeForAutomation
falsex-edoobox-permission
{
"resource": "widget",
"short": "wigt",
"checkedByDispatcher": true,
"levels": [
2,
3,
4
],
"description": "Resource permission mapping from APIPermissions(), Authfunc::_getCheckJWT. Additional model/admin/plugin checks may apply; resources absent from api_permission do not acquire a fictitious scope."
}Vollständige Operation als JSON
{
"operationId": "post_v2_widget",
"summary": "Design-Widget anlegen",
"description": "Fügt ein Widget zu design und template hinzu. design, template, key und config sind erforderlich; key muss in der aktuellen Widget-LUT verfügbar sein. HTML-ID und Layout-CSS werden erzeugt. config.data ist ein offenes, vom Widgettyp und Konto abhängiges Einstellungsobjekt; unbekannte oder ungültige Einträge werden vom Handler abgewiesen. data akzeptiert einen Datensatz oder ein Array mit bis zu 100 Datensätzen; bei einem Batch enthält data.id ein Array öffentlicher IDs.",
"tags": [
"widget"
],
"security": [
{
"bearerAuth": [],
"accountContext": []
},
{
"sessionCookie": [],
"accountContext": []
}
],
"parameters": [
{
"name": "language",
"in": "header",
"required": false,
"description": "Account language code, where the resource supports setLanguage().",
"schema": {
"type": "string",
"examples": [
"de"
]
}
},
{
"name": "X-Edoobox-If-Revision",
"in": "header",
"required": false,
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{32}$",
"examples": [
"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
]
},
"description": "Optional account mutation revision from a preceding authenticated auth-context snapshot. The dispatcher compares it while holding the account lock; mismatch409 requires a new review."
}
],
"responses": {
"200": {
"description": "data enthält insert, öffentliche id und bei Uploads signierte upload_url; öffentliche Dateien liefern zusätzlich cdn_url. Bei fehlgeschlagenem Transaktionsabschluss enthält data insert=false und id=null; error ist ED80100.",
"content": {
"application/json": {
"example": {
"success": true,
"error": false,
"data": {
"id": "widget_012345abcdef_123456",
"insert": true
}
},
"schema": {
"type": "object",
"properties": {
"success": {
"type": "boolean"
},
"error": {
"type": [
"boolean",
"string"
]
},
"error_code": {
"type": "string"
},
"data": {
"type": "object",
"properties": {
"insert": {
"type": "boolean"
},
"id": {
"oneOf": [
{
"type": "string",
"pattern": "^widget_[a-f0-9]{12}_-?[0-9]+$",
"description": "Öffentliche v2-ID aus diesem Konto; keine Datenbank-ID. Beispiel ist synthetisch.",
"examples": [
"widget_012345abcdef_123456"
]
},
{
"type": "array",
"items": {
"type": "string",
"pattern": "^widget_[a-f0-9]{12}_-?[0-9]+$",
"description": "Öffentliche v2-ID aus diesem Konto; keine Datenbank-ID. Beispiel ist synthetisch.",
"examples": [
"widget_012345abcdef_123456"
]
}
},
{
"type": "null"
}
],
"description": "Bei erfolgreichem Einzelinsert öffentliche v2-ID, bei erfolgreichem Batch ein Array öffentlicher IDs; bei fehlgeschlagenem Transaktionsabschluss null zusammen mit insert=false und error=ED80100."
}
},
"additionalProperties": true,
"required": [
"id",
"insert"
]
},
"type": {
"type": "string"
}
},
"additionalProperties": true
}
}
},
"headers": {
"X-Edoobox-Revision": {
"schema": {
"type": "string",
"pattern": "^[a-f0-9]{32}$"
},
"description": "Rotated account revision supplied for the next action in one reviewed sequence."
}
}
},
"400": {
"description": "Invalid request.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED40006"
}
}
}
},
"401": {
"description": "Missing/expired token, missing account context, account paused or model-specific authorization failure.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED40103"
}
}
}
},
"402": {
"description": "Missing/invalid action data or subscription/operation restriction.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED80100"
}
}
}
},
"403": {
"description": "Permission denied. Browser CORS rejection may have an empty body.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED40340"
}
}
}
},
"404": {
"description": "Unknown resource/action or unsupported method.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED80019"
}
}
}
},
"409": {
"description": "The account changed after the reviewed read. No domain operation is dispatched; obtain fresh state and review again.",
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
},
"example": {
"error": "ED40901",
"error_code": "mutation_revision_conflict"
}
}
}
},
"422": {
"description": "Validation failed.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED80020"
}
}
}
},
"429": {
"description": "Request/login rate limit exceeded. Honor Retry-After when supplied; legacy rate-limit paths may omit it. Retry only proven reads within a bounded deadline; a mutation is never automatically replayed after an ambiguous response.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED42902"
}
}
},
"headers": {
"Retry-After": {
"description": "Optional server delay in whole seconds or an HTTP date. Absence is not permission for an immediate retry.",
"schema": {
"type": "string",
"examples": [
"30"
]
}
}
}
},
"502": {
"description": "Server-side operation failed.",
"content": {
"application/json": {
"example": {
"success": false,
"error": "ED50201"
}
}
}
},
"503": {
"description": "The account mutation lock or revision store is unavailable. No unprotected fallback is executed.",
"headers": {
"Retry-After": {
"schema": {
"type": "integer",
"const": 1
}
}
},
"content": {
"application/json": {
"schema": {
"type": "object",
"additionalProperties": true
},
"example": {
"error": "ED50301",
"error_code": "mutation_revision_busy"
}
}
}
}
},
"x-edoobox-mutates-state": true,
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"data": {
"anyOf": [
{
"type": "object",
"properties": {
"id": false,
"design": {
"type": "string",
"pattern": "^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$",
"description": "Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.",
"examples": [
"design_012345abcdef_123456"
],
"x-edoobox-writableOnUpdate": false,
"x-edoobox-requiredOnCreate": true,
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 38
},
"template": {
"type": "string",
"enum": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s"
],
"description": "Allowlist a..s; invalid strings returnfalse -> ED80100. Required create field, generic PUT immutable.\n\nNon-strict in_array allowlist then aP; manager chooses widget definitions for template/account/style.\n\nRuntime preconditions / rejection: Unknown string template -> ED80100. Widget key not offered for template/account/style -> missing_lut_widget.\n\nScope / limitations: Canonical string keys documented; non-strict in_array has unusual scalar-coercion edges, not a separate template API.",
"x-edoobox-schemaStatus": "source-reviewed",
"examples": [
"a"
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 52,
"lineStart": 52,
"lineEnd": 69,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "d125dfff1f7e616ba3a9089e77e4c41634b8a344f49db1807d72c020939f7e01",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "Before-insert validates selected template/key config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing and capability/Bootstrap filters."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
},
"key": {
"type": "string",
"description": "Exact widget key from the current account/template/style Widgetmanager LUT. Native before-insert validates the original key; unknown keys fail ED80100 missing_lut_widget. This is not a free text field validated merely by a250-character storage normalizer. Read the widget LUT for currently available keys.",
"x-edoobox-validation": "array_key_exists(original key, Widgetmanager::getWidgetsTemplate(true, template, new, fid, styleId))",
"x-edoobox-schemaStatus": "source-reviewed-runtime-widget-lookup",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 70,
"lineEnd": 82,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "Key getter exists, but POST acceptance additionally validates the original untruncated key against the exact runtime LUT; generic PUT marks key immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"order": {
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 84,
"x-edoobox-canonicalType": "integer",
"x-edoobox-normalization": "PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction.",
"examples": [
1
]
},
"html_id": {
"description": "Caller input is overwritten by the Widget before-insert hook. Native code generates wdg + original widget key + uniqid; supplied values do not select the stored HTML id. No caller-supplied250-character storage claim is made.",
"x-edoobox-ignored-input": true,
"x-edoobox-schemaStatus": "source-reviewed-generated-field",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 94,
"lineEnd": 102,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "The input getter is superseded by before-insert generation; response setter uses aQ and generic PUT is immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"config": {
"type": [
"object",
"array"
],
"properties": {
"name": {
"x-edoobox-canonicalType": "string",
"description": "aP(...,true,150), truncates rather than rejecting length."
},
"width": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum; not a fixed server validator."
}
},
"additionalProperties": true
},
"height": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum."
},
"auto": {
"x-edoobox-canonicalType": "integer",
"x-edoobox-recognizedValues": [
1,
2,
3
],
"description": "Only cast values1/2/3 copied; other values ignored."
}
},
"additionalProperties": true
},
"margin": {
"type": "object",
"properties": {
"left": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"top": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"visible": {
"type": "object",
"properties": {
"showpho": {
"x-edoobox-canonicalType": "boolean",
"description": "Only stricttrue enables; everything else becomes false."
},
"type": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"data": {
"type": "object",
"additionalProperties": {},
"description": "Widget-definition-specific keys and value forms. Select/checkbox/datastructure/default checks reject; input/integer/join/json/base64 forms normalize. Allowed keys depend on template/key/account languages/features/style.",
"x-edoobox-schemaStatus": "reviewed-dynamic-widget-map"
}
},
"additionalProperties": true,
"description": "Common widget layout/config envelope for POST/PUT. Unknown top-level config keys ignored; unknown data keys rejected. Nested numeric bounds mostly control copying, not rejection. The object is canonical; no explicit top-level is_array rejection is implemented. PHP JSON object/array values both decode to arrays; empty/non-keyed config arrays leave default/stored config unchanged.\n\nPOST get is placeholdertrue; before-insert calls validWidgetConfig. PUT calls same validator using existing stored config. Layout numbers cast/ignore invalid entries; names/inputs truncate. GET replaces empty Structure setter and converts per-field types after decode.\n\nRuntime preconditions / rejection: Missing template/key definition -> missing_lut_widget. Unknown data property or invalid key spelling -> config_data_field_not_exist. Select/checkbox/datastructure value not in dynamic definition -> config_data_field_value_invalid. Duplicate bformular participant-field binding -> config_data_field_already_linked. Invalid join default -> config_data_field_default_value_not_exist, except promo sale selection fallback. Promo-sale prices must normalize to at least one positive finite decimal, otherwise config_data_field_value_invalid.\n\nScope / limitations: Common envelope is resolved; full per-widget/LUT/account schema union is intentionally not enumerated. Dynamic data map remains permissive with explicit validation description. visibility_tags_include/exclude accepts arrays: documented form is {tag: publicv2ID}. Legacy scalar fallback casts internal IDs, which must never be used in external examples. bformular country/language defaults can transform public country IDs/language keys in their applicable branch. Runtime account languages, membership/Bootstrap filters and definition methods determine exact data keys; no single closed data object is proven.",
"x-edoobox-schemaStatus": "source-reviewed-dynamic-envelope",
"examples": [
{
"name": "Synthetic text block",
"visible": {
"showpho": true,
"type": 1
},
"data": {
"showiframe": "1",
"showsammel": "0"
}
}
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 104,
"lineStart": 104,
"lineEnd": 116,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "8c74e6f4c65610843796bd8bb20351c22fab3f754a8c80b28294eab9bd1b6fa9",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 151,
"lineStart": 151,
"lineEnd": 196,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "284bae8394c5dfde4b955795281105d8eb14e50ca5b9eb0a858250050ae921f5",
"reason": "func delegates to _putWidgetConfig"
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "POST before-insert delegates to config validator."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineStart": 210,
"lineEnd": 578,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "4256de6c9e572438e9ee93564e1c0fd3e3de8130a46717bbdbd9d5bbc6dd2954",
"reason": "Complete config validator: envelope copying, dynamic data dispatch, rejection, normalization and persistence."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 13,
"lineStart": 13,
"lineEnd": 38,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "cc205b761bed5fe381e50ce4ea4852f48d4c71fab9b9024aa5d694c05727ecbc",
"reason": "Visibility-tag public-ID objects and legacy raw-ID fallback; publish only public IDs."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 580,
"lineStart": 580,
"lineEnd": 603,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "c1ece99a73d47b79be3af4614b18c25a2a6da2b8c906819f48112a38ad1b9db2",
"reason": "Promo price normalization to positive finite decimals."
},
{
"file": "application/models/v2/Widget.php",
"line": 213,
"lineStart": 213,
"lineEnd": 329,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "9fdfd0cde04c0a48fa910b0451939838cce8d6946711064e013fc4f8588389ce",
"reason": "Actual GET replaces empty declared setter and returns normalized config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing, capabilities and Bootstrap filtering determine dynamic definitions."
},
{
"file": "application/models/Widgetmanager.php",
"line": 7282,
"lineStart": 7282,
"lineEnd": 7380,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "6c1613bbc268dca6e138f967dcefca91af35b6f5400bfdaa2c5f9ff7d19379f7",
"reason": "Concrete textb definition proves example keys and language-dependent inputs."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}
},
"additionalProperties": true,
"description": "Source-declared fields; action-specific and account validation still apply.",
"required": [
"design",
"template",
"key",
"config"
],
"minProperties": 1
},
{
"type": "array",
"minItems": 1,
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"id": false,
"design": {
"type": "string",
"pattern": "^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$",
"description": "Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.",
"examples": [
"design_012345abcdef_123456"
],
"x-edoobox-writableOnUpdate": false,
"x-edoobox-requiredOnCreate": true,
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 38
},
"template": {
"type": "string",
"enum": [
"a",
"b",
"c",
"d",
"e",
"f",
"g",
"h",
"i",
"j",
"k",
"l",
"m",
"n",
"o",
"p",
"q",
"r",
"s"
],
"description": "Allowlist a..s; invalid strings returnfalse -> ED80100. Required create field, generic PUT immutable.\n\nNon-strict in_array allowlist then aP; manager chooses widget definitions for template/account/style.\n\nRuntime preconditions / rejection: Unknown string template -> ED80100. Widget key not offered for template/account/style -> missing_lut_widget.\n\nScope / limitations: Canonical string keys documented; non-strict in_array has unusual scalar-coercion edges, not a separate template API.",
"x-edoobox-schemaStatus": "source-reviewed",
"examples": [
"a"
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 52,
"lineStart": 52,
"lineEnd": 69,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "d125dfff1f7e616ba3a9089e77e4c41634b8a344f49db1807d72c020939f7e01",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "Before-insert validates selected template/key config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing and capability/Bootstrap filters."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
},
"key": {
"type": "string",
"description": "Exact widget key from the current account/template/style Widgetmanager LUT. Native before-insert validates the original key; unknown keys fail ED80100 missing_lut_widget. This is not a free text field validated merely by a250-character storage normalizer. Read the widget LUT for currently available keys.",
"x-edoobox-validation": "array_key_exists(original key, Widgetmanager::getWidgetsTemplate(true, template, new, fid, styleId))",
"x-edoobox-schemaStatus": "source-reviewed-runtime-widget-lookup",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 70,
"lineEnd": 82,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "Key getter exists, but POST acceptance additionally validates the original untruncated key against the exact runtime LUT; generic PUT marks key immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"order": {
"x-edoobox-schemaStatus": "source-inferred",
"x-edoobox-sourceLine": 84,
"x-edoobox-canonicalType": "integer",
"x-edoobox-normalization": "PHP coercion/normalization is applied by the Structure getter; its return type is not a rejecting wire-input type restriction.",
"examples": [
1
]
},
"html_id": {
"description": "Caller input is overwritten by the Widget before-insert hook. Native code generates wdg + original widget key + uniqid; supplied values do not select the stored HTML id. No caller-supplied250-character storage claim is made.",
"x-edoobox-ignored-input": true,
"x-edoobox-schemaStatus": "source-reviewed-generated-field",
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 94,
"lineEnd": 102,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "The input getter is superseded by before-insert generation; response setter uses aQ and generic PUT is immutable."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineEnd": 145,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"reason": "POST uses the generic insert pipeline with the actual Widget before-insert hook."
},
{
"file": "application/models/v2/API_DATA.php",
"line": 1341,
"lineEnd": 1352,
"sha256": "c0e15d26a7a4f3fb3c25e35557d4420ad395b2af3925caec292de08e32ebf44c",
"reason": "Single insert runs the concrete insert_func_before result immediately before the query-builder insert."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineEnd": 113,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "Always generates widget_id as wdg + original key + uniqid, then validates the original key and config."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineEnd": 230,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"reason": "The actual key must exist in the account/template/style-specific Widgetmanager result; missing LUT key throws ED80100."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineEnd": 689,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"reason": "Builds template-specific and common widget LUTs and applies account membership and Bootstrap53/style filters. Allowed keys are runtime-dependent, not arbitrary length-limited text."
},
{
"file": "docs/openapi/reviews/widget-insert-fields.json",
"line": 1,
"sha256": "4bc713549d08e5eb8c5a027face2bb80313a1a8ec470dcb2bb0d957d8d061215",
"reason": "Independent supplemental field review; excluded from the historical184-field baseline count."
}
]
},
"config": {
"type": [
"object",
"array"
],
"properties": {
"name": {
"x-edoobox-canonicalType": "string",
"description": "aP(...,true,150), truncates rather than rejecting length."
},
"width": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum; not a fixed server validator."
}
},
"additionalProperties": true
},
"height": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"min": {
"x-edoobox-canonicalType": "number",
"description": "Caller-supplied comparison minimum."
},
"auto": {
"x-edoobox-canonicalType": "integer",
"x-edoobox-recognizedValues": [
1,
2,
3
],
"description": "Only cast values1/2/3 copied; other values ignored."
}
},
"additionalProperties": true
},
"margin": {
"type": "object",
"properties": {
"left": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"top": {
"type": "object",
"properties": {
"setpc": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"settab": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
},
"setpho": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
}
},
"additionalProperties": true
},
"visible": {
"type": "object",
"properties": {
"showpho": {
"x-edoobox-canonicalType": "boolean",
"description": "Only stricttrue enables; everything else becomes false."
},
"type": {
"x-edoobox-canonicalType": "integer",
"description": "PHP int normalization, not strict rejecting wire numeric restriction."
}
},
"additionalProperties": true
},
"data": {
"type": "object",
"additionalProperties": {},
"description": "Widget-definition-specific keys and value forms. Select/checkbox/datastructure/default checks reject; input/integer/join/json/base64 forms normalize. Allowed keys depend on template/key/account languages/features/style.",
"x-edoobox-schemaStatus": "reviewed-dynamic-widget-map"
}
},
"additionalProperties": true,
"description": "Common widget layout/config envelope for POST/PUT. Unknown top-level config keys ignored; unknown data keys rejected. Nested numeric bounds mostly control copying, not rejection. The object is canonical; no explicit top-level is_array rejection is implemented. PHP JSON object/array values both decode to arrays; empty/non-keyed config arrays leave default/stored config unchanged.\n\nPOST get is placeholdertrue; before-insert calls validWidgetConfig. PUT calls same validator using existing stored config. Layout numbers cast/ignore invalid entries; names/inputs truncate. GET replaces empty Structure setter and converts per-field types after decode.\n\nRuntime preconditions / rejection: Missing template/key definition -> missing_lut_widget. Unknown data property or invalid key spelling -> config_data_field_not_exist. Select/checkbox/datastructure value not in dynamic definition -> config_data_field_value_invalid. Duplicate bformular participant-field binding -> config_data_field_already_linked. Invalid join default -> config_data_field_default_value_not_exist, except promo sale selection fallback. Promo-sale prices must normalize to at least one positive finite decimal, otherwise config_data_field_value_invalid.\n\nScope / limitations: Common envelope is resolved; full per-widget/LUT/account schema union is intentionally not enumerated. Dynamic data map remains permissive with explicit validation description. visibility_tags_include/exclude accepts arrays: documented form is {tag: publicv2ID}. Legacy scalar fallback casts internal IDs, which must never be used in external examples. bformular country/language defaults can transform public country IDs/language keys in their applicable branch. Runtime account languages, membership/Bootstrap filters and definition methods determine exact data keys; no single closed data object is proven.",
"x-edoobox-schemaStatus": "source-reviewed-dynamic-envelope",
"examples": [
{
"name": "Synthetic text block",
"visible": {
"showpho": true,
"type": 1
},
"data": {
"showiframe": "1",
"showsammel": "0"
}
}
],
"x-edoobox-contractSource": [
{
"file": "application/models/v2/Widget.php",
"line": 104,
"lineStart": 104,
"lineEnd": 116,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "8c74e6f4c65610843796bd8bb20351c22fab3f754a8c80b28294eab9bd1b6fa9",
"reason": "Structure getter, output setter and field flags."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 151,
"lineStart": 151,
"lineEnd": 196,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "284bae8394c5dfde4b955795281105d8eb14e50ca5b9eb0a858250050ae921f5",
"reason": "func delegates to _putWidgetConfig"
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 107,
"lineStart": 107,
"lineEnd": 112,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "f4e1a72ce7b8315585fac1f8865c7c8e095d07a2bf68913cd6871947bc4fed3e",
"reason": "POST before-insert delegates to config validator."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 210,
"lineStart": 210,
"lineEnd": 578,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "4256de6c9e572438e9ee93564e1c0fd3e3de8130a46717bbdbd9d5bbc6dd2954",
"reason": "Complete config validator: envelope copying, dynamic data dispatch, rejection, normalization and persistence."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 13,
"lineStart": 13,
"lineEnd": 38,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "cc205b761bed5fe381e50ce4ea4852f48d4c71fab9b9024aa5d694c05727ecbc",
"reason": "Visibility-tag public-ID objects and legacy raw-ID fallback; publish only public IDs."
},
{
"file": "application/models/v2/Widgetfunc.php",
"line": 580,
"lineStart": 580,
"lineEnd": 603,
"sha256": "93543ac4d3f60d425ce4e63837a1ca1dc9ed57baad776ccb7b76d448d475837a",
"spanSha256": "c1ece99a73d47b79be3af4614b18c25a2a6da2b8c906819f48112a38ad1b9db2",
"reason": "Promo price normalization to positive finite decimals."
},
{
"file": "application/models/v2/Widget.php",
"line": 213,
"lineStart": 213,
"lineEnd": 329,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "9fdfd0cde04c0a48fa910b0451939838cce8d6946711064e013fc4f8588389ce",
"reason": "Actual GET replaces empty declared setter and returns normalized config."
},
{
"file": "application/models/Widgetmanager.php",
"line": 543,
"lineStart": 543,
"lineEnd": 694,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "1fec1424aa25e05a811140d656c1955b890bbb6db6b23ffcb7e318c394fc402c",
"reason": "Template routing, capabilities and Bootstrap filtering determine dynamic definitions."
},
{
"file": "application/models/Widgetmanager.php",
"line": 7282,
"lineStart": 7282,
"lineEnd": 7380,
"sha256": "f1350720149701f6749556a0af52a5979d371c0a845df25a76852343a0f95c48",
"spanSha256": "6c1613bbc268dca6e138f967dcefca91af35b6f5400bfdaa2c5f9ff7d19379f7",
"reason": "Concrete textb definition proves example keys and language-dependent inputs."
},
{
"file": "application/models/v2/Widget.php",
"line": 139,
"lineStart": 139,
"lineEnd": 162,
"sha256": "425ea689bf11c52a3ab73e5f4c44acf48b4b6d860a7b88193e3d24b891273cde",
"spanSha256": "c2cae8eb38a7f944da1d9568bbcb3ed1f5e39fdc42507ec188464bb4bd5ab5b5",
"reason": "Actual resource dispatch and generic writer reachability; action branches are distinct."
},
{
"file": "docs/openapi/reviews/domain-fields.json",
"line": 1,
"reason": "Independent field-level source review, direction applicability, examples and explicit runtime limitations.",
"sha256": "6b38123b776600a328c8e844b0ecd6e0a579144081a345e335400dad52a9a5db"
}
]
}
},
"additionalProperties": true,
"description": "Source-declared fields; action-specific and account validation still apply.",
"required": [
"design",
"template",
"key",
"config"
]
}
}
],
"x-edoobox-readOnlyFields": [],
"x-edoobox-clientRestriction": "The server-generated id is forbidden. insert:false fields are readOnly and tolerated for existing Vue payloads because the API skips them."
},
"id": {
"type": "string",
"pattern": "^[a-z0-9]+_[a-f0-9]{12}_-?[0-9]+$",
"description": "Opaque edoobox v2 object ID returned by this account. Never send a raw database ID. The synthetic example is illustrative and is not a real record.",
"examples": [
"widget_012345abcdef_123456"
]
}
},
"additionalProperties": true,
"required": [
"data"
]
},
"examples": {
"request": {
"summary": "Design-Widget anlegen",
"value": {
"data": {
"design": "design_012345abcdef_123456",
"template": "a",
"key": "textb",
"config": {
"name": "Hinweis"
}
}
}
}
}
}
}
},
"x-edoobox-runtimeMutationGuard": true,
"x-edoobox-documentationReview": {
"file": "docs/openapi/operation-contracts/07-layout-files.json",
"notes": []
},
"x-edoobox-source": {
"file": "application/models/v2/Widget.php",
"method": "postWidget",
"line": 139
},
"x-edoobox-documentationStatus": "reviewed",
"x-edoobox-readOnly": false,
"x-edoobox-safeForAutomation": false,
"x-edoobox-permission": {
"resource": "widget",
"short": "wigt",
"checkedByDispatcher": true,
"levels": [
2,
3,
4
],
"description": "Resource permission mapping from APIPermissions(), Authfunc::_getCheckJWT. Additional model/admin/plugin checks may apply; resources absent from api_permission do not acquire a fictitious scope."
}
}