Subform form field type

From Joomla! Documentation

Other languages:
العربية • ‎English • ‎español • ‎français • ‎Bahasa Indonesia • ‎Nederlands

The subform form field type provides a method for using XML forms inside one another or reuse forms inside an existing form. If attribute multiple is set to true then the included form will be repeatable.

The Field has two "predefined" layouts for displaying the subform as either a table or as a div container, as well as support for custom layouts.

An example XML field definition for single mode:

<field name="field-name" type="subform"
    formsource="path/to/exampleform.xml"
    label="Subform Field" description="Subform Field Description" />

An example XML field definition for multiple mode:

<field name="field-name" type="subform"
    formsource="path/to/exampleform.xml" multiple="true"
    label="Subform Field" description="Subform Field Description" />

Example XML of exampleform.xml

<?xml version="1.0" encoding="UTF-8"?>
<form>
    <field name="example_text" type="text" label="Example Text" />
    <field name="example_textarea" type="textarea" label="Example Textarea" cols="40" rows="8" />
</form>

An example XML of exampleform.xml with fieldsets

<?xml version="1.0" encoding="UTF-8"?>
<form>
    <fieldset name="section1" label="Section1">
        <field name="example_text" type="text" label="Example Text" />
        <field name="example_textarea" type="textarea" label="Example Textarea" cols="40" rows="8" />
    </fieldset>
    <fieldset name="section2" label="Section2">
        <field name="example_list" type="list" default="1" class="advancedSelect" label="Example List">
            <option value="1">JYES</option>
            <option value="0">JNO</option>
        </field>
    </fieldset>
</form>

The subform XML may also be specified inline as an alternative to placing the subform XML in a separate file. The following example illustrates this:

<?xml version="1.0" encoding="UTF-8"?>
<field
	name="field-name"
	type="subform"
	label="Subform Field"
	description="Subform Field Description"
	multiple="true"
	min="1"
	max="10"
	>
	<form>
		<field
			name="example_text"
			type="text"
			label="Example Text"
			/>
		<field
			name="example_textarea"
			type="textarea"
			label="Example Textarea"
			cols="40"
			rows="8"
			/>
	</form>
</field>

Field attributes:

  • type (mandatory) must be subform.
  • name (mandatory) is the unique name of the field.
  • label (mandatory) (translatable) is the descriptive title of the field.
  • description (optional) (translatable) is text that will be shown as a tooltip when the user moves the mouse over the drop-down box.
  • required (optional) The field must be filled before submitting the form.
  • message (optional) The error message that will be displayed instead of the default message.
  • default (optional) is the default value, JSON string.
  • formsource (mandatory) the form source to be included. A relative path to the xml file (relative to the root folder for the installed Joomla site) or a valid form name which can be found by JForm::getInstance().
  • multiple (optional) whether the subform fields are repeatable or not.
  • min (optional) count of minimum repeating in multiple mode. Default: 0.
  • max (optional) count of maximum repeating in multiple mode. Default: 1000.
  • groupByFieldset (optional) whether to group the subform fields by its fieldset (true or false). Default: false.
  • buttons (optional) which buttons to show in multiple mode. Default: add,remove,move.
  • layout (optional) the name of the layout to use when displaying subform fields.

Available layouts:

  • joomla.form.field.subform.default render the subform in a div container, without support of repeating. Default for single mode.
  • joomla.form.field.subform.repeatable render the subform in a div container, used for multiple mode. Support groupByFieldset.
  • joomla.form.field.subform.repeatable-table render the subform as a table, used for multiple mode. Supports groupByFieldset. By default each field is rendered as a table column, but if groupByFieldset=true then each fieldset is rendered as a table column.

Be aware

If your field in the subform has additional JavaScript logic then it may not work in multiple mode, because do not see the fields which added by the subform field dynamically. If it happened then you need to adjust your field to support it. Next example may help:

jQuery(document).ready(function(){
    ... here the code for setup your field as usual...

    jQuery(document).on('subform-row-add', function(event, row){
        ... here is the code to set up the fields in the new row ...
    })
});

Because of this some extra Joomla! fields may not work for now.

Subform not provide the Validation and Filter.

Example

Problem

After adding new rows selects are not "chosen".

Solution

Here is an example how to reinit jQuery Chosen on newly added repeated rows:

jQuery(document).ready(function(){
    jQuery(document).on('subform-row-add', function(event, row){
        jQuery(row).find('select').chosen();
    })
});

Or a PHP snippet to be used in e.g. your plugin in **onBeforeCompileHead** method or in your component view.

$doc = JFactory::getDocument();
$js = '
	jQuery(document).on(\'subform-row-add\', function(event, row){
		jQuery(row).find(\'select\').chosen();
	})
';
$doc->addScriptDeclaration($js);

So newly added rows now are "chosen" now

See also