0 Пользователей и 1 Гость просматривают эту тему.
  • 36 Ответов
  • 14726 Просмотров
*

jiva

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Здравствуйте. Подскажите как напротив названия категории выводить количество товаров в ней.
Например:
Nokia (9)
Samsung (32)
....
....
в админке Joomshoppinga вкладка "Категория" в столбце Товары выводится кол-во товаров, нашел код который выводит это в админке
<?php print intval($this->countproducts[$category->category_id]);?>

вставляю в шаблон вывода категорий возле категорий выводится "0", подскажите что делать куда копать ;) спасибо!
*

Anechka78

  • Захожу иногда
  • 76
  • 5 / 0
посмотрите здесь http://joomlaforum.ru/index.php/topic,207098.0.html. Здесь приведен модуль, в котором уже эта функция задана.
*

jiva

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
а для Joomla 1.5 решений не подскажите?
*

toliki

  • Осваиваюсь на форуме
  • 20
  • 11 / 0
Чтобы было как в админке необходимо:
1. в файл \modules\mod_jshopping_categories\helper.php
перенести функцию getAllCatCountProducts()
Код
    function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }
2. в файле \modules\mod_jshopping_categories\mod_jshopping_categories.php
добавить строку с вызовом упомянутой функции
Код
$countproducts = jShopCategoriesHelper::getAllCatCountProducts();
3. в файле \modules\mod_jshopping_categories\tmpl\default.php
в нужном месте вставить код вывода кол-ва товаров в категории
Код
(<?php print intval($countproducts[$curr->category_id]);?>)
P.S. Должен отметить что в админке в кол-во входят и те товары которые не опубликованы. Для фронта это не совсем правильно - надо править функцию getAllCatCountProducts()
*

jiva

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Чтобы было как в админке необходимо:
1. в файл \modules\mod_jshopping_categories\helper.php
перенести функцию getAllCatCountProducts()
Код
    function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }
2. в файле \modules\mod_jshopping_categories\mod_jshopping_categories.php
добавить строку с вызовом упомянутой функции
Код
$countproducts = jShopCategoriesHelper::getAllCatCountProducts();
3. в файле \modules\mod_jshopping_categories\tmpl\default.php
в нужном месте вставить код вывода кол-ва товаров в категории
Код
(<?php print intval($countproducts[$curr->category_id]);?>)
P.S. Должен отметить что в админке в кол-во входят и те товары которые не опубликованы. Для фронта это не совсем правильно - надо править функцию getAllCatCountProducts()


А если не для модуля, а самом компоненте, в какой файл добавлять функцию getAllCatCountProducts()
вот сам сайт на котором возникла проблема http://testsite.com.ua/fitochay.html

Подкатегории и кол-во товаров выводится "0"
Adipharm, Болгария 0
Артлайф, Россия 0
*

toliki

  • Осваиваюсь на форуме
  • 20
  • 11 / 0
Ну тогда так
1. в файл \components\com_jshopping\tables\category.php
добавить функцию getAllCatCountProducts()
2. в файл \components\com_jshopping\controllers\category.php
В конец функции view() добавить строки:
Код
	$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);
3. в файлы:
\components\com_jshopping\templates\default\category\category_default.php
\components\com_jshopping\templates\default\category\mainpage.php
вставить известную Вам строку
Код
(<?php print intval($this->countproducts[$category->category_id]);?>)
*

jiva

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Ну тогда так
1. в файл \components\com_jshopping\tables\category.php
добавить функцию getAllCatCountProducts()
2. в файл \components\com_jshopping\controllers\category.php
В конец функции view() добавить строки:
Код
	$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);
3. в файлы:
\components\com_jshopping\templates\default\category\category_default.php
\components\com_jshopping\templates\default\category\mainpage.php
вставить известную Вам строку
Код
(<?php print intval($this->countproducts[$category->category_id]);?>)
:( сделал все как написали , выдает ошибку
Fatal error: Call to undefined method jshopCategory::getAllCatCountProducts() in /home/blablabla/domains/testsite.com.ua/public_html/components/com_jshopping/controllers/category.php on line 199
*

toliki

  • Осваиваюсь на форуме
  • 20
  • 11 / 0
1. в файл \components\com_jshopping\tables\category.php
добавить функцию getAllCatCountProducts()
Код
    function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }

Либо не добавили, либо добавили но не туда, либо добавили неправильно!
P.S. Если так и не получится - все три файла - в студию.
*

jiva

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
1. в файл \components\com_jshopping\tables\category.php
добавить функцию getAllCatCountProducts()
Код
    function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }

Либо не добавили, либо добавили но не туда, либо добавили неправильно!
P.S. Если так и не получится - все три файла - в студию.

да действительно не в то место функцию вставил, сейчас поправил, ошибок нет, но кол-во товаров не считается :(
вот 3  файла http://testsite.com.ua/com_jshopping.zip
*

toliki

  • Осваиваюсь на форуме
  • 20
  • 11 / 0
Ошибка в файле \components\com_jshopping\controllers\category.php
Добавленные в конец функции view() строки поднять чуть-чуть повыше ^-^
так чтобы строка
Код
        $view->display();        
оставалась последней строкой функции.
Вот где-то так:
Код
    	$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);
        $view->display();       
Ну и строки там у Вас повторяются - избавьтесь от дублей.
А так все работает.
*

jiva

  • Осваиваюсь на форуме
  • 21
  • 0 / 0
Ошибка в файле \components\com_jshopping\controllers\category.php
Добавленные в конец функции view() строки поднять чуть-чуть повыше ^-^
так чтобы строка
Код
        $view->display();        
оставалась последней строкой функции.
Вот где-то так:
Код
    	$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);
        $view->display();       
Ну и строки там у Вас повторяются - избавьтесь от дублей.
А так все работает.


Спасибо огромное за помощь!! Все работает ;)

Cg
*

denxio

  • Захожу иногда
  • 170
  • 4 / 0
Это решение касается JoomShopping для Joomla 1.5.xx?
Попробовал на JoomShopping 3.5.1 -- не получилось :(
« Последнее редактирование: 30.05.2012, 15:17:31 от denxio »
*

Stealth83

  • Новичок
  • 8
  • 2 / 0
Супер! Спасибо. на шоппинге 3.10 все работает отлично....
*

Stealth83

  • Новичок
  • 8
  • 2 / 0
Да, еще нюанс этот запрос выводит количество всех товаров, даже если они не опубликованы, вот немного изменил

function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` AS prod LEFT JOIN `#__jshopping_products` AS pr_cat USING (product_id) where   product_publish=1 group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }

*

pvi1

  • Давно я тут
  • 566
  • 16 / 2
Ну тогда так
1. в файл \components\com_jshopping\tables\category.php
добавить функцию getAllCatCountProducts()
2. в файл \components\com_jshopping\controllers\category.php
В конец функции view() добавить строки:
Код
	$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);
3. в файлы:
\components\com_jshopping\templates\default\category\category_default.php
\components\com_jshopping\templates\default\category\mainpage.php
вставить известную Вам строку
Код
(<?php print intval($this->countproducts[$category->category_id]);?>)

Товары есть, но почему-то горят одни нули.
*

Stealth83

  • Новичок
  • 8
  • 2 / 0
1) Файл \components\com_jshopping\tables\category.php 
Код
<?php
/**
* @version      3.7.1 20.11.2011
* @author       MAXXmarketing GmbH
* @package      Jshopping
* @copyright    Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license      GNU/GPL
*/

