Приветствую. Встретил код Kotof в решении у "клиента", взятый, судя по всему, отсюда.
Пара вопросов к автору:
Это ведь правда рекурсивная функция с запросом внутри?
Цитата:
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;
}
Что в свою очередь означает, что если зайти в основной каталог, то сделается минимум столько же запросов к БД сколько групп в каталоге. В моём случае их было 47 +/-. Вам не кажется, что гораздо оптимальнее выбрать одним запросом все группы и в рекурсивной функции построить дерево? Тем более что вам нужны только связки ID в принципе, без остальных колонок. И еще. Количество групп и их связь меняется настолько редко, что построенное дерево вообще надо кэшировать на сутки и больше не трогать БД.
Второе:
Зачем давать заведомо замедляющие работу магазина "плюшки"?
Цитата:
// зададим случайную сортировку
$param['items_field_order'] = 'RAND()';
Это еще страшнее чем кажется для больших каталогов. Очень существенно замедляет выборку из БД. Да и вообще, принцип сортировки случайным образом в каждом запросе отменяет смысл пагинации наглухо.
Остальным - использовать такое решение не советую. Разве что как костыль.