В данной статье мы рассмотрим очень конкретный кейс, часто встречающийся в мебельной тематике: что произойдет, если один и тот же товар добавлен в корзину дважды: один раз в составе комплекта и один раз как самостоятельный товар.
О том, как мы работаем с комплектами и откуда возник данный кейс, читайте в статье про комплекты.
Описание кейса
Представим, что на сайте одна и та же тумбочка представлена как отдельный товар, расположенный в разделе «Тумбы», и в составе спального гарнитура, который расположен в разделе «Спальни». Имеем в виду, что в базе данных сайта эта тумба хранится в единственном экземпляре и одновременно является простым товаром, продающимся отдельно, и элементом комплекта, продающимся в его составе.
Представим, что покупатель добавляет в корзину гарнитур с этой тумбой в комплекте, а затем решает добавить ее в корзину еще раз, но уже как отдельный товар. Для простоты просто предположим, что ему нужна отдельная тумба в другую комнату и он решил купить ее отдельно. В корзине таким образом окажется две тумбы.
Корзина битрикса будет считать, что товар просто добавлен в нее 2 раза. Сколько штук при этом было добавлено через гарнитур, а сколько — не через гарнитур, не отслеживается.
Если на этом этапе покупатель решит оформить заказ, никаких проблем не возникнет. В заказе будет две тумбы, как он и хотел. Но представим, что для чего-то он решил вернуться на страницу гарнитура и изменить количество тумб: вместо одной взять две. Возникает вопрос: как правильно обработать такой запрос покупателя и не наделать ошибок при оформлении заказа? Ведь в итоге в корзине должен оказаться ранее добавленный гарнитур, но уже с двумя тумбами, а также еще одна тумба, которая была добавлена отдельно.
В битриксе «из коробки» нельзя один и тот же товар добавить в корзину двумя разными строками.
Решение
Для упрощения картины страницу гарнитура можно представить как обычную страницу товара с кнопкой «В корзину». Только в отличие от обычного товара, в корзину будет добавляться сразу несколько товаров. Напрашивается следующее решение:
Каждый раз, когда гарнитур добавляют в корзину, его нужно полностью из корзины удалить и добавить заново в новом составе.
Звучит совсем не сложно, но возникает вопрос: как отделить товары нужного нам гарнитура от товаров, которые были добавлены в корзину ранее. Ведь если мы удалим товар из корзины, мы удалим его совсем, а не только то количество, которое нам надо. Здесь на помощь приходит возможность добавления собственных полей для товаров в корзине. То есть, при добавлении товара в корзину мы можем вместе с ним передать дополнительные поля с какой-то информацией. Такой информацией может стать JSON-массив, в котором будет храниться информация о том, откуда и в каком количестве был добавлен в корзину конкретный товар.
Логика следующая. Когда товар добавляется в корзину, мы для него также передаем в корзину примерно такой массив:
{
...
"from_ids": [
{ "from_id":"123", "quantuty":"2" },
]
...
}
Таким образом мы указываем, что данный товар был добавлен в корзину со страницы товара с id 123 в количестве 2 штук. В данном случае это гарнитур.
Когда данный товар будет добавлен в корзину еще раз, но уже со страницы отдельного товара, в корзине у этого товара массив обновится до такого примерно состояния:
{
...
"from_ids": [
{ "from_id":"123", "quantuty":"2" },
]
"from_id":"456": [
{ "from_id":"456", "quantuty":"1" },
]
...
}
Таким образом корзина знает, сколько штук откуда было добавлено.
И теперь, когда мы заново добавляем комплект в корзину, мы прочтем информацию из массива и восстановим товар в корзине в том виде, в котором он был.