defined('_JEXEC') or die('Restricted access');

class jshopCategory extends JTableAvto{
   
[color=red][b]function getAllCatCountProducts(){
        $db = JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories`
AS prod LEFT JOIN `#__jshopping_products` AS pr_cat USING (product_id) where product_publish=1
group by category_id";

        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }[/b][/color]

    function __construct( &$_db ){
        parent::__construct( '#__jshopping_categories', 'category_id', $_db );
    }
   
    function getSubCategories($parentId, $order = 'id', $ordering = 'asc', $publish = 0) {
        $lang = JSFactory::getLang();
        $user = JFactory::getUser();
        $add_where = ($publish)?(" AND category_publish = '1' "):("");
        $groups = implode(',', $user->getAuthorisedViewLevels());
        $add_where .=' AND access IN ('.$groups.')';
        if ($order=="id") $orderby = "category_id";
        if ($order=="name") $orderby = "`".$lang->get('name')."`";
        if ($order=="ordering") $orderby = "ordering";
        if (!$orderby) $orderby = "ordering";
       
        $query = "SELECT `".$lang->get('name')."` as name,`".$lang->get('description')."` as description,`".$lang->get('short_description')."` as short_description, category_id, category_publish, ordering, category_image FROM `#__jshopping_categories`
                   WHERE category_parent_id = '" . $this->_db->escape($parentId). "'" . $add_where . "
                   ORDER BY ".$orderby." ".$ordering;
        $this->_db->setQuery($query);
        $categories = $this->_db->loadObjectList();
               
        foreach($categories as $key=>$value){
            $categories[$key]->category_link = SEFLink('index.php?option=com_jshopping&controller=category&task=view&category_id='.$categories[$key]->category_id, 1);
        }
               
        return $categories;
    }

    function getName() {
        $lang = JSFactory::getLang();
        $name = $lang->get('name');
        return $this->$name;
    }
   
    function getDescription(){
       
        if (!$this->category_id){
            $this->getDescriptionMainPage();
            return 1;
        }
       
        $lang = JSFactory::getLang();
        $name = $lang->get('name');       
        $description = $lang->get('description');
        $short_description = $lang->get('short_description');
        $meta_title = $lang->get('meta_title');
        $meta_keyword = $lang->get('meta_keyword');
        $meta_description = $lang->get('meta_description');
       
        $this->name = $this->$name;
        $this->description = $this->$description;
        $this->short_description = $this->$short_description;
        $this->meta_title = $this->$meta_title;
        $this->meta_keyword = $this->$meta_keyword;
        $this->meta_description = $this->$meta_description;
    }   

    function getTreeChild() {
        $category_parent_id = $this->category_parent_id;
        $i = 0;
        $list_category = array();
        $list_category[$i]->category_id = $this->category_id;
        $list_category[$i]->name = $this->name;
        $i++;
        while($category_parent_id) {
            $category = JTable::getInstance('category', 'jshop');
            $category->load($category_parent_id);
            $list_category[$i]->category_id = $category->category_id;
            $list_category[$i]->name = $category->getName();
            $category_parent_id = $category->category_parent_id;
            $i++;
        }
        $list_category = array_reverse($list_category);
        return $list_category;
    }

    function getAllCategories($publish = 1, $access = 1) {
        $db = JFactory::getDBO();
        $user = JFactory::getUser();
        $where = array();
        if ($publish){
            $where[] = "category_publish = '1'";
        }
        if ($access){
            $groups = implode(',', $user->getAuthorisedViewLevels());
            $where[] =' access IN ('.$groups.')';
        }
        $add_where = "";
        if (count($where)){
            $add_where = " where ".implode(" and ", $where);
        }
        $query = "SELECT category_id, category_parent_id FROM `#__jshopping_categories` ".$add_where." ORDER BY ordering";
        $db->setQuery($query);
        return $db->loadObjectList();
    }

    function getChildCategories($order, $ordering = 'asc', $publish = 1) {
        $cats = $this->getSubCategories($this->category_id, $order, $ordering, $publish);
        return $cats;
    }

    function getSisterCategories($order, $ordering = 'asc', $publish = 1) {
        $cats = $this->getSubCategories($this->category_parent_id, $order, $ordering, $publish);
        return $cats;
    }

    function getTreeParentCategories($publish = 1, $access = 1){
        $user = JFactory::getUser();
        $cats_tree = array();
        $category_parent = $this->category_id;
        $where = array();
        if ($publish){
            $where[] = "category_publish = '1'";
        }
        if ($access){
            $groups = implode(',', $user->getAuthorisedViewLevels());
            $where[] =' access IN ('.$groups.')';
        }
        $add_where = "";
        if (count($where)){
            $add_where = "and ".implode(" and ", $where);
        }
        while($category_parent) {
            $cats_tree[] = $category_parent;
            $query = "SELECT category_parent_id FROM `#__jshopping_categories` WHERE category_id = '".$this->_db->escape($category_parent)."' ".$add_where;
            $this->_db->setQuery($query);
            $rows = $this->_db->loadObjectList();
            $category_parent = $rows[0]->category_parent_id;
        }
        return array_reverse($cats_tree);
    }

    function getProducts($filters, $order = null, $orderby = null, $limitstart = 0, $limit = 0) {
        $jshopConfig = JSFactory::getConfig();       
        $adv_query = ""; $adv_from = ""; $adv_result = $this->getBuildQueryListProductDefaultResult();
        $this->getBuildQueryListProduct("category", "list", $filters, $adv_query, $adv_from, $adv_result);
        $order_query = $this->getBuildQueryOrderListProduct($order, $orderby, $adv_from);

        JPluginHelper::importPlugin('jshoppingproducts');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeQueryGetProductList', array("category", &$adv_result, &$adv_from, &$adv_query, &$order_query, &$filters) );

        $query = "SELECT $adv_result FROM `#__jshopping_products` AS prod
                  LEFT JOIN `#__jshopping_products_to_categories` AS pr_cat USING (product_id)
                  $adv_from
                  WHERE pr_cat.category_id = '".$this->_db->escape($this->category_id)."' AND prod.product_publish = '1' ".$adv_query." ".$order_query;

        if ($limit){
            $this->_db->setQuery($query, $limitstart, $limit);
        }else{
            $this->_db->setQuery($query);
        }
        $products = $this->_db->loadObjectList();
        $products = listProductUpdateData($products);
        return $products;
    }

    function getCountProducts($filters){
        $jshopConfig = JSFactory::getConfig();
        $adv_query = ""; $adv_from = ""; $adv_result = "";
        $this->getBuildQueryListProduct("category", "count", $filters, $adv_query, $adv_from, $adv_result);
       
        JPluginHelper::importPlugin('jshoppingproducts');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger( 'onBeforeQueryCountProductList', array("category", &$adv_result, &$adv_from, &$adv_query, &$filters) );

        $query = "SELECT count(pr_cat.product_id) FROM `#__jshopping_products_to_categories` AS pr_cat
                  INNER JOIN `#__jshopping_products` AS prod ON pr_cat.product_id = prod.product_id
                  $adv_from
                  WHERE pr_cat.category_id = '".$this->_db->escape($this->category_id)."' AND prod.product_publish = '1' ".$adv_query;
        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }
   
