По умолчанию в Virtuemart 1.1.x есть такая фишка — отображение количества товаров в категории. Все бы было ничего, если бы была штатная возможность отобразить количество всех товаров во всех подкатегориях. И такая возможность есть, правда придется немного подкрутить.
открываем файл administrator/components/com_virtuemart/classes/ps_product_category.php и в районе строки 1001 видим функцию products_in_category:
function products_in_category( $category_id ) { if( PSHOP_SHOW_PRODUCTS_IN_CATEGORY == '1' || vmIsAdminMode() ) { $num = ps_product_category::product_count($category_id); if( empty($num) && ps_product_category::has_childs( $category_id )) { $db = new ps_DB; $q = "SELECT category_child_id FROM #__{vm}_category_xref "; $q .= "WHERE category_parent_id='$category_id' "; $db->query($q); while( $db->next_record() ) { $num += ps_product_category::product_count($db->f("category_child_id")); } } return " ($num) "; } else return ( "" ); }
В комментарии над ней так и написано «Показывает количество товаров в категории $category_id» (на аглицких диалектах, конечно).
Чтобы наша задумка заработала, надо переписать эту функцию и добавить еще одну (для рекурсии):
function prod_in_cat_recursive( $category_id ) { $num=0; if (ps_product_category::has_childs( $category_id )) { $db = new ps_DB; $q = "SELECT category_child_id FROM #__{vm}_category_xref "; $q .= "WHERE category_parent_id='$category_id' "; $db->query($q); while( $db->next_record() ) { $num += ps_product_category::prod_in_cat_recursive($db->f("category_child_id")); } } $num += ps_product_category::product_count($category_id); return $num; } function products_in_category( $category_id ) { if( PSHOP_SHOW_PRODUCTS_IN_CATEGORY == '1' ) { $num = ps_product_category::prod_in_cat_recursive( $category_id ); return " ($num) "; } else return ""; }
На пальцах опишу, что это все значит. Была функция products_in_category, которая смотрела количество товаров в категории. Ну была вроде и была. Теперь мы ее переписали и добавили еще одну функцию (prod_in_cat_recursive), которая рекурсивно смотрит количество товаров в подкатегориях и складывает их.
Вот вроде бы и все…