Encodera

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

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

Оглавление

Поля формы 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.

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

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