Encodera

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

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

Оглавление

Хранилище 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(), чтобы в настройки не попал скрипт.

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

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