Стандартный тип поля Joomla XML - Textarea
Стандартный тип поля XML-форм Joomla — Textarea рендерит нативный HTML-элемент <textarea> для ввода многострочного текста без визуального редактора. Поле предназначено для работы с обычным текстом (plain text), поддерживает фильтрацию (filter), валидацию (validate) и условное отображение (showon).
Атрибуты поля
Ниже приведены основные атрибуты, поддерживаемые типом поля . Используйте их внутри тега <field> вашего XML-манифеста.
| Атрибут | Тип | Описание |
|---|---|---|
name
|
string | Обязательно. Уникальный системный идентификатор поля. Используется для получения значения в PHP ($input->get('name')). |
type
|
string | Обязательно. Должно быть равно "textarea". Определяет тип поля и его поведение (многострочное текстовое поле). |
label
|
string | Заголовок поля, видимый пользователю в админке. Может быть языковой константой (например, COM_EXAMPLE_NOTES_LABEL). |
filter
|
string | Метод фильтрации данных перед сохранением. Для textarea критично: string (очистка), safehtml (безопасный HTML), raw (без обработки). По умолчанию зависит от глобальных настроек. |
description
|
string | Текст подсказки. В Joomla 3 отображается при наведении на заголовок (tooltip), в J4/5/6 может выводиться под полем или во всплывающем окне. |
rows
|
integer | Количество видимых строк текстовой области. Если не указано, браузер использует значение по умолчанию (обычно 2-3 строки). |
cols
|
integer | Видимая ширина поля в символах. Если не указано, браузер автоматически определяет ширину на основе CSS или родительского контейнера. |
hint
|
string | Текст-заполнитель (placeholder), отображаемый внутри поля до ввода данных. В Joomla 4+ заменяет устаревший подход с description для подсказок ввода. |
default
|
string | Значение по умолчанию при создании новой записи. Может быть языковой константой или статическим текстом. |
class
|
string | CSS-классы для стилизации самого поля textarea. Например, class="form-control my-custom-class". |
required
|
boolean | Делает поле обязательным для заполнения (true/false). Активирует валидацию на клиенте (HTML5) и сервере. |
validate
|
string | Тип валидации данных: text, maxLength, customRule. Работает совместно с filter для комплексной проверки. |
readonly
|
boolean | Блокирует редактирование поля, но значение отправляется на сервер при сохранении формы (true/false). |
disabled
|
boolean | Полностью отключает поле: оно не редактируется и не отправляется на сервер (true/false). |
maxlength
|
integer | Максимальное количество символов, которое можно ввести (HTML5). Рекомендуется дублировать проверкой в БД и validate="maxLength". |
showon
|
string | Условное отображение поля в зависимости от значений других полей. Например, showon="show_notes:1" (показывать, если поле show_notes равно 1). |
onchange
|
string | JavaScript-код, выполняемый при изменении значения поля. Например, onchange="myFunction(this.value)". |
wrap
|
string | Поведение переноса строк при отправке формы: soft (по умолчанию, переносы не добавляются), hard (добавляются \r\n), off (переносы отключены). |
labelClass
|
string | CSS-классы для обёртки подписи (label). Например, labelClass="control-label". |
minlength
|
integer | Минимальное количество символов (HTML5). Работает совместно с required для строгой валидации ввода. |
autocomplete
|
string | Управление автозаполнением браузера: on, off, или специфичные токены (username, email и т.д.). |
spellcheck
|
boolean | Включение проверки орфографии браузером: true (включено), false (отключено). |
onkeyup
|
string | JavaScript-код, выполняемый при отпускании клавиши в поле. |
onkeydown
|
string | JavaScript-код, выполняемый при нажатии клавиши в поле. |
Визуальные примеры
Ниже представлены скриншоты отображения поля в разных версиях Joomla и темах административной панели.
Пример использования в XML
Добавьте этот код внутрь тега формы вашего XML-манифеста. Атрибут type="textarea" создаёт стандартное многострочное поле ввода, сохраняющее переносы строк и поддерживающее фильтрацию данных через параметр filter.
<field
name="notes"
type="textarea"
label="Примечания"
description="Введите дополнительную информацию в несколько строк."/>
Получение значения в PHP
Пример получения и обработки значения поля textarea в PHP-коде вашего компонента. Обратите внимание: метод getString() автоматически применяет базовую фильтрацию, но для контента с разметкой рекомендуется явно указывать filter="safehtml" в XML. При выводе не забывайте обрабатывать переносы строк через nl2br() или CSS-свойство white-space: pre-wrap.
// --- ВАРИАНТ ДЛЯ JOOMLA 4 / 5 / 6 (Современный) ---
use Joomla\CMS\Factory;
// Получаем объект ввода через Factory (рекомендуемый способ в MVC)
$input = Factory::getApplication()->input;
// getString() автоматически экранирует опасные символы и обрезает переносы при необходимости
// Второй параметр — значение по умолчанию, если поле пустое
$myText = $input->getString('notes', '');
// Альтернатива: если нужен контроль фильтра вручную
// Доступные фильтры: 'raw' (без обработки), 'string' (базовая очистка), 'safehtml' (разрешён безопасный HTML)
$myText = $input->get('notes', '', 'safehtml');
// --- ВАРИАНТ ДЛЯ JOOMLA 3.x (Устаревший) ---
// В J3 использовался JFactory или JRequest
$input = JFactory::getApplication()->input;
$myText = $input->get('notes', '', 'string');
// ИЛИ старым способом (не рекомендуется, но может встречаться в легаси-коде):
$myText = JRequest::getVar('notes', '', 'default', 'string');
// --- ОБРАБОТКА ПЕРЕНОСОВ СТРОК И ВЫВОД ---
// Текст из textarea сохраняет переносы строк (\n).
// Для корректного отображения в HTML используйте nl2br() или CSS white-space.
// Вариант 1: Преобразовать переносы в <br>
echo nl2br(htmlspecialchars($myText, ENT_QUOTES, 'UTF-8'));
// Вариант 2: Использовать CSS (рекомендуется для современного фронтенда)
echo '<div style="white-space: pre-wrap;">'.htmlspecialchars($myText, ENT_QUOTES, 'UTF-8').'</div>';
// Вариант 3: Если в поле разрешён безопасный HTML (filter="safehtml")
// Используем Joomla\Filter\OutputFilter для дополнительной защиты
use Joomla\Filter\OutputFilter;
echo OutputFilter::safeHtml($myText); // Только для J4+, в J3: JFilterOutput::safeHtml()
// --- ВАЖНО: ВЫБОР ФИЛЬТРА В ЗАВИСИМОСТИ ОТ СЦЕНАРИЯ ---
/*
| Фильтр | Когда использовать | Безопасность |
|-------------|---------------------------------------------|-----------------------|
| 'string' | Обычный текст, комментарии, описания | ✅ Автоматическая очистка |
| 'safehtml' | Текст с допустимыми тегами (<b>, <i>, <a>) | ✅ Фильтрация опасных тегов |
| 'raw' | Только если вы сами обрабатываете контент | ⚠️ Требует ручной санитизации |
| 'html' | Не рекомендуется без кастомной валидации | ❌ Может пропустить XSS |
*/
// --- БОНУС: Получение значения из модели/формы (если работаете внутри компонента) ---
// В современном подходе (J4+) данные формы часто доступны через $this->getItem() или $form->getValue()
// Пример в модели или представлении:
$myText = $this->item->notes ?? '';
// Или через форму:
$myText = $form->getValue('notes');
После получения данных важно помнить, что атрибут filter в XML очищает ввод, но не заменяет экранирование при выводе, всегда оборачивайте результат в htmlspecialchars() для защиты от XSS. Так как поле сохраняет символы переноса строк, для корректного отображения в HTML используйте nl2br() или CSS-свойство white-space: pre-wrap. Выбор фильтра зависит от сценария: string оптимален для обычного текста, safehtml разрешает безопасную разметку, а raw следует применять только при программной обработке. Приведённый код использует современное пространство имён Joomla 4–6; для обратной совместимости с Joomla 3.x достаточно заменить Joomla\CMS\Factory на JFactory.
Совет: Всегда явно указывайте атрибут filter (string для чистого текста или safehtml для допустимой разметки) — без него Joomla не гарантирует автоматическую защиту от XSS. При выводе данных обязательно используйте htmlspecialchars() и обрабатывайте переносы строк через nl2br() или CSS white-space: pre-wrap. В Joomla 4+ для текста-заполнителя внутри поля используйте hint, так как description теперь рендерится исключительно как всплывающая подсказка рядом с полем.
Подводные камни
-
Отсутствие явного фильтра: Без указания атрибута filter применяется системный фильтр по умолчанию, поведение которого различается в версиях (J3 оставляет больше свободы, J4/J5/J6 строже). Это может неожиданно вырезать допустимые теги или оставить XSS-уязвимость, если вывод не экранируется отдельно.
-
Игнорирование переносов строк в HTML: Символы \n из формы не преобразуются в
автоматически. Без обработки через nl2br() или CSS white-space: pre-wrap многострочный текст отобразится сплошной строкой на фронтенде. -
Небезопасный default с переносами: Вставка реальных символов новой строки в атрибут default нарушит валидность XML-манифеста. Используйте HTML-сущности или задавайте значение по умолчанию через PHP/базу данных.
-
Путаница между description и hint: В Joomla 3 description выводился как статический текст под полем, в J4+ он перемещён во всплывающую подсказку (tooltip). Для placeholder внутри поля в современных версиях обязательно используйте hint.
-
Клиентский maxlength и ошибки БД: Атрибут maxlength ограничивает ввод только на стороне браузера (HTML5). Если сохранённый текст превысит лимит столбца VARCHAR/TEXT в базе данных, запрос завершится ошибкой SQL. Всегда синхронизируйте maxlength и схему БД.
-
Потеря данных в динамических субформах: В компонентах subform или repeatable значения textarea могут сбрасываться при программном клонировании блоков из-за особенностей JS-рендеринга в J4+. Требуется явная проверка поведения в целевой версии и корректная привязка атрибута name.
-
Конфликт с визуальным редактором: Поле textarea не загружает WYSIWYG. Если в проекте ожидается форматирование текста пользователями, необходимо заменить тип на editor или явно указать это в ТЗ, иначе контент будет сохраняться как plain-text.