Вывод товаров с суб. категорий если в категории 0 товаров.

#
Вывод товаров с суб. категорий если в категории 0 товаров.
Уже около года ищу ответ на свой вопрос:

Корень (0)
- Категория (0)
--- Под категория с товарами (50)
--- Под категория с товарами2 (50)

Как сделать так что бы я находясь в "Категория" при условии что в ней 0 товаров видел товары с под категорий в случайном порядке? Помогите очень нужно!!!  
Skype:ferdinant1988 ICQ:311960596 E-mail: ferdinant@i.ua
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
в начало кода ТДС "Интернет-магазин" добавляете следующую функцию:
function getAllSubGroups($start_groups_id, $current_shop_id, $shop, $groups =
    array())
{
    // получим число групп и элементов в текущей группе и ее подгруппах.
   // подробнее см. API
   $count_groups = $shop->GetCountItemsAndGroups($start_groups_id, $current_shop_id, false);
   
   // если есть подгруппы
    if ($count_groups['count_groups'] > 0) {
       
       // получим ресурс с подгруппами текущей группы
        $resource = $shop->GetGroups($current_shop_id, $start_groups_id);
        
        // обработаем его
      while ($row = mysql_fetch_assoc($resource)) {
         
           // итеративно вызовем функцию getAllSubGroups на случай если у рассматриваемой группы
         // тоже есть подгруппы
            $groups = getAllSubGroups($row['shop_groups_id'], $current_shop_id, $shop, $groups);
            
         // добавим в массив группу id рассматриваемой группы  
            $groups[] = $row['shop_groups_id'];
        }
    }
    return $groups;
}


а перед вызовом метода ShowShop() добавить следующий фрагмент кода:
// получим число групп и элементов в текущей группе и ее подгруппах.
// подробнее см. API
$count_groups = $shop->GetCountItemsAndGroups($GLOBALS['shop_item_path']['group'],
    $current_shop_id);

// если в текущей группе элементов нет, а в подгруппах есть
if ($count_groups['count_items'] == 0 && $count_groups['count_all_items'] > 0) {

    // если мы в корневой группе ИМ...
    if ($GLOBALS['shop_item_path']['group'] == 0) {

        // то проще задать current_group_id = false
        // быстрее будет ;)
        $param['current_group_id'] = false;

    } else {
        // если мы не в корне ИМ то возможны варианты:

        if ($count_groups['count_groups'] > 0) {
            // если у текущей группы есть подгруппы:

            //то создаем массив
            $groups = array();

            //заполняем его деревом подгрупп
            $groups = getAllSubGroups($GLOBALS['shop_item_path']['group'], $current_shop_id,
                $shop);

            // добавляем в массив текущую группу
            $groups[] = $GLOBALS['shop_item_path']['group'];

            // передаем массив с подгруппами
            $param['current_group_id'] = $groups;

        } else {
            // если мы не в корне ИМ и подгрупп нету, то ничего и не меняется :)
            $param['current_group_id'] = $GLOBALS['shop_item_path']['group'];
        }
    }
}


После этого, в xml попадут все подгруппы текущей группы, и все их товары.
Далее нужно правильно настроить XSL-шаблон, чтобы он выводил несколько товаров из подгрупп, когда в текущей группе товаров нету.

Обращаю внимание: чем выше к корню текущая группа, тем больше будет генерируемый XML, и вы можете упереться в нехватку памяти
Поэтому после добавленного фрагмента и перед ShowShop() можно еще вставить несколько параметров (на ваше усмотрение, в зависимости от того, какая информация на отображаемой странице вам не нужна)
// следующие опции можно использовать для "облегчения" генерируемого XML
    $param['show_text'] = false;
    $param['xml_show_tying_products'] = false;
    $param['xml_show_modification'] = false;
    $param['xml_show_group_property'] = false;
    $param['xml_show_item_property'] = false;
    $param['xml_show_tags'] = false;


Это общее решение.

Его можно развить, добавив к нему ограничение по числу выводимых элементов и случайную сортировку:
    // зададим случайную сортировку
   $param['items_field_order'] = 'RAND()';
   
   // зададим вывод 3х элементов
    $param['items_begin'] = 0;
    $param['items_on_page'] = 3;

А дальше уже обработать и эту ситуацию в XSL. Для упрощения шаблона, можно передать в xml некий признак того, что вывод будет происходить не обычным путем, а из подгрупп, чтобы проверив наличие этог признака можно было, например, вызвать специальный теплейт с каким-нибудь mode.
Сделаем так,
// передаим в xml признак того, что вывод будет происходить из подгрупп
    $external_propertys['show_items_from_subgroups'] = 1;

если в текущей группе нет товаров а в подгруппах есть. А если в текущей группе есть товары, то будем передавать не 1 а 0

