예제 #1
0
 /**
  * <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>
  * &lt;?
  * // Выберем все местоположения группы 2
  * $db_res = CSaleLocationGroup::GetLocationList(array("LOCATION_GROUP_ID"=&gt;2));
  * while ($ar_res = $db_res-&gt;Fetch())
  * {
  *    echo $ar_res["LOCATION_ID"].", ";
  * }
  * ?&gt;
  * </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;
     }
 }
예제 #2
0
	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;
	}