Encodera

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

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

Оглавление

Страница настроек

Чтобы владелец магазина менял настройки модуля из панели управления, модулю нужна страница настроек. Отдельного файла для неё не требуется: достаточно добавить в главный класс метод getContent(). Всё, что он вернёт, панель покажет как страницу модуля.

Метод getContent

// modules/acmehello/acmehello.php
public function getContent(): string
{
    return '<p>Здесь будут настройки.</p>';
}

Откройте «Модули → Менеджер модулей» и найдите модуль: у него появилась кнопка «Настроить». По нажатию откроется страница с этой строкой. Сбрасывать модуль не нужно.

Форма

Форму не верстают вручную: её описывают массивом, а класс HelperForm рисует поля в стиле панели. Вынесите это в отдельный метод:

// modules/acmehello/acmehello.php
private function renderForm(): string
{
    $form = [
        'form' => [
            'legend' => ['title' => $this->trans('Настройки', [], 'Admin.Global')],
            'input' => [
                [
                    'type' => 'text',
                    'label' => $this->trans('Текст приветствия', [], 'Modules.Acmehello.Admin'),
                    'name' => 'ACMEHELLO_GREETING',
                    'required' => true,
                ],
            ],
            'submit' => ['title' => $this->trans('Сохранить', [], 'Admin.Actions')],
        ],
    ];
 
    $helper = new HelperForm();
    $helper->module = $this;
    $helper->name_controller = $this->name;
    $helper->token = Tools::getAdminTokenLite('AdminModules');
    $helper->currentIndex = AdminController::$currentIndex . '&configure=' . $this->name;
    $helper->submit_action = 'submitAcmehello';
    $helper->default_form_language = (int) Configuration::get('PS_LANG_DEFAULT');
    $helper->fields_value = [
        'ACMEHELLO_GREETING' => Configuration::get('ACMEHELLO_GREETING'),
    ];
 
    return $helper->generateForm([$form]);
}
 
public function getContent(): string
{
    return $this->renderForm();
}

На странице настроек появится блок «Настройки» с одним полем, в котором уже стоит текущий текст, и кнопкой «Сохранить». Пока кнопка ничего не сохраняет.

Что задаётся у помощника

СвойствоЗачем
moduleМодуль, которому принадлежит форма
tokenЗащитный ключ панели: без него отправку отклонят
currentIndexАдрес, на который отправится форма, — эта же страница настроек
submit_actionИмя кнопки отправки. По нему узнают, что форму отправили
fields_valueТекущие значения полей: ключ — name поля

Сохранение

Форма отправляется на ту же страницу, поэтому getContent() сначала проверяет, не пришли ли данные:

// modules/acmehello/acmehello.php
public function getContent(): string
{
    $output = '';
 
    if (Tools::isSubmit('submitAcmehello')) {
        $greeting = trim((string) Tools::getValue('ACMEHELLO_GREETING'));
 
        if ($greeting === '' || !Validate::isGenericName($greeting)) {
            $output .= $this->displayError(
                $this->trans('Введите текст приветствия.', [], 'Modules.Acmehello.Admin')
            );
        } else {
            Configuration::updateValue('ACMEHELLO_GREETING', $greeting);
 
            $output .= $this->displayConfirmation(
                $this->trans('Настройки сохранены.', [], 'Modules.Acmehello.Admin')
            );
        }
    }
 
    return $output . $this->renderForm();
}

Измените текст и нажмите «Сохранить»: над формой появится зелёное сообщение, а на главной странице витрины — новое приветствие. Если очистить поле, покажется красная ошибка, и значение не изменится.

Что здесь используется

ВызовЧто делает
Tools::isSubmit('submitAcmehello')Проверяет, что в запросе есть кнопка с этим именем
Tools::getValue('ACMEHELLO_GREETING')Читает поле из запроса
Validate::isGenericName()Проверяет, что в строке нет опасных символов
displayError()Возвращает HTML красного сообщения
displayConfirmation()Возвращает HTML зелёного сообщения

Частая ошибка

Имя в submit_action и имя в Tools::isSubmit() различаются — например, submitAcmehello и submitAcmeHello. Форма отправляется, страница перезагружается, но ничего не сохраняется и сообщений нет. Эти две строки должны совпадать точно, включая регистр.

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

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