Таким образом, вся вставка перед вызовом ShowShop() целиком будет выглядеть так:
// получим число групп и элементов в текущей группе и ее подгруппах.
// подробнее см. API
$count_groups = $shop->GetCountItemsAndGroups($GLOBALS['shop_item_path']['group'],
    $current_shop_id);

// если в текущей группе элементов нет, а в подгруппах есть
if ($count_groups['count_items'] == 0 && $count_groups['count_all_items'] > 0) {

    // передаим в xml признак того, что вывод будет происходить из подгрупп
    $external_propertys['show_items_from_subgroups'] = 1;

    // если мы в корневой группе ИМ...
    if ($GLOBALS['shop_item_path']['group'] == 0) {

        // то проще задать current_group_id = false
        // быстрее будет ;)
        $param['current_group_id'] = false;

    } else {
        // если мы не в корне ИМ то возможны варианты:

        if ($count_groups['count_groups'] > 0) {
            // если у текущей группы есть подгруппы:

            //то создаем массив
            $groups = array();

            //заполняем его деревом подгрупп
            $groups = getAllSubGroups($GLOBALS['shop_item_path']['group'], $current_shop_id,
                $shop);

            // добавляем в массив текущую группу
            $groups[] = $GLOBALS['shop_item_path']['group'];

            // передаем массив с подгруппами
            $param['current_group_id'] = $groups;

        } else {
            // если мы не в корне ИМ и подгрупп нету, то ничего и не меняется :)
            $param['current_group_id'] = $GLOBALS['shop_item_path']['group'];
        }
    }

    // зададим случайную сортировку
    $param['items_field_order'] = 'RAND()';

    // зададим вывод 3х элементов
    $param['items_begin'] = 0;
    $param['items_on_page'] = 3;
} else {
    // передаим в xml признак того, что вывод будет происходить из текущей группы (т.е. как обычно)
    $external_propertys['show_items_from_subgroups'] = 0;
}

и не забываем добавить функцию getAllSubGroups() в начало кода ТДС

Домашнее задание: написать XSL, корректно обрабатывающий данную ситуацию
Заказов не беру. Консультирую редко.
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
При таких манипуляциях в xml выводятся группы только первого уровня. Как сделать так, что бы выводилось дерево только текущей группы?
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
Данный код работает, спасибо "Kotoff"! Но только в том случае, если в категории нет товаров, а в под категориях есть..
Но как заставить выводить товары из под категорий в категории, даже при наличии в ней (в категории) товаров?
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
Xsanders писал(а):
Но как заставить выводить товары из-под категорий в категории, даже при наличии в ней (в категории) товаров?

Поменять условие:
if ($count_groups['count_items'] == 0 && $count_groups['count_all_items'] > 0) {
Заказов не беру. Консультирую редко.
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
Все так просто..
Kotoff, большое спасибо!!!

Правда в навигации замечен косячек небольшой...
Выводятся товары, а под ними строка навигации ///  1-я стр. 2, 3, и т.д., так вот эти страницы почему-то ведут на листинг корневого каталога (главной группы "Интернет-Магазин"...
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
А кто сказал, что должно быть сложно?
Пожалуйста!
Заказов не беру. Консультирую редко.
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
Xsanders писал(а):
так вот эти страницы почему-то ведут на листинг корневого каталога
Все правильно.
Вы, как я понимаю, вызываете этот способ находясь фактически в корне магазина (т.е. $GLOBALS['shop_item_path']['group'] у вас равно 0). Вот вам и выводятся пагинационные ссылки от корня.

Если будете вызывать этот способ из какой-то подгруппы, то ссылки пагинации будут вести на эту подгруппу.

Оно и логично. А куда, по-вашему, должны вести эти ссылки, если у вас в выводе товары из _разных_ групп?
Заказов не беру. Консультирую редко.
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
Цепочка такая:  

Интернет-Магазин -> Детские товары -> Самокаты
Интернет-Магазин -> Детские товары -> Игрушки

Когда находимся в Интернет-Магазин -> Детские товары,   то выводятся товары из "Самокаты" и "Игрушки".

Мне казалось, что пагинация тоже должна быть привязана к выводу этих товаров, ну как бы пагинация относительно того массива, который вывелся из подгрупп.
#
Re: Вывод товаров с суб. категорий если в категории 0 товаров.
Xsanders, пагинация всегда привязана к той группе, где вы сейчас фактически находитесь. Выводить-то вы при этом что угодно можете, но если вы, исходя из url страницы, находитесь в разделе "Самокаты", то пагинация будет рассчитываться относительно раздела "Самокаты", а если вы находитесь в "Детских товарах", то ссылки пагинции будут рассчитываться относительно "Детских товаров".
А как еще-то?
Ну опишите мне какой-нибудь альтернативный алгорим, в котором бы при этом не было логических противоречий...
Заказов не беру. Консультирую редко.
Авторизация