    function getDescriptionMainPage(){
        $statictext = JTable::getInstance("statictext","jshop");
        $row = $statictext->loadData("home");
        $this->description = $row->text;
       
        $seo = JTable::getInstance("seo","jshop");
        $row = $seo->loadData("category");
        $this->meta_title = $row->title;
        $this->meta_keyword = $row->keyword;
        $this->meta_description = $row->description;
    }
   
    /**
    * get List Manufacturer for this category
    */
    function getManufacturers(){
        $jshopConfig = JSFactory::getConfig();
        $user = JFactory::getUser();
        $lang = JSFactory::getLang();
        $adv_query = "";
        $groups = implode(',', $user->getAuthorisedViewLevels());
        $adv_query .=' AND prod.access IN ('.$groups.')';
        if ($jshopConfig->hide_product_not_avaible_stock){
            $adv_query .= " AND prod.product_quantity > 0";
        }
        $query = "SELECT distinct man.manufacturer_id as id, man.`".$lang->get('name')."` as name FROM `#__jshopping_products` AS prod
                  LEFT JOIN `#__jshopping_products_to_categories` AS categ USING (product_id)
                  LEFT JOIN `#__jshopping_manufacturers` as man on prod.product_manufacturer_id=man.manufacturer_id
                  WHERE categ.category_id = '".$this->_db->escape($this->category_id)."' AND prod.product_publish = '1' AND prod.product_manufacturer_id!=0 ".$adv_query." order by name";
        $this->_db->setQuery($query);
        $list = $this->_db->loadObjectList();
        return $list;
           
    }   
}
?>

2) в файл \components\com_jshopping\controllers\category.php вы наверное добавили в фукцию вьюв , а надо в дисплей...
Код
<?php
/**
* @version      3.9.1 20.05.2012
* @author       MAXXmarketing GmbH
* @package      Jshopping
* @copyright    Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license      GNU/GPL
*/

defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');

class JshoppingControllerCategory extends JController{

    function display(){
        $mainframe = JFactory::getApplication();
        $db = JFactory::getDBO();
        $jshopConfig = JSFactory::getConfig();
        $params = $mainframe->getParams();
        $category_id = 0;       
       
        $ordering = $jshopConfig->category_sorting==1 ? "ordering" : "name";
        $category = JTable::getInstance('category', 'jshop');       
        $category->load($category_id);
        $categories = $category->getChildCategories($ordering, 'asc', 1);
        $category->getDescription();
       
        JPluginHelper::importPlugin('jshopping');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeDisplayMainCategory', array(&$category, &$categories));

        setMetaData($category->meta_title, $category->meta_keyword, $category->meta_description, $params);

        if ($jshopConfig->use_plugin_content){       
            changeDataUsePluginContent($category, "category");
        }

        $view_name = "category";
        $view_config = array("template_path"=>JPATH_COMPONENT."/templates/".$jshopConfig->template."/".$view_name);
        $view = $this->getView($view_name, getDocumentType(), '', $view_config);
        $view->setLayout("maincategory");
        $view->assign('category', $category);
        $view->assign('image_category_path', $jshopConfig->image_category_live_path);
        $view->assign('noimage', 'noimage.gif');
        $view->assign('categories', $categories);
        $view->assign('count_category_to_row', $jshopConfig->count_category_to_row);
        $view->assign('params', $params);
        $dispatcher->trigger('onBeforeDisplayCategoryView', array(&$view) );

[b][color=red]$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);[/color][/b]
        $view->display();
    }

    function view(){
        $mainframe = JFactory::getApplication();
        $db = JFactory::getDBO();
        $user = JFactory::getUser();
        $jshopConfig = JSFactory::getConfig();
        $session = JFactory::getSession();
        $session->set("jshop_end_page_buy_product", $_SERVER['REQUEST_URI']);
        $session->set("jshop_end_page_list_product", $_SERVER['REQUEST_URI']);
       
        JPluginHelper::importPlugin('jshoppingproducts');
        JPluginHelper::importPlugin('jshopping');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeLoadProductList', array());

        $category_id = JRequest::getInt('category_id');
        $category = JTable::getInstance('category', 'jshop');
        $category->load($category_id);
        $category->getDescription();
        $dispatcher->trigger('onAfterLoadCategory', array(&$category, &$user));

        if ($category->category_publish==0 || !in_array($category->access, $user->getAuthorisedViewLevels())){
            JError::raiseError( 404, _JSHOP_PAGE_NOT_FOUND);
            return;
        }
       
        $manufacturer_id = JRequest::getInt('manufacturer_id');
        $label_id = JRequest::getInt('label_id');
        $vendor_id = JRequest::getInt('vendor_id');
       
        $view_name = "category";
        $view_config = array("template_path"=>JPATH_COMPONENT."/templates/".$jshopConfig->template."/".$view_name);
        $view = $this->getView($view_name, getDocumentType(), '', $view_config);
if ($category->category_template=="") $category->category_template="default";
        $view->setLayout("category_".$category->category_template);

        $jshopConfig->count_products_to_page = $category->products_page;

        $context = "jshoping.list.front.product";
        $contextfilter = "jshoping.list.front.product.cat.".$category_id;
        $orderby = $mainframe->getUserStateFromRequest( $context.'orderby', 'orderby', $jshopConfig->product_sorting_direction, 'int');
        $order = $mainframe->getUserStateFromRequest( $context.'order', 'order', $jshopConfig->product_sorting, 'int');
        $limit = $mainframe->getUserStateFromRequest( $context.'limit', 'limit', $category->products_page, 'int');
        if (!$limit) $limit = $category->products_page;
        $limitstart = JRequest::getInt('limitstart');

        $orderbyq = getQuerySortDirection($order, $orderby);
        $image_sort_dir = getImgSortDirection($order, $orderby);
        $field_order = $jshopConfig->sorting_products_field_select[$order];
        $filters = getBuildFilterListProduct($contextfilter, array("categorys"));
       
        if (getShopMainPageItemid()==JRequest::getInt('Itemid')){
            appendExtendPathWay($category->getTreeChild(), 'category');
        }
       
        $orderfield = $jshopConfig->category_sorting==1 ? "ordering" : "name";
        $sub_categories = $category->getChildCategories($orderfield, 'asc', $publish = 1);
        $dispatcher->trigger( 'onBeforeDisplayCategory', array(&$category, &$sub_categories) );

        if ($category->meta_title=="") $category->meta_title = $category->name;
        setMetaData($category->meta_title, $category->meta_keyword, $category->meta_description);
       
        $total = $category->getCountProducts($filters);
        $action = xhtmlUrl($_SERVER['REQUEST_URI']);
               
        if ($limitstart>=$total) $limitstart = 0;

        $products = $category->getProducts($filters, $field_order, $orderbyq, $limitstart, $limit);
addLinkToProducts($products, $category_id);

        jimport('joomla.html.pagination');
        $pagination = new JPagination($total, $limitstart, $limit);
        $pagenav = $pagination->getPagesLinks();
       
        foreach($jshopConfig->sorting_products_name_select as $key=>$value){
            $sorts[] = JHTML::_('select.option', $key, $value, 'sort_id', 'sort_value' );
        }

        insertValueInArray($category->products_page, $jshopConfig->count_product_select); //insert category count
        foreach ($jshopConfig->count_product_select as $key => $value) {
            $product_count[] = JHTML::_('select.option',$key, $value, 'count_id', 'count_value' );
        }
        $sorting_sel = JHTML::_('select.genericlist', $sorts, 'order', 'class = "inputbox" size = "1" onchange = "submitListProductFilters()"','sort_id', 'sort_value', $order );
        $product_count_sel = JHTML::_('select.genericlist', $product_count, 'limit', 'class = "inputbox" size = "1" onchange = "submitListProductFilters()"','count_id', 'count_value', $limit );
       
        $_review = JTable::getInstance('review', 'jshop');
        $allow_review = $_review->getAllowReview();
       
        if (!$category->category_ordertype) $category->category_ordertype = 1;
       
        if ($jshopConfig->show_product_list_filters){
            $filter_manufactures = $category->getManufacturers();
            $first_manufacturer = array();
            $first_manufacturer[] = JHTML::_('select.option', 0, _JSHOP_ALL, 'id', 'name' );
            $manufacuturers_sel = JHTML::_('select.genericlist', array_merge($first_manufacturer, $filter_manufactures), 'manufacturers[]', 'class = "inputbox" onchange = "submitListProductFilters()"','id', 'name', $filters['manufacturers'][0]);
        }
       
        if ($jshopConfig->use_plugin_content){
            changeDataUsePluginContent($category, "category");
        }

        $display_list_products = (count($products)>0 || willBeUseFilter($filters));

        $dispatcher->trigger('onBeforeDisplayProductList', array(&$products) );

        $view->assign('config', $jshopConfig);
        $view->assign('template_block_list_product', "list_products/list_products.php");
        $view->assign('template_block_form_filter', "list_products/form_filters.php");
        $view->assign('template_block_pagination', "list_products/block_pagination.php");
        $view->assign('path_image_sorting_dir', $jshopConfig->live_path.'images/'.$image_sort_dir);
        $view->assign('filter_show', 1);
        $view->assign('filter_show_category', 0);
        $view->assign('filter_show_manufacturer', 1);
        $view->assign('pagination', $pagenav);
$view->assign('pagination_obj', $pagination);
        $view->assign('display_pagination', $pagenav!="");
        $view->assign('rows', $products);
        $view->assign('count_product_to_row', $category->products_row);
        $view->assign('image_category_path', $jshopConfig->image_category_live_path);
        $view->assign('noimage', 'noimage.gif');
        $view->assign('category', $category);
        $view->assign('categories', $sub_categories);
        $view->assign('count_category_to_row', $jshopConfig->count_category_to_row);
        $view->assign('allow_review', $allow_review);
        $view->assign('product_count', $product_count_sel);
        $view->assign('sorting', $sorting_sel);
        $view->assign('action', $action);
        $view->assign('orderby', $orderby);
        $view->assign('manufacuturers_sel', $manufacuturers_sel);
        $view->assign('filters', $filters);
        $view->assign('display_list_products', $display_list_products);
        $view->assign('shippinginfo', SEFLink('index.php?option=com_jshopping&controller=content&task=view&page=shipping',1));
        $dispatcher->trigger('onBeforeDisplayProductListView', array(&$view) );
        $view->display();
    }
}
?>
*

