Joomla! Programmers Documentation

Manual Index

Example Custom Fields

This section provides 4 examples of how to create custom fields. The examples are also available in the sample component code which you can download and install.

Custom Field extending FormField

If you extend FormField then you should provide the getInput method and from this you should return the string of HTML for the field. For example, to capture a 3 character IATA airport code:

protected function getInput()
{
    $html = "<input type='text' id='{$this->id}' name='{$this->name}' " .
            "minlength='3' maxlength='3' size='3' " .
            "oninput='this.value = this.value.toUpperCase()'/>";
    return $html;
}

The attributes from your <field> element in the form definition XML file will have been loaded in the setup function into properties of the class, and so accessible via $this->name etc.

It's important to set the name attribute because this will be used as the key in the HTTP POST data when the form data is submitted.

By default, the label is set from the label= attribute in the form definition XML field. You can override this, for example if you want to include a link:

protected function getLabel()
{
    $html = "Enter the <a href='https://wikipedia.org/wiki/IATA_airport_code' target='_blank'>" .
            "3 character IATA airport code</a>";
    return $html;
}

In the sample component code the custom field type "custom1" gives an example of this.

Custom Field extending FormField using a layout

If you set the instance variable $layout then this is what will be taken as the layout for getInput. You don't then need to provide an implementation of getInput:

class Custom2Field extends FormField
{
    protected $layout = 'custom2field';
}

Joomla loads the attribute data held in $this into the $displayData so that you can extract the variables in your layout file, generating variables such as $id and $name. For example, in the site layouts/custom2field.php file:

<?php
defined('_JEXEC') or die;
extract($displayData);
?>
<input 
    type='text' 
    id='<?php echo $id?>' 
    name='<?php echo $name?>' 
    minlength='3' 
    maxlength='3' 
    size='3'
    oninput='this.value = this.value.toUpperCase()'/>

Remember to include the site layouts folder in your manifest XML file!

In the sample component code the custom field type "custom2" gives an example of this.

Custom Field extending ListField

If you want your custom field to display a list of options then you can extend Joomla\CMS\Form\Field\ListField and override the getOptions function:

use Joomla\CMS\Form\Field\ListField;
class Custom3Field extends ListField
{
    public function getOptions()
    {
        $options  = array("BFS", "HND", "YYZ");
        $options = array_merge(parent::getOptions(), $options);
        return $options;
    }
}

The line $options = array_merge(parent::getOptions(), $options) merges the options from the previous line with any <option> elements from the field in the form definition XML file.

In the sample component code the custom field type "custom3" gives an example of this.

Custom Field extending GroupedlistField

This enables your options to be grouped. For example, if you want to have airport codes grouped by countries, then you can override getGroups:

use Joomla\CMS\Form\Field\GroupedlistField;
class Custom4Field extends GroupedlistField
{
    public function getGroups()
    {
        $groups['Japan'] = array("HND");
        $groups['Canada'] = array("XXY", "ABC", "DEF");
        $groups['Northern Ireland'] = array("BFS", "BHD");
        $groups = array_merge(parent::getGroups(), $groups);
        return $groups;
    }
}

In the sample component code the custom field type "custom4" gives an example of this.