Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Формы

Форму в 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Число с дробной частью
safehtmlHTML без опасных тегов и атрибутов
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.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.