Хранилище Configuration
Текст приветствия сейчас записан прямо в коде, и владелец магазина не может его изменить. Настройки модуля хранит класс Configuration — это пары «ключ — значение» в таблице ps_configuration базы данных. Тем же хранилищем пользуется само ядро.
Запись и чтение
Configuration::updateValue('ACMEHELLO_GREETING', 'Добро пожаловать!');
$greeting = Configuration::get('ACMEHELLO_GREETING');updateValue() создаёт значение или заменяет существующее. get() возвращает его строкой, а если ключа нет — false.
Ключ пишут заглавными буквами и начинают с имени модуля — так он не совпадёт с чужим. Длина ключа — до 254 символов.
Значение по умолчанию при установке
Настройку создают в install(), а удаляют в uninstall():
// modules/acmehello/acmehello.php
public function install(): bool
{
return parent::install()
&& $this->registerHook('displayHome')
&& $this->registerHook('displayFooterProduct')
&& $this->registerHook('actionValidateOrder')
&& $this->registerHook('actionFrontControllerSetMedia')
&& Configuration::updateValue('ACMEHELLO_GREETING', 'Добро пожаловать!');
}
public function uninstall(): bool
{
return Configuration::deleteByName('ACMEHELLO_GREETING')
&& parent::uninstall();
}После удаления модуля в базе не останется его строк.
Использование в хуке
// modules/acmehello/acmehello.php
public function hookDisplayHome(array $params): string
{
$this->context->smarty->assign([
'greeting' => Configuration::get('ACMEHELLO_GREETING'),
]);
return $this->fetch('module:acmehello/views/templates/hook/home.tpl');
}Сбросьте модуль, чтобы install() записал значение:
php bin/console prestashop:module reset acmehelloГлавная страница выглядит так же, но текст теперь берётся из базы. Проверить можно запросом:
SELECT name, value FROM ps_configuration WHERE name LIKE 'ACMEHELLO%';Запрос вернёт одну строку с ключом ACMEHELLO_GREETING и текстом приветствия.
Методы
| Метод | Что делает |
|---|---|
Configuration::get($key) | Читает значение |
Configuration::updateValue($key, $value) | Записывает |
Configuration::deleteByName($key) | Удаляет |
Configuration::hasKey($key) | Проверяет, есть ли ключ |
Configuration::getMultiple([$key1, $key2]) | Читает несколько ключей в массив |
Типы значений
Хранилище держит строки. Число или флаг при чтении приводят к нужному типу сами:
Configuration::updateValue('ACMEHELLO_LIMIT', 5);
Configuration::updateValue('ACMEHELLO_ENABLED', 1);
$limit = (int) Configuration::get('ACMEHELLO_LIMIT');
$enabled = (bool) Configuration::get('ACMEHELLO_ENABLED');Массив сохраняют строкой JSON: json_encode() при записи и json_decode() при чтении.
Значения на нескольких языках
Если текст должен отличаться по языкам, передают массив, где ключ — номер языка:
$values = [];
foreach (Language::getLanguages(false) as $language) {
$values[$language['id_lang']] = 'Добро пожаловать!';
}
Configuration::updateValue('ACMEHELLO_GREETING', $values);
$greeting = Configuration::get('ACMEHELLO_GREETING', $this->context->language->id);Второй аргумент get() — номер языка, для которого нужно значение.
Настройки ядра
Тем же способом читают настройки самого магазина.
| Ключ | Что в нём |
|---|---|
PS_SHOP_NAME | Название магазина |
PS_SHOP_EMAIL | Почта магазина |
PS_LANG_DEFAULT | Номер языка по умолчанию |
PS_CURRENCY_DEFAULT | Номер валюты по умолчанию |
Частая ошибка
Configuration::updateValue() по умолчанию вырезает из значения HTML. Вы сохраняете текст с тегами, а читаете его без них. Для HTML передайте третий аргумент: Configuration::updateValue('ACMEHELLO_TEXT', $html, true) — и перед этим проверьте значение через Validate::isCleanHtml(), чтобы в настройки не попал скрипт.