Stealth83

  • Новичок
  • 8
  • 2 / 0
1) Файл \components\com_jshopping\tables\category.php 
Код
<?php
/**
* @version      3.7.1 20.11.2011
* @author       MAXXmarketing GmbH
* @package      Jshopping
* @copyright    Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license      GNU/GPL
*/

defined('_JEXEC') or die('Restricted access');

class jshopCategory extends JTableAvto{
   
function getAllCatCountProducts(){
        $db = JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories`
AS prod LEFT JOIN `#__jshopping_products` AS pr_cat USING (product_id) where product_publish=1
group by category_id";

        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }       
        return $rows;
    }

    function __construct( &$_db ){
        parent::__construct( '#__jshopping_categories', 'category_id', $_db );
    }
   
    function getSubCategories($parentId, $order = 'id', $ordering = 'asc', $publish = 0) {
        $lang = JSFactory::getLang();
        $user = JFactory::getUser();
        $add_where = ($publish)?(" AND category_publish = '1' "):("");
        $groups = implode(',', $user->getAuthorisedViewLevels());
        $add_where .=' AND access IN ('.$groups.')';
        if ($order=="id") $orderby = "category_id";
        if ($order=="name") $orderby = "`".$lang->get('name')."`";
        if ($order=="ordering") $orderby = "ordering";
        if (!$orderby) $orderby = "ordering";
       
        $query = "SELECT `".$lang->get('name')."` as name,`".$lang->get('description')."` as description,`".$lang->get('short_description')."` as short_description, category_id, category_publish, ordering, category_image FROM `#__jshopping_categories`
                   WHERE category_parent_id = '" . $this->_db->escape($parentId). "'" . $add_where . "
                   ORDER BY ".$orderby." ".$ordering;
        $this->_db->setQuery($query);
        $categories = $this->_db->loadObjectList();
               
        foreach($categories as $key=>$value){
            $categories[$key]->category_link = SEFLink('index.php?option=com_jshopping&controller=category&task=view&category_id='.$categories[$key]->category_id, 1);
        }
               
        return $categories;
    }

    function getName() {
        $lang = JSFactory::getLang();
        $name = $lang->get('name');
        return $this->$name;
    }
   
    function getDescription(){
       
        if (!$this->category_id){
            $this->getDescriptionMainPage();
            return 1;
        }
       
        $lang = JSFactory::getLang();
        $name = $lang->get('name');       
        $description = $lang->get('description');
        $short_description = $lang->get('short_description');
        $meta_title = $lang->get('meta_title');
        $meta_keyword = $lang->get('meta_keyword');
        $meta_description = $lang->get('meta_description');
       
        $this->name = $this->$name;
        $this->description = $this->$description;
        $this->short_description = $this->$short_description;
        $this->meta_title = $this->$meta_title;
        $this->meta_keyword = $this->$meta_keyword;
        $this->meta_description = $this->$meta_description;
    }   

    function getTreeChild() {
        $category_parent_id = $this->category_parent_id;
        $i = 0;
        $list_category = array();
        $list_category[$i]->category_id = $this->category_id;
        $list_category[$i]->name = $this->name;
        $i++;
        while($category_parent_id) {
            $category = JTable::getInstance('category', 'jshop');
            $category->load($category_parent_id);
            $list_category[$i]->category_id = $category->category_id;
            $list_category[$i]->name = $category->getName();
            $category_parent_id = $category->category_parent_id;
            $i++;
        }
        $list_category = array_reverse($list_category);
        return $list_category;
    }

    function getAllCategories($publish = 1, $access = 1) {
        $db = JFactory::getDBO();
        $user = JFactory::getUser();
        $where = array();
        if ($publish){
            $where[] = "category_publish = '1'";
        }
        if ($access){
            $groups = implode(',', $user->getAuthorisedViewLevels());
            $where[] =' access IN ('.$groups.')';
        }
        $add_where = "";
        if (count($where)){
            $add_where = " where ".implode(" and ", $where);
        }
        $query = "SELECT category_id, category_parent_id FROM `#__jshopping_categories` ".$add_where." ORDER BY ordering";
        $db->setQuery($query);
        return $db->loadObjectList();
    }

    function getChildCategories($order, $ordering = 'asc', $publish = 1) {
        $cats = $this->getSubCategories($this->category_id, $order, $ordering, $publish);
        return $cats;
    }

    function getSisterCategories($order, $ordering = 'asc', $publish = 1) {
        $cats = $this->getSubCategories($this->category_parent_id, $order, $ordering, $publish);
        return $cats;
    }

    function getTreeParentCategories($publish = 1, $access = 1){
        $user = JFactory::getUser();
        $cats_tree = array();
        $category_parent = $this->category_id;
        $where = array();
        if ($publish){
            $where[] = "category_publish = '1'";
        }
        if ($access){
            $groups = implode(',', $user->getAuthorisedViewLevels());
            $where[] =' access IN ('.$groups.')';
        }
        $add_where = "";
        if (count($where)){
            $add_where = "and ".implode(" and ", $where);
        }
        while($category_parent) {
            $cats_tree[] = $category_parent;
            $query = "SELECT category_parent_id FROM `#__jshopping_categories` WHERE category_id = '".$this->_db->escape($category_parent)."' ".$add_where;
            $this->_db->setQuery($query);
            $rows = $this->_db->loadObjectList();
            $category_parent = $rows[0]->category_parent_id;
        }
        return array_reverse($cats_tree);
    }

    function getProducts($filters, $order = null, $orderby = null, $limitstart = 0, $limit = 0) {
        $jshopConfig = JSFactory::getConfig();       
        $adv_query = ""; $adv_from = ""; $adv_result = $this->getBuildQueryListProductDefaultResult();
        $this->getBuildQueryListProduct("category", "list", $filters, $adv_query, $adv_from, $adv_result);
        $order_query = $this->getBuildQueryOrderListProduct($order, $orderby, $adv_from);

        JPluginHelper::importPlugin('jshoppingproducts');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeQueryGetProductList', array("category", &$adv_result, &$adv_from, &$adv_query, &$order_query, &$filters) );

        $query = "SELECT $adv_result FROM `#__jshopping_products` AS prod
                  LEFT JOIN `#__jshopping_products_to_categories` AS pr_cat USING (product_id)
                  $adv_from
                  WHERE pr_cat.category_id = '".$this->_db->escape($this->category_id)."' AND prod.product_publish = '1' ".$adv_query." ".$order_query;

        if ($limit){
            $this->_db->setQuery($query, $limitstart, $limit);
        }else{
            $this->_db->setQuery($query);
        }
        $products = $this->_db->loadObjectList();
        $products = listProductUpdateData($products);
        return $products;
    }

    function getCountProducts($filters){
        $jshopConfig = JSFactory::getConfig();
        $adv_query = ""; $adv_from = ""; $adv_result = "";
        $this->getBuildQueryListProduct("category", "count", $filters, $adv_query, $adv_from, $adv_result);
       
        JPluginHelper::importPlugin('jshoppingproducts');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger( 'onBeforeQueryCountProductList', array("category", &$adv_result, &$adv_from, &$adv_query, &$filters) );

        $query = "SELECT count(pr_cat.product_id) FROM `#__jshopping_products_to_categories` AS pr_cat
                  INNER JOIN `#__jshopping_products` AS prod ON pr_cat.product_id = prod.product_id
                  $adv_from
                  WHERE pr_cat.category_id = '".$this->_db->escape($this->category_id)."' AND prod.product_publish = '1' ".$adv_query;
        $this->_db->setQuery($query);
        return $this->_db->loadResult();
    }
   
    function getDescriptionMainPage(){
        $statictext = JTable::getInstance("statictext","jshop");
        $row = $statictext->loadData("home");
        $this->description = $row->text;
       
        $seo = JTable::getInstance("seo","jshop");
        $row = $seo->loadData("category");
        $this->meta_title = $row->title;
        $this->meta_keyword = $row->keyword;
        $this->meta_description = $row->description;
    }
   
    /**
    * get List Manufacturer for this category
    */
    function getManufacturers(){
        $jshopConfig = JSFactory::getConfig();
        $user = JFactory::getUser();
        $lang = JSFactory::getLang();
        $adv_query = "";
        $groups = implode(',', $user->getAuthorisedViewLevels());
        $adv_query .=' AND prod.access IN ('.$groups.')';
        if ($jshopConfig->hide_product_not_avaible_stock){
            $adv_query .= " AND prod.product_quantity > 0";
        }
        $query = "SELECT distinct man.manufacturer_id as id, man.`".$lang->get('name')."` as name FROM `#__jshopping_products` AS prod
                  LEFT JOIN `#__jshopping_products_to_categories` AS categ USING (product_id)
                  LEFT JOIN `#__jshopping_manufacturers` as man on prod.product_manufacturer_id=man.manufacturer_id
                  WHERE categ.category_id = '".$this->_db->escape($this->category_id)."' AND prod.product_publish = '1' AND prod.product_manufacturer_id!=0 ".$adv_query." order by name";
        $this->_db->setQuery($query);
        $list = $this->_db->loadObjectList();
        return $list;
           
    }   
}
?>

