octobercms/october · warning · Error

Object list key property ${this.propertyDefinition.keyProper

Error message

Object list key property ${this.propertyDefinition.keyProperty} is not defined in itemProperties. Property: ${this.propertyDefinition.property}

What it means

The third PageLookup validation: when the `reference` form field is neither hidden nor disabled and the submitted reference value is empty, this ValidationException is thrown against `reference`. The reference names the exact target within the chosen type (a specific page, blog post, record, etc.), so an empty one cannot resolve at render time.

Source

Thrown at modules/backend/assets/foundation/controls/inspector/inspector.editor.objectlist.js:32

            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
                    + ' is not defined in itemProperties. Property: ' + this.propertyDefinition.property)
            }
        }

        BaseProto.init.call(this)
    }

    ObjectListEditor.prototype.dispose = function() {
        this.unregisterHandlers()
        this.removeControls()

        this.currentRowInspector = null
        this.popup = null

        BaseProto.dispose.call(this)
    }

    ObjectListEditor.prototype.supportsExternalParameterEditor = function() {

View on GitHub (pinned to b608633a7e)

Solutions

  1. Choose a value in the reference dropdown (the page/post/record to link to) before inserting.
  2. If a type has no reference target, hide or disable the field in the widget configuration so the check is bypassed.
  3. Programmatic callers: include `reference` in the payload, e.g. `{ type: 'cms-page', reference: 'blog/post/1' }`.

Example fix

// before
oc.request(el, 'pagelookup::onInsertReference', {
    data: { PageLookupItem: { type: 'cms-page', cms_page: 'about/index' } }
});

// after
oc.request(el, 'pagelookup::onInsertReference', {
    data: { PageLookupItem: { type: 'cms-page', cms_page: 'about/index', reference: 'about/team' } }
});
Defensive patterns

Strategy: validation

Validate before calling

const item = { ...payload.PageLookupItem };
if (!item.reference && referenceFieldEnabled) {
    showFlash('Please select a page reference.');
} else {
    oc.request(el, 'pagelookup::onInsertReference', { data: { PageLookupItem: item } });
}

Try / catch

try {
    $result = $widget->onInsertReference();
} catch (October\Rain\Exception\ValidationException $e) {
    $errors = $e->getErrors(); // ['reference' => 'Please select a page reference']
}

Prevention

When it happens

Trigger: Submitting the popup with the reference select empty while the field is editable; posting `PageLookupItem` data with `reference` missing or ''; disabling options that leave no selectable reference for the current type.

Common situations: Clicking insert before picking the target item; a type whose reference options failed to load (empty dropdown); tests submitting partial payloads.

Related errors


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