в начало кода ТДС "Интернет-магазин" добавляете следующую функцию:
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, корректно обрабатывающий данную ситуацию