Joomla 3 VirtueMart 3 API работа с пользовательской корзиной. Хранение информации о корзине.

Как правило информация о товарах в корзине VirtueMart храниться в сессии JOOMLA, хотя существует вариант хранения в базе данных. Ниже будет рассмотрен вариант получения информации о корзине из сессии JOOMLA, если же Вам требуется более детальная информация о том как устроена модель корзины, изучите содержание файла корневая_директория_сайта/components/com_virtuemart/helpers/cart.php, поскольку именно в этом файле было найдено решение.

Получение информации о корзине VirtueMart из сессии Joomla

var_dump структура полученного объекта корзины(в примере с двумя товарами внутри)

Пояснения по структуре получившегося объекта VirtueMart

Как видно из var_dump позиции товаров в корзине хранятся в $nikolaevevgeCart->cartProductsData в виде массива. У пустой корзины этот массив не содержит элементов. Каждый элемент корзины хранит Id товара в VirtueMart, количество такого товара и информацию из настраиваемых полей. В рассматриваемом случаи корзина содержит 2 товара, количество первого - 1 штука, а второго 3 штуки. Видно, что корзина не содержит информации о стоимости товара, эта информация будет подгружена в заказ в момент успешного оформления заказа. Не могу сказать, что именно такой же объект корзины получится при загрузке данных корзины из таблицы базы данных.

Так же исходя из структуры и практического опыта - информация о ценах товаров в заказе отвязана от стоимости товаров, то есть если Вы из админки поменяете стоимость товара, то в уже созданных заказах она не изменится.

Разберём как из отдельного файла добраться до корзины с ручным подключением фреймворка joomla

Создадим в корне или другом месте файл basket.php и разместим в нём код из следующего листинга(данный код может быть не совместим с joomla младше 3-ей версии). Так же следует учитывать что приведённый код актуален если joomla установлена в корневую папку сервера, а не в боле вложенные папки.

Обратите внимание, код до строчки(и включая её) require_once JPATH_BASE . '/includes/framework.php'; является достаточно стандартным и в таком виде его можно найти на многих форумах. Всё верно, уже после этой строчки Вы можете начать работу к примеру с объектом базы данных Joomla. В нашем же случаи, мы собираемся работать с сессиями и для их активации выполняем строчку JFactory::getApplication('site')->initialise(). Если этого не сделать, объект сессии после обращения к методу JFactory::getSession хотя и создастся, но последующее её обращение к методу get вернёт 0, даже если в действительности запись в сессии существует. Поэтому выполняем JFactory::getApplication('site')->initialise(); перед началом работы с сессиями.

Строчку JFactory::getApplication('site')->initialise(); необходимо выполнять до вызова $session = JFactory::getSession();. Следующая последовательность кода не верная и работать не будет:

 $session = JFactory::getSession();
 $app = JFactory::getApplication('site')->initialise();// неверная последовательность вызова, необходимо поменять эту строчку кода местами с строчкой выше(для корректной работы с сессиями).
 $cartSession = $session->get('vmcart', 0, 'vm');

Вы так же можете прочитать следующие статьи: