Формы
Форму в Joomla не верстают вручную. Её описывают файлом XML: какие есть поля, какого они типа, как очищать и проверять значения. По этому описанию Joomla выводит поля, проверяет присланные данные и возвращает форму с сообщениями об ошибках.
Где лежит
Формы компонента хранятся в папке forms административной части — по файлу на форму: administrator/components/com_hello/forms/post.xml. Файл создают вручную, а модель загружает его по имени: $this->loadForm('com_hello.post', 'post', ...).
Одно поле
<field name="title" type="text" label="Заголовок" />| Атрибут | Назначение |
|---|---|
name | Имя поля — обычно совпадает со столбцом таблицы |
type | Тип поля: от него зависит, что будет выведено |
label | Подпись; здесь может стоять ключ перевода |
Форма записи
Дополним форму из прошлого урока:
<?xml version="1.0" encoding="UTF-8"?>
<!-- administrator/components/com_hello/forms/post.xml -->
<form>
<fieldset name="details">
<field name="id" type="hidden" />
<field name="title" type="text" label="Заголовок"
required="true" maxlength="255" filter="string" />
<field name="body" type="editor" label="Текст"
filter="safehtml" buttons="false" />
<field name="published" type="list" label="Состояние"
default="1" filter="integer">
<option value="1">Опубликовано</option>
<option value="0">Скрыто</option>
</field>
</fieldset>
</form>Откройте запись в панели: текст теперь редактируется визуальным редактором, а под ним появился список «Состояние». Макет менять не пришлось — renderFieldset('details') выводит все поля группы.
Редактор сохраняет текст с тегами HTML, а фильтр safehtml убирает из него опасные. Поэтому в макете сайта components/com_hello/tmpl/post/default.php текст теперь выводят без экранирования: echo $this->post->body;.
Типы полей
| Тип | Что выводит |
|---|---|
text, textarea, hidden | Обычные поля HTML |
editor | Визуальный редактор |
list, radio, checkbox | Выбор из вариантов |
number, email, url, tel | Поля с подходящим типом ввода |
calendar | Дата с календарём |
media | Выбор картинки из медиа-менеджера |
user | Выбор пользователя |
category | Выбор категории |
Фильтры
Фильтр очищает значение до проверки и сохранения:
filter | Что остаётся |
|---|---|
string | Текст без тегов HTML |
integer | Целое число |
float | Число с дробной частью |
safehtml | HTML без опасных тегов и атрибутов |
raw | Значение как есть — только для доверенных данных |
Проверка
required="true" делает поле обязательным. Атрибут validate подключает правило проверки:
<field name="email" type="email" label="Почта автора" validate="email" />
<field name="site" type="url" label="Сайт" validate="url" />
<field name="views" type="number" label="Просмотры" validate="number" min="0" max="100000" />Проверка выполняется на сервере, когда FormController сохраняет запись. Очистите заголовок и нажмите «Сохранить»: Joomla вернёт форму с сообщением об ошибке, а остальные введённые значения останутся в полях. Именно для этого метод loadFormData() сначала читает данные из сессии.
Вывод полей
| Вызов в макете | Что выводит |
|---|---|
$this->form->renderFieldset('details') | Все поля группы |
$this->form->renderField('title') | Одно поле с подписью |
$this->form->getLabel('title') | Только подпись |
$this->form->getInput('title') | Только поле ввода |
По отдельности поля выводят, когда нужна своя разметка — например, две колонки.
Условный показ
Атрибут showon показывает поле только при заданном значении другого поля:
<field name="hide_reason" type="text" label="Причина скрытия" showon="published:0" />Поле «Причина скрытия» видно, только если в списке «Состояние» выбрано «Скрыто».
Частая ошибка
Поле добавили в форму, а значение не сохраняется. Table записывает только те поля, для которых в таблице есть столбец с тем же именем. Добавляя поле email в post.xml, добавьте и столбец email в таблицу #__hello_posts.