Поля формы HelperForm
HelperForm строит форму панели по массиву-описанию. В прошлом уроке в форме было одно текстовое поле. Здесь разобраны остальные виды полей и то, как проверить введённое.
Описание поля
Каждое поле — массив внутри ключа input в методе renderForm() главного класса:
// modules/acmehello/acmehello.php
[
'type' => 'text',
'label' => $this->trans('Текст приветствия', [], 'Modules.Acmehello.Admin'),
'name' => 'ACMEHELLO_GREETING',
'desc' => $this->trans('Показывается на главной странице.', [], 'Modules.Acmehello.Admin'),
'required' => true,
],| Ключ | Что задаёт |
|---|---|
type | Вид поля |
label | Подпись слева |
name | Имя поля в запросе и ключ в fields_value |
desc | Подсказка под полем |
required | Звёздочка у подписи. Саму проверку пишете вы |
Переключатель
Поле «да — нет» для настройки «показывать приветствие»:
[
'type' => 'switch',
'label' => $this->trans('Показывать приветствие', [], 'Modules.Acmehello.Admin'),
'name' => 'ACMEHELLO_ENABLED',
'is_bool' => true,
'values' => [
['id' => 'enabled_on', 'value' => 1, 'label' => $this->trans('Да', [], 'Admin.Global')],
['id' => 'enabled_off', 'value' => 0, 'label' => $this->trans('Нет', [], 'Admin.Global')],
],
],Добавьте массив в input — в форме появится переключатель. В values всегда два варианта с уникальными id.
Выпадающий список
Сколько отзывов показывать на карточке товара:
[
'type' => 'select',
'label' => $this->trans('Отзывов на странице товара', [], 'Modules.Acmehello.Admin'),
'name' => 'ACMEHELLO_LIMIT',
'options' => [
'query' => [
['id' => 3, 'name' => '3'],
['id' => 5, 'name' => '5'],
['id' => 10, 'name' => '10'],
],
'id' => 'id',
'name' => 'name',
],
],query — список вариантов, а id и name говорят, из каких ключей брать значение и подпись.
Виды полей
type | Поле |
|---|---|
text | Строка |
textarea | Многострочный текст |
switch | Переключатель «да — нет» |
select | Выпадающий список |
checkbox, radio | Флажки и переключатели |
color | Выбор цвета |
file | Загрузка файла |
hidden | Скрытое поле |
Значения полей
У каждого поля должно быть значение в fields_value, иначе панель покажет предупреждение:
$helper->fields_value = [
'ACMEHELLO_GREETING' => Tools::getValue('ACMEHELLO_GREETING', Configuration::get('ACMEHELLO_GREETING')),
'ACMEHELLO_ENABLED' => (int) Configuration::get('ACMEHELLO_ENABLED'),
'ACMEHELLO_LIMIT' => (int) Configuration::get('ACMEHELLO_LIMIT'),
];Второй аргумент Tools::getValue() — значение, если поля в запросе нет. Так после ошибки в поле останется то, что ввёл человек, а не старое значение из базы.
Сохранение новых полей
В getContent() после проверки приветствия добавьте:
Configuration::updateValue('ACMEHELLO_ENABLED', (int) Tools::getValue('ACMEHELLO_ENABLED'));
Configuration::updateValue('ACMEHELLO_LIMIT', (int) Tools::getValue('ACMEHELLO_LIMIT'));Значения по умолчанию для новых ключей запишите в install(), а в uninstall() удалите их. Теперь настройкой можно пользоваться — например, вернуть пустую строку из hookDisplayHome(), если ACMEHELLO_ENABLED равно нулю.
Проверка значений
Класс Validate содержит готовые проверки. Каждая возвращает true или false.
| Метод | Что проверяет |
|---|---|
isUnsignedInt() | Целое число от нуля |
isEmail() | Адрес почты |
isUrl() | Адрес сайта |
isGenericName() | Строка без символов <>={} |
isCleanHtml() | HTML без скриптов |
isPrice() | Цена |
$limit = Tools::getValue('ACMEHELLO_LIMIT');
if (!Validate::isUnsignedInt($limit) || (int) $limit > 50) {
$output .= $this->displayError($this->trans('Неверное число отзывов.', [], 'Modules.Acmehello.Admin'));
}При неверном числе над формой покажется ошибка, и значение не сохранится.
Частая ошибка
Поле добавили в input, но забыли в fields_value. В режиме отладки страница настроек покажет предупреждение о неопределённом ключе, а поле будет пустым даже после сохранения. Для каждого name из описания формы должен быть ключ в fields_value.