Encodera

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

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

Оглавление

Сессии, покупатель и проверка входа

Сессия — хранилище, которое держит данные одного посетителя между запросами: выбранную валюту, идентификатор оформляемого заказа, сам факт входа. Объект покупателя сообщает, кто этот посетитель. Оба нужны, как только страница ведёт себя по-разному для гостя и для вошедшего покупателя.

Сессия

Данные сессии — массив $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() — идентификатору, пришедшему из запроса, одному доверять нельзя.

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

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