2) в файл \components\com_jshopping\controllers\category.php вы наверное добавили в фукцию вьюв , а надо в дисплей...
Код
<?php
/**
* @version      3.9.1 20.05.2012
* @author       MAXXmarketing GmbH
* @package      Jshopping
* @copyright    Copyright (C) 2010 webdesigner-profi.de. All rights reserved.
* @license      GNU/GPL
*/

defined( '_JEXEC' ) or die( 'Restricted access' );
jimport('joomla.application.component.controller');

class JshoppingControllerCategory extends JController{

    function display(){
        $mainframe = JFactory::getApplication();
        $db = JFactory::getDBO();
        $jshopConfig = JSFactory::getConfig();
        $params = $mainframe->getParams();
        $category_id = 0;       
       
        $ordering = $jshopConfig->category_sorting==1 ? "ordering" : "name";
        $category = JTable::getInstance('category', 'jshop');       
        $category->load($category_id);
        $categories = $category->getChildCategories($ordering, 'asc', 1);
        $category->getDescription();
       
        JPluginHelper::importPlugin('jshopping');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeDisplayMainCategory', array(&$category, &$categories));

        setMetaData($category->meta_title, $category->meta_keyword, $category->meta_description, $params);

        if ($jshopConfig->use_plugin_content){       
            changeDataUsePluginContent($category, "category");
        }

        $view_name = "category";
        $view_config = array("template_path"=>JPATH_COMPONENT."/templates/".$jshopConfig->template."/".$view_name);
        $view = $this->getView($view_name, getDocumentType(), '', $view_config);
        $view->setLayout("maincategory");
        $view->assign('category', $category);
        $view->assign('image_category_path', $jshopConfig->image_category_live_path);
        $view->assign('noimage', 'noimage.gif');
        $view->assign('categories', $categories);
        $view->assign('count_category_to_row', $jshopConfig->count_category_to_row);
        $view->assign('params', $params);
        $dispatcher->trigger('onBeforeDisplayCategoryView', array(&$view) );

$countproducts = $category->getAllCatCountProducts();
        $view->assign('countproducts', $countproducts);
        $view->display();
    }

