• Модуль: 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"
	}
}