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.keyProperty

View on GitHub (pinned to b608633a7e)

Solutions

  1. Make sure the popup form posts a non-empty `type` value in the widget data (normally `PageLookupItem[type]`).
  2. If you customized the widget's form fields, restore or keep the `type` field (visible or hidden) so getSaveData returns it.
  3. 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

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


AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21). Data as JSON: /api/errors/bdcd26788a1c917f. Report an issue: GitHub.