    function view(){
        $mainframe = JFactory::getApplication();
        $db = JFactory::getDBO();
        $user = JFactory::getUser();
        $jshopConfig = JSFactory::getConfig();
        $session = JFactory::getSession();
        $session->set("jshop_end_page_buy_product", $_SERVER['REQUEST_URI']);
        $session->set("jshop_end_page_list_product", $_SERVER['REQUEST_URI']);
       
        JPluginHelper::importPlugin('jshoppingproducts');
        JPluginHelper::importPlugin('jshopping');
        $dispatcher = JDispatcher::getInstance();
        $dispatcher->trigger('onBeforeLoadProductList', array());

        $category_id = JRequest::getInt('category_id');
        $category = JTable::getInstance('category', 'jshop');
        $category->load($category_id);
        $category->getDescription();
        $dispatcher->trigger('onAfterLoadCategory', array(&$category, &$user));

        if ($category->category_publish==0 || !in_array($category->access, $user->getAuthorisedViewLevels())){
            JError::raiseError( 404, _JSHOP_PAGE_NOT_FOUND);
            return;
        }
       
        $manufacturer_id = JRequest::getInt('manufacturer_id');
        $label_id = JRequest::getInt('label_id');
        $vendor_id = JRequest::getInt('vendor_id');
       
        $view_name = "category";
        $view_config = array("template_path"=>JPATH_COMPONENT."/templates/".$jshopConfig->template."/".$view_name);
        $view = $this->getView($view_name, getDocumentType(), '', $view_config);
if ($category->category_template=="") $category->category_template="default";
        $view->setLayout("category_".$category->category_template);

        $jshopConfig->count_products_to_page = $category->products_page;

        $context = "jshoping.list.front.product";
        $contextfilter = "jshoping.list.front.product.cat.".$category_id;
        $orderby = $mainframe->getUserStateFromRequest( $context.'orderby', 'orderby', $jshopConfig->product_sorting_direction, 'int');
        $order = $mainframe->getUserStateFromRequest( $context.'order', 'order', $jshopConfig->product_sorting, 'int');
        $limit = $mainframe->getUserStateFromRequest( $context.'limit', 'limit', $category->products_page, 'int');
        if (!$limit) $limit = $category->products_page;
        $limitstart = JRequest::getInt('limitstart');

        $orderbyq = getQuerySortDirection($order, $orderby);
        $image_sort_dir = getImgSortDirection($order, $orderby);
        $field_order = $jshopConfig->sorting_products_field_select[$order];
        $filters = getBuildFilterListProduct($contextfilter, array("categorys"));
       
        if (getShopMainPageItemid()==JRequest::getInt('Itemid')){
            appendExtendPathWay($category->getTreeChild(), 'category');
        }
       
        $orderfield = $jshopConfig->category_sorting==1 ? "ordering" : "name";
        $sub_categories = $category->getChildCategories($orderfield, 'asc', $publish = 1);
        $dispatcher->trigger( 'onBeforeDisplayCategory', array(&$category, &$sub_categories) );

        if ($category->meta_title=="") $category->meta_title = $category->name;
        setMetaData($category->meta_title, $category->meta_keyword, $category->meta_description);
       
        $total = $category->getCountProducts($filters);
        $action = xhtmlUrl($_SERVER['REQUEST_URI']);
               
        if ($limitstart>=$total) $limitstart = 0;

        $products = $category->getProducts($filters, $field_order, $orderbyq, $limitstart, $limit);
addLinkToProducts($products, $category_id);

        jimport('joomla.html.pagination');
        $pagination = new JPagination($total, $limitstart, $limit);
        $pagenav = $pagination->getPagesLinks();
       
        foreach($jshopConfig->sorting_products_name_select as $key=>$value){
            $sorts[] = JHTML::_('select.option', $key, $value, 'sort_id', 'sort_value' );
        }

        insertValueInArray($category->products_page, $jshopConfig->count_product_select); //insert category count
        foreach ($jshopConfig->count_product_select as $key => $value) {
            $product_count[] = JHTML::_('select.option',$key, $value, 'count_id', 'count_value' );
        }
        $sorting_sel = JHTML::_('select.genericlist', $sorts, 'order', 'class = "inputbox" size = "1" onchange = "submitListProductFilters()"','sort_id', 'sort_value', $order );
        $product_count_sel = JHTML::_('select.genericlist', $product_count, 'limit', 'class = "inputbox" size = "1" onchange = "submitListProductFilters()"','count_id', 'count_value', $limit );
       
        $_review = JTable::getInstance('review', 'jshop');
        $allow_review = $_review->getAllowReview();
       
        if (!$category->category_ordertype) $category->category_ordertype = 1;
       
        if ($jshopConfig->show_product_list_filters){
            $filter_manufactures = $category->getManufacturers();
            $first_manufacturer = array();
            $first_manufacturer[] = JHTML::_('select.option', 0, _JSHOP_ALL, 'id', 'name' );
            $manufacuturers_sel = JHTML::_('select.genericlist', array_merge($first_manufacturer, $filter_manufactures), 'manufacturers[]', 'class = "inputbox" onchange = "submitListProductFilters()"','id', 'name', $filters['manufacturers'][0]);
        }
       
        if ($jshopConfig->use_plugin_content){
            changeDataUsePluginContent($category, "category");
        }

        $display_list_products = (count($products)>0 || willBeUseFilter($filters));

        $dispatcher->trigger('onBeforeDisplayProductList', array(&$products) );

        $view->assign('config', $jshopConfig);
        $view->assign('template_block_list_product', "list_products/list_products.php");
        $view->assign('template_block_form_filter', "list_products/form_filters.php");
        $view->assign('template_block_pagination', "list_products/block_pagination.php");
        $view->assign('path_image_sorting_dir', $jshopConfig->live_path.'images/'.$image_sort_dir);
        $view->assign('filter_show', 1);
        $view->assign('filter_show_category', 0);
        $view->assign('filter_show_manufacturer', 1);
        $view->assign('pagination', $pagenav);
$view->assign('pagination_obj', $pagination);
        $view->assign('display_pagination', $pagenav!="");
        $view->assign('rows', $products);
        $view->assign('count_product_to_row', $category->products_row);
        $view->assign('image_category_path', $jshopConfig->image_category_live_path);
        $view->assign('noimage', 'noimage.gif');
        $view->assign('category', $category);
        $view->assign('categories', $sub_categories);
        $view->assign('count_category_to_row', $jshopConfig->count_category_to_row);
        $view->assign('allow_review', $allow_review);
        $view->assign('product_count', $product_count_sel);
        $view->assign('sorting', $sorting_sel);
        $view->assign('action', $action);
        $view->assign('orderby', $orderby);
        $view->assign('manufacuturers_sel', $manufacuturers_sel);
        $view->assign('filters', $filters);
        $view->assign('display_list_products', $display_list_products);
        $view->assign('shippinginfo', SEFLink('index.php?option=com_jshopping&controller=content&task=view&page=shipping',1));
        $dispatcher->trigger('onBeforeDisplayProductListView', array(&$view) );
        $view->display();
    }
}
?>
*

pvi1

  • Давно я тут
  • 566
  • 16 / 2
Переставил в функцию Display - результат тот же.  Единственно - у меня вместо mainpage имеется maincategory - ну это, мне кажется, роли не играетю
*

Galiakberow

  • Захожу иногда
  • 130
  • 2 / 0
Здравствуйте.
Пытаюсь вывести количество товаров возле категорий на Joomshopping 3.12 - в контент все выводится (Спасибо ! - за подробные инструкции), но в меню категорий не смог изменить... Так как в папке \components\com_jshopping\templates\default\category\, как я понял, есть только php отвечающая за вывод каталога в контент - category_default.php, а mainpage.php - отсутствует (вместо нее maincategory.php).

