Сессии, покупатель и проверка входа
Сессия — хранилище, которое держит данные одного посетителя между запросами: выбранную валюту, идентификатор оформляемого заказа, сам факт входа. Объект покупателя сообщает, кто этот посетитель. Оба нужны, как только страница ведёт себя по-разному для гостя и для вошедшего покупателя.
Сессия
Данные сессии — массив $this->session->data. Всё, что в него записано, доступно в следующих запросах того же посетителя:
// extension/acme_hello/catalog/controller/module/acme_hello.php, в index()
$this->session->data['acme_hello_views'] = ($this->session->data['acme_hello_views'] ?? 0) + 1;
$data['views'] = $this->session->data['acme_hello_views'];Выведите {{ views }} в шаблоне модуля и несколько раз обновите главную страницу — число растёт: 1, 2, 3. В другом браузере счёт начнётся заново.
Значение удаляют через unset($this->session->data['acme_hello_views']).
Ключи, которые хранит в сессии ядро:
| Ключ | Что в нём |
|---|---|
currency | Код выбранной валюты |
customer_token | Токен вошедшего покупателя |
order_id | Идентификатор заказа во время оформления |
shipping_method, payment_method | Способы, выбранные при оформлении |
Свои ключи называйте с приставкой дополнения, чтобы они не пересекались с этими.
Объект покупателя
$this->customer есть только на витрине. Его класс лежит в system/library/cart/customer.php.
$data['name'] = $this->customer->isLogged() ? $this->customer->getFirstName() : '';{% if name %}
<p>{{ text_hello|format(name) }}</p>
{% endif %}Войдите на витрине по адресу index.php?route=account/login и откройте главную страницу — модуль здоровается по имени. Гость этой строки не видит.
| Метод | Что возвращает |
|---|---|
isLogged() | Вошёл ли покупатель |
getId() | Идентификатор покупателя, у гостя 0 |
getFirstName(), getLastName() | Имя и фамилия |
getEmail() | Электронная почта |
getGroupId() | Идентификатор группы покупателей |
Страница только для вошедших
public function history(): void
{
$language = 'language=' . $this->config->get('config_language');
if (!$this->customer->isLogged()) {
$this->session->data['redirect'] = $this->url->link('extension/acme_hello/module/acme_hello.history', $language);
$this->response->redirect($this->url->link('account/login', $language));
}
// страница для покупателя
}Откройте index.php?route=extension/acme_hello/module/acme_hello.history гостем — откроется страница входа. Ключ redirect сообщает странице входа, куда вернуться после успешного входа.
Токен покупателя
Страницы личного кабинета ядра в четвёртой версии дополнительно проверяют customer_token в адресе — это аналог user_token из панели. Ссылка на такую страницу содержит его:
$account = $this->url->link('account/account', $language . '&customer_token=' . $this->session->data['customer_token']);Требует ли токен конкретная страница, зависит от выпуска — посмотрите начало её контроллера в catalog/controller/account/.
Частая ошибка
Записи выбирают по идентификатору из адреса, не проверяя владельца: ...&callback_id=15 показывает заявку другого покупателя. Для вошедшего покупателя всегда добавляйте в запрос условие customer_id = (int) $this->customer->getId() — идентификатору, пришедшему из запроса, одному доверять нельзя.