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-файле формы.