02 - Обзор пользовательских полей
Вы можете определить свой собственный тип поля (например, "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 обрабатывает поля. .
Как показано на диаграмме, в основном задача поля заключается в том, чтобы:
- применить в качестве входных данных
<field>
атрибуты внутри XML-файла и - создать в качестве выходных данных HTML-код, относящийся к полю, чтобы его можно было включить в общую веб-страницу.
Для этого необходимо код Form
вызывает 2 функции:
setup
- этой функции передается XML-элемент, относящийся к<field>
, вместе со значением поля и группой полей (для случаев, когда оно находится внутри элемента<fields>
). Обычно код этой функции извлекает соответствующие атрибуты из XML-элемента в локальные данные.renderField
- ожидается, что эта функция вернет HTML-код для поля.
Поле HTML состоит из 3 частей:
- label для поля
- элемент input для поля
- элемент
<div>
, который включает в себя оба вышеперечисленных элемента
Чтобы получить эти детали, вызывается renderField
- getLabel() - чтобы получить HTML-код для label, и
- getInput() - для получения HTML-кода для элемента input
и затем создаётся для ограждения элемент <div>
. Строки HTML, возвращенные из getLabel
и getInput
передаются как переменные в макет, чтобы они были соответствующим образом включены в окончательный HTML-код.
Многие поля стандартной формы Joomla также используют макеты для HTML-метки и элементов ввода, поэтому локальные данные, которые хранятся в функции setup()
передается как $displayData
к макету и, таким образом, к атрибутам HTML, таким как class
, description
, etc позиционируются правильно, на основе исходных атрибутов в XML-файле формы.