octobercms/october · error · Error
The titleProperty property should be specified in the object
Error message
The titleProperty property should be specified in the objectList editor configuration. Property: ${propertyDefinition.property} What it means
The CMS Page Lookup popup widget (the link picker used by the rich editor and form fields) validates its submitted form data in onInsertReference. The first check pulls `type` out of the widget's save data via array_pull; if it is empty, a ValidationException is thrown against the `type` field. The type identifies what is being linked (url, cms page, static page, etc.) and drives every later check.
Source
Thrown at modules/backend/assets/foundation/controls/inspector/inspector.editor.objectlist.js:14
/*
* Inspector object list editor class.
*/
+function ($) { "use strict";
var Base = $.oc.inspector.propertyEditors.base,
BaseProto = Base.prototype
var ObjectListEditor = function(inspector, propertyDefinition, containerCell, group) {
this.currentRowInspector = null
this.popup = null
if (propertyDefinition.titleProperty === undefined) {
throw new Error('The titleProperty property should be specified in the objectList editor configuration. Property: ' + propertyDefinition.property)
}
if (propertyDefinition.itemProperties === undefined) {
throw new Error('The itemProperties property should be specified in the objectList editor configuration. Property: ' + propertyDefinition.property)
}
Base.call(this, inspector, propertyDefinition, containerCell, group)
}
ObjectListEditor.prototype = Object.create(BaseProto)
ObjectListEditor.prototype.constructor = Base
ObjectListEditor.prototype.init = function() {
if (this.isKeyValueMode()) {
var keyProperty = this.getKeyProperty()
if (!keyProperty) {
throw new Error('Object list key property ' + this.propertyDefinition.keyPropertyView on GitHub (pinned to b608633a7e)
Solutions
- Make sure the popup form posts a non-empty `type` value in the widget data (normally `PageLookupItem[type]`).
- If you customized the widget's form fields, restore or keep the `type` field (visible or hidden) so getSaveData returns it.
- When calling the handler programmatically, include the full payload: `{ PageLookupItem: { type: 'url', url: '...' } }`.
Example fix
// before
oc.request(el, 'pagelookup::onInsertReference', {
data: { PageLookupItem: {} }
});
// after
oc.request(el, 'pagelookup::onInsertReference', {
data: { PageLookupItem: { type: 'url', url: 'https://example.com' } }
}); Defensive patterns
Strategy: validation
Validate before calling
// Before firing the handler, make sure the widget data carries a type
const item = { ...payload.PageLookupItem };
if (!item.type) {
// do not call the AJAX handler; prompt the user to pick a link type
showFlash('Select a link type first.');
} else {
oc.request(el, 'pagelookup::onInsertReference', { data: { PageLookupItem: item } });
} Try / catch
// Server-side, ValidationException is the intended failure mode; let it convert to field errors
try {
$widget->onInsertReference();
} catch (ValidationException $e) {
// $e->getErrors() -> ['type' => 'Missing type!'] — map back onto the form UI
} Prevention
- Keep the type select (even hidden) in any customized pagelookup form partial.
- Disable the insert button until a link type is chosen.
- In tests, always submit a minimal complete PageLookupItem payload.
When it happens
Trigger: Posting to the widget's `onInsertReference` AJAX handler (e.g. `pagelookup::onInsertReference`) with `PageLookupItem[type]` missing or empty; a customized pagelookup form partial whose type select was removed or renamed; programmatic calls or tests that submit an empty payload.
Common situations: Overriding the pagelookup widget form partial and dropping the hidden type field; JS that clears the select before submit; automated tests invoking the handler directly with no form data.
Related errors
- The itemProperties property should be specified in the objec
- Object list key property ${this.propertyDefinition.keyProper
- Object list value should be an array. Property: ${this.prope
- Object list value should be an object. Property: ${this.prop
- Values not found for the selected row.
AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21).
Data as JSON: /api/errors/bdcd26788a1c917f.
Report an issue: GitHub.