Выставляем остаток родительского товара по суммарному количеству дочерних в Virtuemart

Комментариев: 0

По-умолчанию в 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();
		}
	

}

?>

На всякий случай, сделайте резервную копию базы данных предварительно, а то вдруг результат вас не устроит!

Уведомлять о новых комментариях
Уведомлять
guest
0 Комментарий
Inline Feedbacks
View all comments