/** * <p>Метод возвращает набор местоположений, связанных с группами местоположений, удовлетворяющих фильтру arFilter. Метод динамичный.</p> * * * @param array $arrayarFilter = Array() Фильтр представляет собой ассоциативный массив, в котором * ключами являются названия параметров записи, а значениями - * условия на значения<br><br> Допустимые ключи: <ul> <li> <b>LOCATION_ID</b> - код * местоположения;</li> <li> <b>LOCATION_GROUP_ID</b> - код группы * местоположений.</li> </ul> * * @return CDBResult <p>Возвращается объект класса CDBResult, содержащий ассоциативные * массивы с ключами:</p> <table class="tnormal" width="100%"> <tr> <th width="15%">Ключ</th> * <th>Описание</th> </tr> <tr> <td>LOCATION_ID</td> <td>Код местоположения.</td> </tr> <tr> * <td>LOCATION_GROUP_ID</td> <td>Код группы местоположений.</td> </tr> </table> <a * name="examples"></a> * * <h4>Example</h4> * <pre> * <? * // Выберем все местоположения группы 2 * $db_res = CSaleLocationGroup::GetLocationList(array("LOCATION_GROUP_ID"=>2)); * while ($ar_res = $db_res->Fetch()) * { * echo $ar_res["LOCATION_ID"].", "; * } * ?> * </pre> * * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalelocationgroup/csalelocationgroup__getlocationlist.56a02620.php * @author Bitrix */ public static function GetLocationList($arFilter = array()) { if (CSaleLocation::isLocationProMigrated()) { try { $query = new Entity\Query(self::CONN_ENTITY_NAME); $fieldMap = array('D_SPIKE' => 'D_SPIKE', 'LLOCATION_ID' => 'C.ID', 'LOCATION_GROUP_ID' => 'LOCATION_GROUP_ID'); $fieldProxy = array('LLOCATION_ID' => 'LOCATION_ID'); $query->registerRuntimeField('D_SPIKE', array('data_type' => 'integer', 'expression' => array('distinct %s', 'LOCATION_GROUP_ID'))); $query->registerRuntimeField('L', array('data_type' => self::LOCATION_ENTITY_NAME, 'reference' => array('=this.LOCATION_ID' => 'ref.ID'), 'join_type' => 'inner')); $query->registerRuntimeField('C', array('data_type' => self::LOCATION_ENTITY_NAME, 'reference' => array('LOGIC' => 'OR', array('>=ref.LEFT_MARGIN' => 'this.L.LEFT_MARGIN', '<=ref.RIGHT_MARGIN' => 'this.L.RIGHT_MARGIN'), array('=ref.ID' => 'this.L.ID')), 'join_type' => 'inner')); // select $selectFields = CSaleLocation::processSelectForGetList(array('*'), $fieldMap); // filter list($filterFields, $filterClean) = CSaleLocation::processFilterForGetList($arFilter, $fieldMap, $fieldProxy); $query->setSelect($selectFields); $query->setFilter($filterFields); $res = $query->exec(); $res->addReplacedAliases(array('LLOCATION_ID' => 'LOCATION_ID')); return $res; } catch (Exception $e) { return new DB\ArrayResult(array()); } } else { global $DB; $arSqlSearch = array(); if (!is_array($arFilter)) { $filter_keys = array(); } else { $filter_keys = array_keys($arFilter); } $countFieldKey = count($filter_keys); for ($i = 0; $i < $countFieldKey; $i++) { $val = $DB->ForSql($arFilter[$filter_keys[$i]]); if (strlen($val) <= 0) { continue; } $key = $filter_keys[$i]; if ($key[0] == "!") { $key = substr($key, 1); $bInvert = true; } else { $bInvert = false; } switch (ToUpper($key)) { case "LOCATION_ID": $arSqlSearch[] = "LOCATION_ID " . ($bInvert ? "<>" : "=") . " " . IntVal($val) . " "; break; case "LOCATION_GROUP_ID": $arSqlSearch[] = "LOCATION_GROUP_ID " . ($bInvert ? "<>" : "=") . " " . IntVal($val) . " "; break; } } $strSqlSearch = ""; $countSqlSearch = count($arSqlSearch); for ($i = 0; $i < $countSqlSearch; $i++) { $strSqlSearch .= " AND "; $strSqlSearch .= " (" . $arSqlSearch[$i] . ") "; } $strSql = "SELECT LOCATION_ID, LOCATION_GROUP_ID " . "FROM b_sale_location2location_group " . "WHERE 1 = 1 " . "\t" . $strSqlSearch . " "; $res = $DB->Query($strSql, false, "File: " . __FILE__ . "<br>Line: " . __LINE__); return $res; } }
public static function getDenormalizedLocationList($entityName, $arFilter = array()) { $class = $entityName.'Table'; $linkField = $class::getLinkField(); $typeField = $class::getTypeField(); $locationLinkField = $class::getLocationLinkField(); $useGroups = $class::getUseGroups(); $query = new Entity\Query($entityName); $fieldMap = array( 'D_SPIKE' => 'D_SPIKE', 'RLOCATION_ID' => 'RLOCATION_ID', 'LCOUNTRY_ID' => 'C.ID', 'LREGION_ID' => 'C.REGION_ID', 'LCITY_ID' => 'C.CITY_ID', $linkField => $linkField ); if($useGroups) { $fieldMap['LLOCATION_TYPE'] = $typeField; } $fieldProxy = array( 'LLOCATION_ID' => $locationLinkField ); if($useGroups) $fieldProxy['LLOCATION_TYPE'] = 'LOCATION_TYPE'; $query->registerRuntimeField( 'D_SPIKE', array( 'data_type' => 'integer', 'expression' => array( 'distinct %s', $linkField ) ) ); ///////////////////////////////////////////////// // denormalized $joinCondition = array( self::getTypeJOINCondition('ref'), '=this.'.$locationLinkField => 'ref.ID', ); if($useGroups) $joinCondition['=this.'.$typeField] = array('?', Location\Connector::DB_LOCATION_FLAG); $types = self::getTypes(); $query->registerRuntimeField( 'L', array( 'data_type' => self::SELF_ENTITY_NAME, 'reference' => $joinCondition, 'join_type' => 'left' ) ); $query->registerRuntimeField( 'C', array( 'data_type' => self::SELF_ENTITY_NAME, 'reference' => array( 'LOGIC' => 'OR', array( self::getTypeJOINCondition('ref'), '>=ref.LEFT_MARGIN' => 'this.L.LEFT_MARGIN', '<=ref.RIGHT_MARGIN' => 'this.L.RIGHT_MARGIN' ), /* array( '=ref.ID' => 'this.L.ID' ) */ ), 'join_type' => 'left' ) ); $query->registerRuntimeField( 'RLOCATION_ID', array( 'data_type' => 'integer', 'expression' => array( 'case when %s is null then %s else %s end', 'C.ID', 'LOCATION_ID', 'C.ID' ) ) ); // select $selectFields = CSaleLocation::processSelectForGetList(array('*'), $fieldMap); // filter list($filterFields, $filterClean) = CSaleLocation::processFilterForGetList($arFilter, $fieldMap, $fieldProxy, $query); $query->setSelect($selectFields); $query->setFilter($filterFields); $res = $query->exec(); $res->addReplacedAliases(array( 'RLOCATION_ID' => 'LOCATION_ID', 'LLOCATION_TYPE' => 'LOCATION_TYPE', 'LCOUNTRY_ID' => 'COUNTRY_ID', 'LREGION_ID' => 'REGION_ID', 'LCITY_ID' => 'CITY_ID' )); return $res; }