Вы можете определить свой собственный тип поля (например, "mycustom"), на который затем можете ссылаться в XML-файле определения формы:

<field type="mycustom" … />

Для этого вам следует расширить класс \Joomla\CMS\Form\FormField он находится в libraries/src/Form/Formfield.php, или вы можете расширить один из стандартных типов полей формы, который расширяет FormField.

Когда вы определяете свою пользовательскую форму, вам также нужно будет включить addfieldprefix атрибут в XML-файле вашей формы, поэтому сообщите Joomla, где найти определение поля. Например, если у вас есть

namespace Mycompany\Component\Example\Administrator\Field;
class MycustomField extends FormField {
   protected $type = 'Mycustom';   
   // включение вышеизложенного по-прежнему является обычной практикой, но теперь в классах с пространством имен нет необходимости
…

тогда у вас должно было быть

<field addfieldprefix ="Mycompany\Component\Example\Administrator\Field" type="mycustom" … />

Вы можете включить атрибутaddfieldprefix  либо на уровне <field> , либо внутри тега, который содержит тег <field>.

Обзор Дизайна поля Joomla

Прежде чем мы перейдем к деталям того, как закодировать пользовательский класс field, полезно получить представление о том, как Joomla обрабатывает поля. Поля формы Joomla.

Как показано на диаграмме, в основном задача поля заключается в том, чтобы:

  • применить в качестве входных данных <field> атрибуты внутри XML-файла и
  • создать в качестве выходных данных HTML-код, относящийся к полю, чтобы его можно было включить в общую веб-страницу.

Для этого необходимо код Form вызывает 2 функции:

  • setup - этой функции передается XML-элемент, относящийся к <field>, вместе со значением поля и группой полей (для случаев, когда оно находится внутри элемента <fields>). Обычно код этой функции извлекает соответствующие атрибуты из XML-элемента в локальные данные.
  • renderField - ожидается, что эта функция вернет HTML-код для поля.

Поле HTML состоит из 3 частей:

  1. label для поля
  2. элемент input для поля
  3. элемент <div> , который включает в себя оба вышеперечисленных элемента

Чтобы получить эти детали, вызывается renderField

  • getLabel() - чтобы получить HTML-код для label, и
  • getInput() - для получения HTML-кода для элемента input 

и затем создаётся для ограждения элемент <div>. Строки HTML, возвращенные из getLabel и getInput передаются как переменные в макет, чтобы они были соответствующим образом включены в окончательный HTML-код.

Многие поля стандартной формы Joomla также используют макеты для HTML-метки и элементов ввода, поэтому локальные данные, которые хранятся в функции setup() передается как $displayData к макету и, таким образом, к атрибутам HTML, таким как class, description, etc позиционируются правильно, на основе исходных атрибутов в XML-файле формы.