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
- 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
- Check YAML indentation: form/groups must sit directly under the repeater field name, one level deeper than fields:
- 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
- Lint blueprint YAML in CI: every field with type: repeater must carry a form: or groups: key
- Copy repeater field examples from the official Tailor docs rather than the backend form widget syntax
- Watch YAML indentation — form/groups nested one level too deep are silently ignored
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
- The provided model class ":modelClass" for the recordfinder
- Could not spawn from path [{$spawnPath}]
- Type must be one of: {$typeAsString}.
- Field name is reserved: {$fieldName}.
- Invalid source reference '{$source}'. No blueprint found wit
AI-assisted analysis of octobercms/october@b608633a7e (2026-08-21).
Data as JSON: /api/errors/2e00d27ddf3a42a1.
Report an issue: GitHub.