Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине

Модератор
#
Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
Генерация дерева групп в интернет-магазине возможна в нескольких режимах - all, tree, current. Часто бывает необходимо сократить XML, чтобы в выборку пошли текущие подгруппы и их подгруппы, предлагаю реализацию с использованием нового параметра $param['xml_show_group_id'], в который помещаем ID групп от текущего уровня до корня, текущие подгруппы в группе и их подгруппы. ID текущей группы содержится в $param['current_group_id'].
Предложенный метод будет работать частично с версии 5.8.5, полностью в 5.8.6:

// Обязательно включаем корень
$xml_show_group_id = array(0);

$parent_group_id = $param['current_group_id'];

// Выбираем группы от текущей группы до корня
while($parent_group_id != 0)
{
$xml_show_group_id[] = $parent_group_id;

$group_row = $shop->GetGroup($parent_group_id);

if ($group_row)
{
$parent_group_id = $group_row['shop_groups_parent_id'];
}
else
{
break;
}
}

// Выбираем группы 1-го уровня для ограничения формирования XML
// Если группы 1-го уровня не нужны, то закомментируйте этот блок
$resource = $shop->GetGroups($current_shop_id, 0);
while($row = mysql_fetch_assoc($resource))
{
$xml_show_group_id[] = $row['shop_groups_id'];
}

// Выбираем только непосредственные подгруппы
/*$subgroup = $shop->GetAllGroups($current_shop_id, array ('shop_groups_parent_id' => $param['current_group_id']));

foreach ($subgroup as $row)
{
$xml_show_group_id[] = $row['shop_groups_id'];
}*/

// Выбираем по дереву все подгруппы текущей группы
$mas_group = $shop->GetGroupsTree($param['current_group_id'], $current_shop_id);
$xml_show_group_id = SetGroups($mas_group, $xml_show_group_id);

$param['xml_show_group_id'] = $xml_show_group_id;
$param['xml_show_group_property'] = false;
$param['xml_show_tags'] = false;
$param['xml_show_group_type'] = 'all';

$shop->ShowShop($current_shop_id, $xsl_catalog, $param, external_propertys);
#
Re: Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
Скажите, работает ли этот способ сейчас? Не возникнет ли проблем, если магазин работает от корня сайта?
#
Re: Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
вопрос снят
#
Re: Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
Спасибо, ваша идея позволила существенно ускорить генерацию страницы! Правда, не в интернет магазине, а в информационной системе. Но есть ряд вопросов. Мой рабочий код:

                     $xml_show_group_id = array(0);
                     $parent_group_id = $GLOBALS['INFSYS_result']['group'];
                     while($parent_group_id != 0)
                     {
                        $xml_show_group_id[] = $parent_group_id;                  
                        $group_row = $InformationSystem->GetInformationGroup($parent_group_id);                     
                        if ($group_row)   {
                           $parent_group_id = $group_row['information_groups_parent_id'];
                        } else {
                           break;
                        }
                     }         
         
                      $roots_groups = $InformationSystem->GetInformationGroup($GLOBALS['INFSYS_result']['group']);

                     
                      $xml_show_group_id[] = $GLOBALS['INFSYS_result']['group'];
                         
                      $param_cuter['information_system_id'] = 70;
                      $param_cuter['groups_parent_id'] = $GLOBALS['INFSYS_result']['group'];
                      $subgroup = $InformationSystem->GetAllInformationGroups($param_cuter);

                      foreach ($subgroup as $row)
                      {
                         $xml_show_group_id[] = $row['information_groups_id'];
            
                         $param_cuter_in['information_system_id'] = 70;
                         $param_cuter_in['groups_parent_id'] = $row['information_groups_id'];
                         $subgroup_in = $InformationSystem->GetAllInformationGroups($param_cuter_in);
            
                         foreach ($subgroup_in as $row_in)
                         {
                            $xml_show_group_id[] = $row_in['information_groups_id'];
                         }   
            
                      }         
                               
                     $property['xml_show_group_id'] = $xml_show_group_id;
                     $property['xml_show_group_type'] = 'all';
#
Re: Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
Так вот, код рабочий, но потомков группы, я получаю с помощью функции GetAllInformationGroups, функция, соответственно, с указанными параметрами возвращает только непосредственных потомков. Для получения более глубокого уровня я выполняю функцию GetAllInformationGroups еще раз, но уже применительно к потомкам. Такой способ работает, но получается для каждого нового уровня требуемого приходится добавлять еще один цикл внутри цикла (и так далее).

Возможно я не заметил какую-то функцию в API, поэтому интересуюсь — можно ли получить список групп-потомков (не только непосредственных, но и более глубоких) одним вызовом функции?
#
Re: Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
formadesign писал(а):
Такой способ работает, но получается для каждого нового уровня требуемого приходится добавлять еще один цикл внутри цикла (и так далее).
Нужно вынести вызов метода GetAllInformationGroups() в отдельную функцию, и вызывать ее рекурсивно в одном единственном цикле, пока уровень вложенности групп не закончится.
Заказов не беру. Консультирую редко.
#
Re: Re: Оптимизация выборки групп магазина. Использование параметра $param['xml_show_group_id'] при больших выборках групп в интернет-магазине
Kotoff писал(а):
Нужно вынести вызов метода GetAllInformationGroups() в отдельную функцию, и вызывать ее рекурсивно в одном единственном цикле, пока уровень вложенности групп не закончится.

Да это понятно, вопрос не в этом Суть-то от этого не меняется. Будет то же самое больше количество вызовов функцииGetAllInformationGroups. Причем их количество будет расти нелинейно, чем больше глубина и количество групп, тем больше вызов. Не знаю как работает функция — обращается ли они к какому-то кэшу, или же выполняется 1500 запросов к БД.
Авторизация