- Модуль: sale
- Путь к файлу: ~/bitrix/modules/sale/lib/saleszone.php
- Класс: BitrixSaleSalesZone
- Вызов: SalesZone::getSelectedIds
static function getSelectedIds($siteId)
{
$typesAll = CSaleLocation::getTypes();
$types = array();
if(isset($typesAll['COUNTRY']))
$types[] = "'".intval($typesAll['COUNTRY'])."'";
if(isset($typesAll['REGION']))
$types[] = "'".intval($typesAll['REGION'])."'";
if(isset($typesAll['CITY']))
$types[] = "'".intval($typesAll['CITY'])."'";
$typesAll = array_flip($typesAll);
if((string) $siteId != '' && BitrixSaleLocationSiteLocationTable::checkLinkUsageAny($siteId) && !empty($types))
{
$result = array();
$sql = BitrixSaleLocationSiteLocationTable::getConnectedLocationsSql(
$siteId,
array('select' => array('ID', 'LEFT_MARGIN', 'RIGHT_MARGIN')),
array('GET_LINKED_THROUGH_GROUPS' => true)
);
if((string) $sql != '')
{
$res = $GLOBALS['DB']->query("
select SL.ID, SL.TYPE_ID from b_sale_location SL
inner join (
".$sql."
) as TT on
(
(
(
SL.LEFT_MARGIN >= TT.LEFT_MARGIN
and
SL.RIGHT_MARGIN <= TT.RIGHT_MARGIN
)
or
(
SL.LEFT_MARGIN <= TT.LEFT_MARGIN
and
SL.RIGHT_MARGIN >= TT.RIGHT_MARGIN
)
)
and
SL.TYPE_ID in (".implode(', ', $types).")
)
group by SL.ID
");
while($item = $res->fetch())
{
$typeId = $item['TYPE_ID'];
unset($item['TYPE_ID']);
$result[$typesAll[$typeId]][$item['ID']] = $item['ID'];
}
// special case: when all types are actually selected, an empty string ('') SHOULD be present among $index[$siteId][$type]
$res = LocationLocationTable::getList(array(
'filter' => array(
'TYPE_ID' => $types
),
'runtime' => array(
'CNT' => array(
'data_type' => 'integer',
'expression' => array('COUNT(*)')
)
),
'select' => array(
'CNT',
'TYPE_ID'
)
));
while($item = $res->fetch())
{
if(intval($item['TYPE_ID']))
{
$typeCode = $typesAll[$item['TYPE_ID']];
if(isset($result[$typeCode]) && $item['CNT'] == count($result[$typeCode]))
{
$result[$typeCode][] = '';
}
}
}
}
return $result;
}
else
{
return array(
'COUNTRY' => array(''),
'REGION' => array(''),
'CITY' => array(''),
); // means "all"
}
}