Нашел в \modules\mod_jshopping_categories\tmpl\default.php отвечающая за разметку меню категории товаров, но вставка строки -
"<?php print intval($this->countproducts[$category->category_id]);?>" приводит к ошибке:
Fatal error: Using $this when not in object context in Z:\home\magazin.loc\www\modules\mod_jshopping_categories\tmpl\default.php on line 11.

При вводе "<?php print intval($countproducts[$curr->category_id]);?>" возле категорий появляются одни "0".
Есть ли решение данной проблемы?
*

Galiakberow

  • Захожу иногда
  • 130
  • 2 / 0
Ответ частично нашел в теме - Количество товара в Module Category 3.0.2 (http://joomlaforum.ru/index.php/topic,247435.0.html). Только при вложенных категориях в родительской категории показывает "0":

Цитата: Linfuby от 27.01.2013, 14:37:43
Всё просто. есть такая функция как getCountProducts()
Надо всего лишь вызвать её для каждой категории.
В шаблоне модуля после
Код:

foreach($categories_arr as $curr){

Нужно добавить:
Код:

    $category = JTable::getInstance('category', 'jshop');       
    $category->load($curr->category_id);
    $count = $category->getCountProducts(array());

Ну а $count выводить где хочется. Например:
Код:

<?php print $curr->name." (".$count.")"?>

Как сделать так что бы рядом с родительской категорией выводилась сумма товаров в под категориях?
*

Vliv

  • Новичок
  • 5
  • 0 / 0
Присоединяюсь к вопросу. Сделал все как описано выше - в родительских и подкатегориях выводятся нули. Joomla 2.5.9, JS 3.14.0. Есть-ли решение?
*

cancerogen

  • Новичок
  • 6
  • 3 / 0
Короче сильно не пинать. Я сделал черновой вариант, который показывает количество товаров в категориях, если в них только один уровень подкатегорий. Т.е. те категории, которые мы видим в списке плюс их подкатегории. Дальше пока не лезет. Сказывается мой уровень знаний. Конкретно слабо знаю рекурсию, поэтому пока без неё. Суть такая. Делаем всё как описано выше, но в файл \components\com_jshopping\tables\category.php вместо одной функции getAllCatCountProducts(), добавляем три вот в таком виде:
Код
function getSubCategoriesId($parentId) {
        $orderby = "category_id";

        $query = "SELECT category_id FROM `#__jshopping_categories`
                   WHERE category_parent_id = '".$this->_db->escape($parentId)."' ".$add_where."
                   ORDER BY ".$orderby." ".'asc';
        $this->_db->setQuery($query);
        $categories = $this->_db->loadObjectList();
        return $categories;
    }

function getAllSubCat($subCatId,$masCat){
$mass = array();
$mass = $this->getSubCategoriesId($subCatId) ;
if (empty($mass)) {
return $masCat;}
foreach ($mass as $key => $value) {
array_push($masCat, $value->category_id);
}

return $masCat;
}


function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
$subCat = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }     
         
$subCat = $this->getSubCategoriesId($this->category_id) ;

foreach ($subCat as  $key => $value) {
$masCat = array();// массив всех подкатегорий в очередной категории

$masCat = $this->getAllSubCat($value->category_id,$masCat);
foreach ($masCat as $key2 => $value2) {
$rows[$value->category_id] = $rows[$value->category_id] + $rows[$value2];
}
        }
        return $rows;
    }
У меня на сайте работает. Кто может предлагайте, как доделать.
*

Dmitryy

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
усложняем, давайте добавим слово "товаров", окончание которого будет меняться в зависимости от количества.
*

lamerumixa

  • Новичок
  • 4
  • 1 / 0
резюмировал все выше сказаное

для вывода только числа товаров даной категории и числа товаров в блоке подкаптегорий


1. в файл \components\com_jshopping\tables\category.php
добавить функцию getAllCatCountProdu (внутрь класса между уже имеющими функциями)
Спойлер
[свернуть]

2. в файл \components\com_jshopping\controllers\category.php
В конец функции view() добавить строки (до строки $view->display(); )
Спойлер
[свернуть]

3. в файлы:
\components\com_jshopping\templates\default\category\category_default.php
\components\com_jshopping\templates\default\category\mainpage.php

в вывод категории вставить(окого названия категории и ее описания)
(<?php print intval($this->countproducts[$this->category->category_id]);?>)

в вывод подкатегорий вставить(ето в сам foreach где выводятся сами подкатегории)
(<?php print intval($this->countproducts[$category->category_id]);?>)

но етот метод выводит только число товаров с самих категории

Другой способ
позаимствован из mod_e_jshopping_categories

1. в файл \components\com_jshopping\tables\category.php
добавить функцию getTotalItem и getAllSubcates(ети функции взяты из mod_e_jshopping_categories)(внутрь класса между уже имеющими функциями)
Спойлер
[свернуть]

2. в файл \components\com_jshopping\controllers\category.php
В конец функции view() добавить строки (до строки $view->display(); )
Спойлер
[свернуть]

3. в файлы:
\components\com_jshopping\templates\default\category\category_default.php
\components\com_jshopping\templates\default\category\mainpage.php

в вывод категории вставить(окого названия категории и ее описания)
(<?php print intval($this->countproducts);?>)

в вывод подкатегорий вставить(ето в сам foreach где выводятся сами подкатегории)
(<?php print intval(jshopCategory::getTotalItem($category->category_id));?>)

В подкатегориях не нашел другого способа кроме как на пряму запустить функцию


« Последнее редактирование: 30.04.2013, 15:08:31 от lamerumixa »
*

cancerogen

  • Новичок
  • 6
  • 3 / 0
А что мой метод проигнорировал? Я же писал, что работает, но только на глубину одной подкатегории.
*

cancerogen

  • Новичок
  • 6
  • 3 / 0
Почему никто не помогает? Неужели никому не интересно? Ладно опишу логику моего метода, может кто что подскажет. В функции getAllCatCountProducts() процедура
Код
        $db = & JFactory::getDBO();    
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();
        $subCat = array();
        foreach($list as $row){
            $rows[$row->category_id] = $row->k;
        }     
выдаёт массив $rows, в котором есть все категории и подкатегории, в которых есть товары и каждому Id категории соответствует количество товара в этой категории.
Затем я нахожу категории, которые я вижу в списке:
Код
$subCat = $this->getSubCategoriesId($this->category_id) ;
Затем в цикле foreach ($subCat as  $key => $value) я хотел для каждой категории найти список всех подкатегорий, которые входят в данную категорию. Ну а дальше всё просто. Имея список подкатегорий надо просто сложить количество товаров в этих подкатегориях. Что я и реализовал. Проблема в том, что неизвестно сколько уровней этих самых подкатегорий у нас есть. Их приходится вычислять каждый раз заново. Поэтому простая рекурсия никак не получается. В этом вся загвоздка. Получается надо хранить все массивы подкатегорий, которые мы обходим в циклах, или я ошибаюсь?
*

cancerogen

  • Новичок
  • 6
  • 3 / 0
