Как сохранять товары в корзине после авторизации?

Для сохранения товаров в корзине после авторизации в 1C-Bitrix необходимо выполнить несколько шагов.

1. Сохранить информацию о товарах в сессии до авторизации пользователя. При добавлении товара в корзину, необходимо сохранять информацию о товаре в сессии, например, с помощью метода $_SESSION. Можно создать массив, в котором будут храниться данные о товарах (например, идентификаторы товаров, количество, цены и другие параметры). При каждой операции с корзиной (добавление, удаление, изменение количества товаров) необходимо обновлять этот массив в сессии.

Примерный код для добавления товара в корзину и сохранения его в сессии:

// Получаем идентификатор товара и другие параметры добавляемого товара
$productID = $_POST['product_id'];
$quantity = $_POST['quantity'];
$price = $_POST['price'];

// Создаем массив с информацией о товаре
$productData = [
    'product_id' => $productID,
    'quantity' => $quantity,
    'price' => $price
];

// Проверяем, есть ли уже товары в корзине
if (!empty($_SESSION['cart'])) {
    // Если уже есть, добавляем новый товар в массив существующих товаров
    $_SESSION['cart'][] = $productData;
} else {
    // Если корзина пуста, создаем новый массив с одним товаром
    $_SESSION['cart'] = [$productData];
}

2. После авторизации пользователя необходимо получить сохраненную информацию о товарах из сессии и добавить ее в корзину пользователя. В 1C-Bitrix это можно сделать с помощью события OnAfterUserAuthorize, которое вызывается после авторизации пользователя.

В файле init.php вашего сайта нужно зарегистрировать обработчик для события OnAfterUserAuthorize:

AddEventHandler("main", "OnAfterUserAuthorize", Array("MyClass", "OnAfterUserAuthorizeHandler"));

Затем создайте класс MyClass с методом OnAfterUserAuthorizeHandler, который будет получать информацию о товарах из сессии и добавлять их в корзину пользователя:

class MyClass
{
    public static function OnAfterUserAuthorizeHandler(&$fields)
    {
        // Проверяем, есть ли сохраненная информация о товарах в сессии
        if (!empty($_SESSION['cart'])) {
            // Получаем текущего авторизованного пользователя
            global $USER;
            $userID = $USER->GetID();

            // Перебираем товары в корзине и добавляем их в корзину пользователя
            foreach ($_SESSION['cart'] as $productData) {
                $productID = $productData['product_id'];
                $quantity = $productData['quantity'];

                // Добавляем товар в корзину пользователя
                CSaleBasket::Add([
                    'PRODUCT_ID' => $productID,
                    'QUANTITY' => $quantity,
                    'USER_ID' => $userID
                ]);
            }

            // Очищаем информацию о товарах в сессии
            unset($_SESSION['cart']);
        }
    }
}

Этот обработчик будет вызван после авторизации пользователя, и товары из сессии будут добавлены в корзину пользователя.

Таким образом, при авторизации пользователь сохранит товары из корзины в сессии, а затем эти товары будут автоматически добавлены в корзину пользователя.