{"record":{"id":"53899726703bc4aa","repo":"octobercms/october","slug":"the-property-name-is-not-specified","errorCode":null,"errorMessage":"The property name is not specified.","messagePattern":"The property name is not specified\\.","errorType":"exception","errorClass":"ApplicationException","httpStatus":null,"severity":"error","filePath":"modules/backend/traits/InspectableContainer.php","lineNumber":25,"sourceCode":" * InspectableContainer is an extension for controllers that can host\n * inspectable widgets (Components, etc.)\n *\n * @package october\\backend\n * @author Alexey Bobkov, Samuel Georges\n */\ntrait InspectableContainer\n{\n    /**\n     * onInspectableGetOptions\n     */\n    public function onInspectableGetOptions()\n    {\n        // Disable asset broadcasting\n        $this->flushAssets();\n\n        $property = trim(post('inspectorProperty'));\n        if (!$property) {\n            throw new ApplicationException('The property name is not specified.');\n        }\n\n        $className = trim(post('inspectorClassName'));\n        if (!$className || $className === 'undefined') {\n            throw new ApplicationException('The inspectable class name is not specified.');\n        }\n\n        $traitFound = in_array(\\System\\Traits\\PropertyContainer::class, class_uses_recursive($className));\n        if (!$traitFound) {\n            throw new ApplicationException('Dynamic Inspector control options cannot be loaded for the specified class.');\n        }\n\n        $obj = new $className(null);\n        $obj->setProperties(post());\n\n        // Nested properties have names like object.property.\n        // Convert them to Object.Property.\n        $propertyNameParts = explode('.', $property);","sourceCodeStart":7,"sourceCodeEnd":43,"githubUrl":"https://github.com/octobercms/october/blob/b608633a7e8922487d91a8161499020121c3b3bf/modules/backend/traits/InspectableContainer.php#L7-L43","documentation":"Thrown by the InspectableContainer::onInspectableGetOptions backend AJAX handler when the request carries no non-empty inspectorProperty POST field. The Inspector UI posts this field automatically when a property editor with dynamic options (e.g. a dropdown with dynamicOptions enabled) asks the server for its option list. An empty value almost always means the inspector control schema is missing the `property` key, so the frontend has nothing meaningful to send.","triggerScenarios":"A POST request to a controller using InspectableContainer hits onInspectableGetOptions with inspectorProperty absent, empty, or whitespace-only. Typical producer: an inspector data-schema entry like {title:'Size', type:'dropdown', dynamicOptions:true} that omits `property`, or custom JavaScript invoking the handler directly without the field.","commonSituations":"Custom inspector controls or CMS component inspector schemas in a plugin that forget the `property` key; copy-pasted control definitions where the property line was dropped; hand-rolled AJAX calls to the handler from tests or custom JS; a computed property name that resolves to an empty string.","solutions":["Add the `property` key to the offending inspector control definition, e.g. { property: 'size', title: 'Size', type: 'dropdown', dynamicOptions: true }.","If you call onInspectableGetOptions manually, include a non-empty inspectorProperty value in the POST body.","Inspect the rendered schema (or browser devtools network tab) to find the request with the missing field and fix that specific control.","Clear browser/asset caches after fixing so the corrected schema is served."],"exampleFix":"// before\n{ title: 'Size', type: 'dropdown', dynamicOptions: true }\n\n// after\n{ property: 'size', title: 'Size', type: 'dropdown', dynamicOptions: true }","handlingStrategy":"validation","validationCode":"// Before letting a control request dynamic options\nconst property = (control.property || '').trim();\nif (!property) {\n    console.error('Inspector control missing property key:', control);\n    return;\n}\nconst payload = {\n    inspectorProperty: property,\n    inspectorClassName: this.serverClassName\n};","typeGuard":"function hasInspectorProperty(control) {\n    return typeof control.property === 'string' && control.property.trim().length > 0;\n}","tryCatchPattern":null,"preventionTips":["Give every inspector control a `property` key, especially when dynamicOptions is enabled","Lint inspector data schemas in plugin tests for dynamicOptions controls lacking `property`","Never hand-build requests to onInspectableGetOptions; let the Inspector UI send them"],"tags":["inspector","ajax","request-parameter","validation","backend"],"backgroundTag":"missing-request-parameter","analyzedSha":"b608633a7e8922487d91a8161499020121c3b3bf","analyzedAt":"2026-08-21T04:24:57.515Z","schemaVersion":2},"datasetVersion":"2026-08-21T11:28:35.574Z"}