По-умолчанию в Virtuemart родительский товар и его дочерние - разные сущности, которые имеют свои параметры, в том числе и остаток. В ряде случаев, это не удобно, так как родительский товар зачастую не существует физически. Например футболка имеет 5 размеров. Футболка - родитель, размеры - дочерние. В листинге товаров отображается карточка "Футболка" с наличием "Нет в наличии", хотя у дочерних товаров остаток на складе есть. Криво, согласитесь? По идее, остаток родителя должен быть динамической единицей, а не статичной. Возможно, я сильно сглупили и не нашёл более элегантного способа... и по-этому изобрёл "велосипед", который проходится по всем товарам, считает остатки дочерних, складывает их и прописывает этот остаток родителю. Пока вроде работает без сбоев, но потребуется вешать скрипт на CRON.
<?php
define('_JEXEC', 1);
define('DS', DIRECTORY_SEPARATOR);
define('JPATH_BASE', realpath(dirname(__FILE__) . DS . '..'));
require_once(JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once(JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$app = JFactory::getApplication('site');
$app->initialise();
$db = JFactory::getDBO();
$query = 'SELECT virtuemart_product_id, product_parent_id
FROM #__virtuemart_products
WHERE product_parent_id = 0 ';
$db->setQuery($query);
$products = $db->loadObjectList('virtuemart_product_id');
foreach ($products as $product) {
$query = 'SELECT virtuemart_product_id, product_in_stock, product_parent_id
FROM #__virtuemart_products
WHERE product_parent_id = '.$product->virtuemart_product_id.' ';
$db->setQuery($query);
$products_children = $db->loadObjectList();
$sum = 0;
foreach ($products_children as $children) {
$sum += (int)$children->product_in_stock;
}
if ($children->product_parent_id > 0) {
$stock = array(
"virtuemart_product_id" => $product->virtuemart_product_id,
"product_in_stock" => $sum,
"parent" => $children->product_parent_id
);
} else {
$stock = array(
"virtuemart_product_id" => $product->virtuemart_product_id,
"product_in_stock" => $children->product_in_stock,
"parent" => $children->product_parent_id
);
}
$query = $db->getQuery(true);
if ($stock['product_in_stock']) {
$fields = array(
$db->quoteName('product_in_stock') . ' = '.$stock['product_in_stock'].''
);
$conditions = array(
$db->quoteName('virtuemart_product_id') . ' = '.$stock['virtuemart_product_id'].'',
);
$query->update($db->quoteName('#__virtuemart_products'))->set($fields)->where($conditions);
$db->setQuery($query);
$result = $db->execute();
}
}
?>
На всякий случай, сделайте резервную копию базы данных предварительно, а то вдруг результат вас не устроит!