Стандартный тип поля Joomla XML - Tel
Тип поля tel предназначен для ввода телефонных номеров. При рендеринге формы это поле генерирует стандартный HTML5-элемент <input type="tel" />. Основная особенность типа — улучшение пользовательского опыта на мобильных устройствах: при активации поля браузер автоматически отображает цифровую клавиатуру, оптимизированную для ввода телефонных номеров. Также наличие специфического типа позволяет браузерам и менеджерам паролей корректно распознавать поле для функции автозаполнения контактных данных.
Атрибуты поля
Ниже приведены основные атрибуты, поддерживаемые типом поля . Используйте их внутри тега <field> вашего XML-манифеста.
| Атрибут | Тип | Описание |
|---|---|---|
name
|
string | Обязательно. Уникальный системный идентификатор поля. Используется для получения значения в PHP ($input->get('name')). |
type
|
string | Обязательно. Должно быть равно "tel". Определяет тип поля и его поведение. |
label
|
string | Заголовок поля, видимый пользователю. Может быть языковой константой (например, COM_EXAMPLE_PHONE_LABEL). |
description
|
string | Описание поля. В Joomla 3 — всплывающая подсказка; в Joomla 4/5/6 — текст под полем. |
required
|
boolean | Делает поле обязательным для заполнения. Принимает значения true или false. |
pattern
|
string | Регулярное выражение для проверки формата телефона. Критически важен, так как встроенной валидации нет. Пример: [\+]?[0-9\s\-\(\)]+. |
hint
|
string | Текст-подсказка внутри пустого поля (placeholder). Исчезает при начале ввода. |
default
|
string | Значение по умолчанию, отображаемое при создании новой записи. |
autocomplete
|
string | Управляет автозаполнением. Рекомендуемое значение: "tel" для подстановки номеров из контактов браузера. |
showon
|
string | Условное отображение поля. Поле показывается только если другое поле соответствует условию. Пример: showon="country:RU". |
filter
|
string | Серверная фильтрация данных. Для телефонов рекомендуется "cmd" (очистка) или "string" (сохранение формата). |
maxlength
|
integer | Максимальное количество символов, которое можно ввести. |
size
|
integer | Видимая ширина поля в символах. Не влияет на максимальную длину ввода. |
class
|
string | Дополнительные CSS-классы для стилизации (например, классы Bootstrap). |
readonly
|
boolean | Поле доступно только для чтения. Значение нельзя изменить, но оно отправляется на сервер. |
disabled
|
boolean | Поле полностью заблокировано. Не принимает фокус и не отправляется на сервер. |
autofocus
|
boolean | Автоматически устанавливает фокус на поле после загрузки страницы. |
spellcheck
|
boolean | Включает/отключает проверку орфографии. Для телефонов рекомендуется false. |
Визуальные примеры
Ниже представлены скриншоты отображения поля в разных версиях Joomla и темах административной панели.
Пример использования в XML
Добавьте этот код внутрь тега формы в вашем XML-файле. Атрибут type="tel" определяет семантику поля как телефонного номера, что позволяет браузерам корректно обрабатывать ввод (включая автозаполнение и адаптацию интерфейса ввода).
<field
name="phone"
type="tel"
label="Номер телефона"
description="Введите номер телефона"/>
Получение значения в PHP
Для извлечения значения телефона используйте объект ввода приложения (Input). Поскольку телефонный номер является строкой, применяются методы getString() (для сохранения исходного форматирования) или getCmd() (для очистки от спецсимволов). В примере ниже показано корректное получение данных с учетом различий в инициализации объекта Input между версиями Joomla 3 и Joomla 4/5/6.
// --- ВАРИАНТ ДЛЯ JOOMLA 4 / 5 / 6 (Современный) ---
use Joomla\CMS\Factory;
// Получаем объект ввода через Factory (рекомендуемый способ в MVC)
$input = Factory::getApplication()->input;
// getString() сохраняет пробелы и скобки (для отображения)
$phoneDisplay = $input->getString('phone_field', '');
// getCmd() удаляет лишние символы, оставляя только цифры, +, -, . (для БД)
$phoneClean = $input->getCmd('phone_field', '');
// --- ВАРИАНТ ДЛЯ JOOMLA 3.x (Устаревший) ---
// В J3 используется класс JFactory
$input = JFactory::getApplication()->input;
// Аналогичная логика фильтров
$phoneDisplay = $input->getString('phone_field', '');
$phoneClean = $input->getCmd('phone_field', '');
// ИЛИ старым способом (не рекомендуется):
// $phone = JRequest::getVar('phone_field', '', 'post', 'cmd');
// --- ВАЖНОЕ ПРИМЕЧАНИЕ ПО ФИЛЬТРАЦИИ ---
// Для телефонных номеров НЕ используйте getInt(), так как он обрежет номер
// при наличии символов '+', '(' или пробелов.
// Используйте getString() для вывода и getCmd() для сохранения/поиска.
// Безопасный вывод на экран (защита от XSS):
echo htmlspecialchars($phoneDisplay, ENT_QUOTES, 'UTF-8');
Для телефонных номеров критически важно не использовать метод getInt(), так как он обрежет данные из-за наличия символов +, скобок или пробелов. Вместо этого применяйте getString() для сохранения исходного форматирования при выводе или getCmd() для очистки номера от лишних символов перед сохранением в базу данных. При отображении значения на странице всегда используйте htmlspecialchars() для защиты от XSS-уязвимостей.
Совет: Для улучшения пользовательского опыта на мобильных устройствах рекомендуется добавлять атрибут autocomplete="tel", который поможет браузерам автоматически подставлять сохраненные номера. Если требуется строгая проверка формата ввода, используйте атрибут pattern с регулярным выражением, так как стандартный тип tel не выполняет автоматическую валидацию данных на стороне клиента.
Подводные камни
-
Отсутствие автоматической валидации: В отличие от поля email или url, тип tel не проверяет формат введенных данных на стороне браузера. Пользователь может ввести буквы или произвольные символы, и форма будет считаться валидной. Для строгой проверки обязательно используйте атрибут pattern с регулярным выражением.
-
Особенности фильтрации в PHP: Никогда не используйте метод $input->getInt() для получения телефона, так как он обрежет номер при первом же спецсимволе (например, + или пробеле). Для сохранения форматирования применяйте getString(), а для очистки номера перед записью в базу — getCmd().
-
Различия в мобильных клавиатурах: Поведение цифровой клавиатуры на iOS и Android может отличаться в зависимости от версии ОС и браузера. Атрибут type="tel" является лишь рекомендацией для браузера, но не гарантирует появление исключительно цифровой панели ввода во всех возможных сценариях.