Надоело ждать. Даю вариант, практически окончательный. Я решил не использовать рекурсию и просто написал несколько вложенных процедур. В коде много комментариев, надеюсь всё понятно. Итак, что я сделал, всё по порядку.
1. В файл \components\com_jshopping\controllers\category.php
в конец функции view() добавил 2 строки, получилось так:
Код
$countproducts = $category->getAllCatCountProducts();
$view->assign('countproducts', $countproducts);
$view->display();
2. В файл \components\com_jshopping\templates\default\category\category_default.php
в месте, где нужно указать количество товаров, вставил известную вам строку (<?php print intval($this->countproducts[$category->category_id]);?>). Моя строка:
Код
<a class = "product_link" href = "<?php print $category->category_link?>"><?php print $category->name?>(<?php print intval($this->countproducts[$category->category_id]);?>)</a>
3. В конец файла \components\com_jshopping\tables\category.php
добавил три функции getSubCategoriesId($parentId), getAllSubCat($catId) и getAllCatCountProducts(). Вот эти функции:
Код
// функция выдаёт по $parentId категории массив её подкатегорий
function getSubCategoriesId($parentId) {
        $query = "SELECT category_id FROM `#__jshopping_categories`
                        WHERE category_parent_id = '".$this->_db->escape($parentId)."' ORDER BY category_id asc";
        $this->_db->setQuery($query);
        $categories = $this->_db->loadObjectList();
        return $categories;
    }


function getAllSubCat($catId){
        $mass1 = array(); //массив всех подкатегорий 1 уровня
        $mass2 = array();// массив всех подкатегорий 2 уровня
        $mass3 = array();// массив всех подкатегорий 3 уровня
        $masCatedory = array();// выходной массив всех подкатегорий до 3 уровня
        $mass1 = $this->getSubCategoriesId($catId) ;// находим массив подкатегорий текущей категории
        if (!empty($mass1)) { // если массив не пустой
            foreach ($mass1 as $key => $cat1) { // для каждой подкатегории cat1 из массива mass1
                array_push($masCatedory, $cat1->category_id); // добавляем Id из массива mass1 в выходной массив
                }
            foreach ($mass1 as $key => $cat1) { // для каждой подкатегории cat1 из массива mass1
                $mass2 = $this->getSubCategoriesId($cat1->category_id);// запускаем ту же процедуру для вложенной подкатегории
                if (!empty($mass2)) { // если массив не пустой
                    foreach ($mass2 as $key => $cat2) { // для каждой подкатегории cat2 из массива mass2
                        array_push($masCatedory, $cat2->category_id); // добавляем Id из массива mass2 в выходной массив
                        }
                    foreach ($mass2 as $key => $cat2) { // для каждой подкатегории cat2 из массива mass2
                        $mass3 = $this->getSubCategoriesId($cat2->category_id);// запускаем ту же процедуру для вложенной подкатегории
                        if (!empty($mass3)) { // если массив не пустой
                            foreach ($mass3 as $key => $cat3) { // для каждой подкатегории cat3 из массива mass3
                                array_push($masCatedory, $cat3->category_id); // добавляем Id из массива mass3 в выходной массив
                            }
                        }
                    }
                }
            }
        } // если больше нет вложенных подкатегорий
        return $masCatedory; // возвращаем итоговый массив
}
               
               
function getAllCatCountProducts(){
        $db = & JFactory::getDBO();   
        $query = "SELECT category_id, count(product_id) as k FROM `#__jshopping_products_to_categories` AS prod LEFT JOIN
                             `#__jshopping_products` AS pr_cat USING (product_id) where   product_publish=1 group by category_id";
        $db->setQuery($query);
        $list = $db->loadObjectList();
        $rows = array();// массив всех категорий с товарами
        $subCat = array();
        foreach($list as $row){ // записываем в массив количество товаров только в категории без подкатегорий
            $rows[$row->category_id] = $row->k;
        }
        // массив категорий, которые мы видим в списке     
        $subCat = $this->getSubCategoriesId($this->category_id) ; //и для которых нам надо вывести количество товаров
        foreach ($subCat as  $key => $value) { // выбираем эти категории по очереди
            $masCatId = array();// массив всех вложенных подкатегорий в очередной категории
            $masCatId = self::getAllSubCat($value->category_id);
            foreach ($masCatId as $key2 => $value2) {// к количеству товаров из самой категории
                $rows[$value->category_id] = $rows[$value->category_id] + $rows[$value2];// прибавляем количество товаров из всех вложенных подкатегорий
            }
        }
        return $rows; // возвращаем итоговый список категорий с товарами с учётом вложенных подкатегорий
    }
Извиняйте за корявый код. Что мы имеем в итоге. Данный метод позволяет показывать количество товаров в списке категорий до третьего уровня вложенности. Т.е. это:
- Категории, которые мы видим в списке категорий и для которых мы отображаем количество товаров.
- Их подкатегории
- Подкатегории подкатегорий
- Подкатегории подкатегорий подкатегорий
Вот такая ботва. Я думаю в 90% случаев этого достаточно. Если нужно копать глубже, то в функцию getAllSubCat($catId) надо добавить ещё один массив mass4 и написать продолжение в том же стиле. Там вроде всё наглядно, логика ясна.
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Я решил не использовать рекурсию и просто написал несколько вложенных процедур.

так а в чем затык с универсальностью? может поможет функция getTreeAllCategories в файле \administrator\components\com_jshopping\models\categories.php ? только вам в цикле еще и надо отсеивать только подходящие категории (с нужными $category_parent_id)
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

cancerogen

  • Новичок
  • 6
  • 3 / 0
В чём затык я писал. Надо где-то хранить все массивы, которые мы обходим в циклах, причём сами эти массивы создаются в процессе обхода. Поэтому примитивная рекурсия тут не поможет. Из-за этого я сделал вариант с вложенными процедурами, что проще и в большинстве случаев предостаточно. Для любителей позаморачиваться или если уж очень надо, скажу моё видение, как сделать универсальный вариант, со сколь угодно большой степенью вложенности подкатегорий. Надо создать массив, в котором хранить массивы подкатегорий и в каждом цикле просто увеличивать счётчик массива. Просто я далеко не гуру кодинга, поэтому и призывал профессионалов помочь доделать код. А если честно, мне сложно представить, кому может понадобиться больший уровень вложенности.
*

hcat

  • Новичок
  • 2
  • 1 / 0
Вариант предложенный Сancerogen абсолютно рабочий, но есть одно "НО" по пункту №1:

Эти строки нужно добавлять не только в функцию view() но и в функцию display()
$countproducts = $category->getAllCatCountProducts();
$view->assign('countproducts', $countproducts);

И после этого отображается количество только опубликованных товаров, как в корневых категориях, так и в подкатегориях.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Модуль карусели товаров JoomShopping на Swiper.js для Joomla

Автор sergeytolkachyov

Ответов: 1
Просмотров: 369
Последний ответ 10.01.2024, 19:54:00
от sergeytolkachyov
Фильтр товаров для JoomShopping 5

Автор Lemonez

Ответов: 5
Просмотров: 506
Последний ответ 04.01.2024, 22:06:03
от Biss
Разные ссылки и названия на один товар

Автор gooodwin67

Ответов: 2
Просмотров: 540
Последний ответ 04.11.2023, 12:34:19
от nevigen
Вывести название категории в списке товаров

Автор ataman

Ответов: 9
Просмотров: 3439
Последний ответ 15.09.2023, 20:31:11
от Alex_gs
WT JoomShopping Favorite - кнопки избранного в категории товаров и карточке тов

Автор sergeytolkachyov

Ответов: 11
Просмотров: 1933
Последний ответ 17.06.2023, 10:33:33
от sergeytolkachyov