octobercms/october · error · SystemException

Repeater must specify either a "form" or "group" property fo

Error message

Repeater must specify either a "form" or "group" property for the form fields

What it means

Thrown by Tailor's Repeater content field during validateConfig() when neither a form nor groups property was supplied in the field configuration. A repeater field needs a fieldset to render its repeated items; if fieldsetConfig is still null after defineConfig() processes the config, the field is invalid and a SystemException is raised.

Source

Thrown at modules/tailor/contentfields/RepeaterField.php:50

    {
        if (isset($config['form'])) {
            $this->fieldsetConfig = (array) $config['form'];
            $this->useGroups = false;
        }

        if (isset($config['groups'])) {
            $this->fieldsetConfig = (array) $config['groups'];
            $this->useGroups = true;
        }
    }

    /**
     * validateConfig
     */
    public function validateConfig()
    {
        if ($this->fieldsetConfig === null) {
            throw new SystemException('Repeater must specify either a "form" or "group" property for the form fields');
        }
    }

    /**
     * defineFormField will define how a field is displayed in a form.
     */
    public function defineFormField(FormElement $form, $context = null)
    {
        $config = ['groupKeyFrom' => 'content_group'] + $this->getCleanFormConfig();

        $form->addFormField($this->fieldName, $this->label)->useConfig($config);
    }

    /**
     * defineBatchListColumn
     */
    public function defineBatchListColumn(ListElement $list, $context = null)
    {

View on GitHub (pinned to b608633a7e)

Solutions

  1. Add a form: key with the repeated fields (single group) or a groups: key with named group definitions to the repeater field in your blueprint
  2. Check YAML indentation: form/groups must sit directly under the repeater field name, one level deeper than fields:
  3. Remove the repeater field entirely if it was added as a placeholder with no configuration

Example fix

# before
fields:
  slides:
    type: repeater
    # no form or groups key

# after
fields:
  slides:
    type: repeater
    form:
      fields:
        title:
          type: text
        image:
          type: mediafinder
Defensive patterns

Strategy: validation

Validate before calling

// Validate repeater field config before saving/compiling a blueprint
$repeaterConfig = $fieldset['fields']['slides'] ?? null;
if (($repeaterConfig['type'] ?? '') === 'repeater'
    && !isset($repeaterConfig['form'], $repeaterConfig['groups'])) {
    throw new InvalidArgumentException("Repeater field [slides] must define 'form' or 'groups'");
}

Prevention

When it happens

Trigger: Declaring a repeater content field in a blueprint without a form: or groups: key, or misspelling those keys (e.g. field: instead of form:, group: instead of groups:). The exception fires when the fieldset is validated, which happens while Tailor compiles the blueprint's form definition.

Common situations: Copy-pasting a widget config that used different key names; YAML indentation mistakes that put form: under the wrong level so it is not seen; renaming keys when migrating from the backend form widget syntax to Tailor blueprint syntax.

Related errors


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