Скрыть пустые категории товаров

5 года 8 мес. назад #8649 от Михаил
Здравствуйте!
После авто импорта столкнулся с такоей проблемой, есть много пустых категорий, настроено таким образом что импорт происходит товаров через API автоматически, проверяется кол-во на складе и если товара нет он не отображается!
Ну вот в следсвии чего и появляются пустые категории, поискав информацию нашел PHP код который скрывает пустые категории, т.е. если товара нет то и отображаться они не будут, товар появился они появились, но что то у меня не работает, скрывает все категории почецму то! Вот код:

Скрытие категорий без товара
Чтобы скрыть категории, в которых нет товара в файле /components/com_virtuemart/sublayouts/categories.php после
defined('_JEXEC') or die('Restricted access');
вставьте
$categoryModel = VmModel::getModel('Category');
в этом же файле заключите весь код внутри цикла
foreach ( $categories as $category ) {
...
}
в дополнительное условие
foreach ( $categories as $category ) {
  if($categoryModel->countProducts($category->virtuemart_category_id)){
  ...
  }
}
И теперь скрылись ВСЕ категории!!!
Может что то не так?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8650 от Wedal
Михаил, вообще, да, всё правильно. Это не очень хороший подход, т.к. в цикле на каждую категорию приходится отдельный SQL-запрос для расчета количества. Если подкатегорий будет много, будет много и запросов.
Попробуйте, для начала, вместо if подставить просто:
echo $categoryModel->countProducts($category->virtuemart_category_id).'|';
Если выведет все нули, то смотрим, собственно, функцию, которая выполняется:
	public function countProducts($cat_id=0) {
 
		$db = JFactory::getDBO();
		$vendorId = 1;
		if ($cat_id > 0) {
			$q = 'SELECT count(`p`.virtuemart_product_id) AS total	
  FROM `#__virtuemart_product_categories` as `pc`
  LEFT JOIN `#__virtuemart_products` as `p` ON `pc`.virtuemart_product_id = `p`.virtuemart_product_id
  WHERE `pc`.`virtuemart_category_id` = "'.(int)$cat_id.'"
  AND `p`.`virtuemart_vendor_id` = "'.(int)$vendorId.'"
  AND `p`.`published` = "1" ';
			$db->setQuery($q);
			$count = $db->loadResult();
		} else $count=0 ;
 
		return $count;
	}
Остается только один вариант: у вас для товаров в базе данных проставлен вендор, с ID отличным от 1.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8651 от Михаил
Проверил в 2-х таблицах БД, xxxx_virtuemart_products и xxxx_virtuemart_vendors везде virtumart_vendor_id - 1

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8652 от Михаил
Вставил следующий код : echo $categoryModel->countProducts($category->virtuemart_category_id).'|';
выдал с верху 0|

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8653 от Wedal
Михаил, этот код должен быть внутри цикла foreach. Или у вас там только одна подкатегория?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8654 от Михаил
тогда вообще не чего не выводит и категории пропадают

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8655 от Wedal
Михаил, приведите итоговый код, который ничего не выводит.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8656 от Михаил
Сейчас сделали вот так, проверяет категории и под категории, почти все скрылись, но иногда все же пустые проскакивают!
Но уже на много лучше, меньше пустых стало!
Вложения:

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

5 года 8 мес. назад #8657 от Wedal
Михаил, переделал вам макет. Удалил всё лишнее для лучшего понимания. Если будет нужно, потом добавите.
Не проверял, но, теоретически, должно работать.
Вложения:

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.