Настройки и кеш
Два объекта реестра хранят значения, которые нужны часто. $this->config хранит настройки магазина — они меняются редко и редактируются в панели. $this->cache хранит результаты медленной работы, чтобы следующий запрос её не повторял.
Чтение настройки
$storeName = $this->config->get('config_name');get() возвращает значение по ключу или null, если такой настройки нет. Здесь это название магазина из System → Settings.
Откуда берутся настройки
| Источник | Что в нём |
|---|---|
Таблица oc_setting | Всё, что сохранено в панели, включая настройки дополнений |
system/config/ | Значения движка по умолчанию: хранилища кеша и сессий, стартовые действия |
В начале каждого запроса движок загружает строки oc_setting для текущего магазина в $this->config.
Часто используемые ключи:
| Ключ | Значение |
|---|---|
config_name | Название магазина |
config_email | Электронная почта магазина |
config_language | Код текущего языка, en-gb |
config_language_id | Идентификатор текущего языка |
config_currency | Основная валюта |
config_store_id | Идентификатор текущего магазина |
module_acme_hello_text | Настройка вашего модуля |
Приставка показывает владельца: config_ — ядро, module_, payment_, shipping_, total_ — дополнения.
Изменение на один запрос
$this->config->set('module_acme_hello_text', 'Временный текст');set() меняет значение только до конца запроса. Чтобы сохранить настройку навсегда, используют модель панели setting/setting и её метод editSetting() — как на странице настроек модуля.
Кеш
Список, который долго строится, сохраняют в кеш и в следующий раз читают оттуда:
// extension/acme_hello/catalog/controller/module/acme_hello.php, в index()
$key = 'acme_hello.latest.' . (int) $this->config->get('config_language_id');
$products = $this->cache->get($key);
if (!$products) {
$this->load->model('catalog/product');
$products = $this->model_catalog_product->getProducts(['start' => 0, 'limit' => 4]);
$this->cache->set($key, $products);
}Первый запрос выполняет выборку и сохраняет результат, следующие берут массив из кеша. В ключе есть идентификатор языка, потому что названия товаров в разных языках разные.
| Метод | Что делает |
|---|---|
get($key) | Возвращает значение или пустое значение, если его нет или оно устарело |
set($key, $value) | Сохраняет значение |
delete($key) | Удаляет значение |
Где хранится кеш
По умолчанию это файлы в system/storage/cache/. Хранилище и срок жизни записи задаются в system/config/default.php ключами cache_engine и cache_expire; там же доступны другие хранилища, например Redis.
Очистка
Когда данные меняются, запись кеша удаляют — иначе страница показывает старые данные, пока запись не устареет:
$this->cache->delete('acme_hello.latest.' . (int) $this->config->get('config_language_id'));Во время разработки достаточно удалить файлы в system/storage/cache/.
Частая ошибка
Данные, зависящие от посетителя, — корзину, имя, цены группы покупателей — сохраняют под общим ключом. Следующий посетитель получает из кеша чужие данные. Кешируйте только то, что одинаково для всех, или добавляйте в ключ всё, от чего зависит результат: язык, валюту, группу покупателей.