Страница настроек
Чтобы владелец магазина менял настройки модуля из панели управления, модулю нужна страница настроек. Отдельного файла для неё не требуется: достаточно добавить в главный класс метод 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. Форма отправляется, страница перезагружается, но ничего не сохраняется и сообщений нет. Эти две строки должны совпадать точно, включая регистр.