/** * getRegionsList * @return array regions (locations) list */ public static function getRegionsList($countryId = 0, $bFlip = false) { static $arRegions = array(); $flipIndex = intval($bFlip); if (isset($arRegions[$countryId][$flipIndex])) { return $arRegions[$countryId][$flipIndex]; } if (CSaleLocation::isLocationProMigrated()) { $types = array(); $res = \Bitrix\Sale\Location\TypeTable::getList(array('select' => array('ID', 'CODE'))); while ($item = $res->fetch()) { $types[$item['CODE']] = $item['ID']; } $filter = array(array('LOGIC' => 'OR', array('=TYPE_ID' => $types['CITY'], '=NAME.LANGUAGE_ID' => LANGUAGE_ID, array('LOGIC' => 'OR', array('=PARENT.TYPE_ID' => $types['COUNTRY']), array('=PARENT.TYPE_ID' => $types['COUNTRY_DISTRICT']), array('=PARENT_ID' => '0'))), array('=TYPE_ID' => $types['REGION']))); if (intval($countryId)) { $filter['=PARENTS.TYPE_ID'] = $types['COUNTRY']; $filter['=PARENTS.ID'] = $countryId; } $dbRegionList = \Bitrix\Sale\Location\LocationTable::getList(array('filter' => $filter, 'select' => array('ID', 'CODE', 'NAME_LANG' => 'NAME.NAME'), 'order' => array('NAME.NAME' => 'asc'))); } else { $arFilterRegion = array(); if (intval($countryId) > 0) { $arFilterRegion["COUNTRY_ID"] = $countryId; } $dbRegionList = CSaleLocation::GetRegionList(array("NAME_LANG" => "ASC"), $arFilterRegion, LANGUAGE_ID); } $key = 'ID'; while ($arRegionList = $dbRegionList->Fetch()) { if ($key == 'ID' && isset($arRegionList['CODE'])) { $key = 'CODE'; } if ($key == 'CODE' && strlen($arRegionList['CODE']) <= 0) { continue; } $arRegions[$countryId][0][$arRegionList[$key]] = $arRegionList["NAME_LANG"]; // $bFlip == false $arRegions[$countryId][1][$arRegionList["NAME_LANG"]] = $arRegionList[$key]; // $bFlip == true } return isset($arRegions[$countryId][$flipIndex]) ? $arRegions[$countryId][$flipIndex] : array(); }
public static function getTypes($params = array('LANGUAGE_ID' => LANGUAGE_ID)) { if (!is_array($params)) { $params = array(); } if (!isset($params['LANGUAGE_ID'])) { $params['LANGUAGE_ID'] = LANGUAGE_ID; } $result = array(); $lang = ToLower($params['LANGUAGE_ID']); $langMapped = static::mapLanguage($lang); $res = \Bitrix\Sale\Location\TypeTable::getList(array('select' => array('*', 'TNAME' => 'NAME.NAME', 'TLANGUAGE_ID' => 'NAME.LANGUAGE_ID'), 'order' => array('SORT' => 'asc', 'NAME.NAME' => 'asc'))); while ($item = $res->fetch()) { if (!isset($result[$item['CODE']])) { $result[$item['CODE']] = array('CODE' => $item['CODE'], 'ID' => $item['ID'], 'NAME' => array()); } $result[$item['CODE']]['NAME'][$item['TLANGUAGE_ID']] = $item['TNAME']; } foreach ($result as $code => &$data) { if ((string) $data['NAME'][$lang] != '') { $name = $data['NAME'][$lang]; } else { if ((string) $data['NAME'][$langMapped] != '') { $name = $data['NAME'][$langMapped]; } else { $name = $data['NAME']['en']; } } $data['NAME_CURRENT'] = $name; } return $result; }
public static function validateUpdateRequest(&$data) { $errors = parent::validateUpdateRequest($data); // if type is set in data and not empty, it must exist $typeError = false; if (intval($data['TYPE_ID'])) { $type = Location\TypeTable::getList(array('select' => array('ID'), 'filter' => array('=ID' => intval($data['TYPE_ID']))))->fetch(); if (!$type) { $typeError = true; } } else { $typeError = true; } if ($typeError) { $errors[] = Loc::getMessage('SALE_LOCATION_ADMIN_LOCATION_HELPER_ENTITY_TYPE_ID_UNKNOWN_ERROR'); } // formally check service ids in EXTERNAL parameter if (is_array($data['EXTERNAL']) && !empty($data['EXTERNAL'])) { $services = self::getExternalServicesList(); foreach ($data['EXTERNAL'] as $external) { if (!isset($services[$external['SERVICE_ID']])) { $errors[] = Loc::getMessage('SALE_LOCATION_ADMIN_LOCATION_HELPER_ENTITY_UNKNOWN_EXTERNAL_SERVICE_ID_ERROR'); break; } } } return $errors; }
public function __construct($parameters = array()) { $this->resetProcess(); if (is_array($parameters['TYPES']) && !empty($parameters['TYPES'])) { $this->procData['ALLOWED_TYPES'] = array_unique($parameters['TYPES']); } $typeSort = array(); $res = Location\TypeTable::getList(array('select' => array('ID', 'CODE', 'SORT'))); while ($item = $res->fetch()) { if (!is_array($this->procData['ALLOWED_TYPES']) || is_array($this->procData['ALLOWED_TYPES']) && in_array($item['ID'], $this->procData['ALLOWED_TYPES'])) { $this->procData['TYPES'][$item['CODE']] = $item['ID']; } $this->procData['TYPE_SORT'][$item['ID']] = $item['SORT']; } $this->procData['TYPES_BACK'] = array_flip($this->procData['TYPES']); $this->initInsertHandles(); }
public static function reInitData() { static::cleanUp(); $offset = 0; $stat = array(); $types = array(); $typeSort = array(); $res = Location\TypeTable::getList(array('select' => array('ID', 'CODE', 'SORT'))); while ($item = $res->fetch()) { if ($item['CODE'] == 'CITY' || $item['CODE'] == 'VILLAGE' || $item['CODE'] == 'STREET') { $types[$item['CODE']] = $item['ID']; } $typeSort[$item['ID']] = $item['SORT']; } $typesBack = array_flip($types); //_print_r($types); //_print_r($typeSort); while (true) { $res = Location\LocationTable::getList(array('select' => array('ID', 'TYPE_ID'), 'filter' => array('=TYPE_ID' => array_values($types)), 'limit' => self::STEP_SIZE, 'offset' => $offset)); $cnt = 0; while ($item = $res->fetch()) { $resPath = Location\LocationTable::getPathToNode($item['ID'], array('select' => array('ID', 'TYPE_ID'), 'filter' => array('=TYPE_ID' => array_values($types)))); $path = array(); while ($pItem = $resPath->fetch()) { $path[$typesBack[$pItem['TYPE_ID']]] = $pItem['ID']; } //_print_r($path); $data = array('CITY_ID' => isset($path['CITY']) ? $path['CITY'] : 0, 'VILLAGE_ID' => isset($path['VILLAGE']) ? $path['VILLAGE'] : 0, 'STREET_ID' => isset($path['STREET']) ? $path['STREET'] : 0, 'TYPE_SORT' => $typeSort[$item['TYPE_ID']], 'LOCATION_ID' => $item['ID']); //_print_r($data); foreach ($data as &$value) { $value = "'" . $value . "'"; } //static::add($data); $GLOBALS['DB']->query("insert into " . static::getTableName() . " (CITY_ID, VILLAGE_ID, STREET_ID, TYPE_SORT, LOCATION_ID) values (" . implode(', ', $data) . ")"); $cnt++; } if (!$cnt) { break; } $offset += self::STEP_SIZE; } }
protected function obtainDataLocationTypes(&$cachedData) { $res = Location\TypeTable::getList(array( 'select' => array( '*', 'LNAME' => 'NAME.NAME' ), 'filter' => array( 'NAME.LANGUAGE_ID' => LANGUAGE_ID ), 'order' => array( 'SORT' => 'asc', 'NAME.NAME' => 'asc' ) )); $res->addReplacedAliases(array('LNAME' => 'NAME')); $types = array(); while($item = $res->fetch()) $types[$item['ID']] = $item; $cachedData['TYPES'] = $types; }
public static function getTypeCodeIdMapCached() { static $types; if($types == null) { $res = \Bitrix\Sale\Location\TypeTable::getList(array( 'select' => array( 'ID', 'CODE' ) )); $types = array(); while($item = $res->Fetch()) { $types['ID2CODE'][intval($item['ID'])] = $item['CODE']; $types['CODE2ID'][$item['CODE']] = intval($item['ID']); } } return $types; }
'=CODE' => $countryCode, '=TYPE.CODE' => 'COUNTRY' ), 'select' => array( 'ID' ) ))->fetch(); // country found if($item) $countryId = $item['ID']; } // at this point types must exist $types = array(); $res = \Bitrix\Sale\Location\TypeTable::getList(); while($item = $res->fetch()) $types[$item['CODE']] = $item['ID']; if(isset($types['COUNTRY']) && isset($types['CITY'])) { if(!$countryId) { // such country were not found, create it $data = array( 'CODE' => 'demo_country_'.WIZARD_SITE_ID, 'TYPE_ID' => $types['COUNTRY'], 'NAME' => array() ); foreach($arLanguages as $langID)
public static function createType($type) { $res = Location\TypeTable::add($type); if (!$res->isSuccess()) { throw new Main\SystemException('Type creation failed: ' . implode(', ', $res->getErrorMessages())); } return $res->getId(); }
private function grabTree() { $this->data['LOC'] = array(); $auxIndex = array('COUNTRY' => array(), 'REGION' => array(), 'CITY' => array()); $this->data['LOC'] = array('COUNTRY' => array(), 'REGION' => array(), 'CITY' => array()); // level 1: country $res = \CSaleLocation::GetList(array(), array('!COUNTRY_ID' => false, 'REGION_ID' => false, 'CITY_ID' => false, 'LID' => 'en')); while ($item = $res->Fetch()) { if (!isset($this->data['LOC']['COUNTRY'][$item['ID']])) { $this->data['LOC']['COUNTRY'][$item['ID']] = array('SUBJ_ID' => $item['COUNTRY_ID'], 'PARENT_ID' => false, 'PARENT_TYPE' => false); $auxIndex['COUNTRY'][$item['COUNTRY_ID']] = $item['ID']; } } // level 2: country - region $res = \CSaleLocation::GetList(array(), array('!REGION_ID' => false, 'CITY_ID' => false, 'LID' => 'en')); while ($item = $res->Fetch()) { if (!isset($this->data['LOC']['REGION'][$item['ID']])) { $this->data['LOC']['REGION'][$item['ID']] = array('SUBJ_ID' => $item['REGION_ID'], 'PARENT_ID' => $auxIndex['COUNTRY'][$item['COUNTRY_ID']], 'PARENT_TYPE' => 'COUNTRY'); $auxIndex['REGION'][$item['REGION_ID']] = $item['ID']; } } // level 2: country - city $res = \CSaleLocation::GetList(array(), array('REGION_ID' => false, '!CITY_ID' => false, 'LID' => 'en')); while ($item = $res->Fetch()) { if (!isset($this->data['LOC']['CITY'][$item['ID']])) { $this->data['LOC']['CITY'][$item['ID']] = array('SUBJ_ID' => $item['CITY_ID'], 'PARENT_ID' => $auxIndex['COUNTRY'][$item['COUNTRY_ID']], 'PARENT_TYPE' => 'COUNTRY'); } } // level 3: country - region - city $res = \CSaleLocation::GetList(array(), array('!REGION_ID' => false, '!CITY_ID' => false, 'LID' => 'en')); while ($item = $res->Fetch()) { if (!isset($this->data['LOC']['CITY'][$item['ID']])) { $this->data['LOC']['CITY'][$item['ID']] = array('SUBJ_ID' => $item['CITY_ID'], 'PARENT_ID' => $auxIndex['REGION'][$item['REGION_ID']], 'PARENT_TYPE' => 'REGION'); } } // language list $a = false; $b = false; $lang = new \CLanguage(); $res = $lang->GetList($a, $b); $this->data['LANG'] = array(); while ($item = $res->Fetch()) { $this->data['LANG'][] = $item['LID']; } // type list $res = Location\TypeTable::getList(); while ($item = $res->Fetch()) { $this->data['TYPE'][$item['CODE']] = $item['ID']; } }
/** * * * @param * * @return */ protected static function findNoIndex($parameters) { $dbConnection = Main\HttpApplication::getConnection(); $dbHelper = $dbConnection->getSqlHelper(); // tables $locationTable = Location\LocationTable::getTableName(); $locationNameTable = Location\Name\LocationTable::getTableName(); $locationGroupTable = Location\GroupLocationTable::getTableName(); $locationSiteTable = Location\SiteLocationTable::getTableName(); $locationTypeTable = Location\TypeTable::getTableName(); ////////////////////////////////// // sql parameters prepare ////////////////////////////////// $filter = static::parseFilter($parameters['filter']); if (strlen($filter['SITE_ID']['VALUE'])) { $filterSite = $dbHelper->forSql(substr($filter['SITE_ID']['VALUE'], 0, 2)); $hasLocLinks = Location\SiteLocationTable::checkLinkUsage($filterSite, Location\SiteLocationTable::DB_LOCATION_FLAG); $hasGrpLinks = Location\SiteLocationTable::checkLinkUsage($filterSite, Location\SiteLocationTable::DB_GROUP_FLAG); $doFilterBySite = true; } if (strlen($filter['PHRASE']['VALUE'])) { $doFilterByName = true; $filterName = ToUpper($dbHelper->forSql($filter['PHRASE']['VALUE'])); } if (intval($filter['ID']['VALUE'])) { $doFilterById = true; $filterId = intval($filter['ID']['VALUE']); } if (intval($filter['CODE']['VALUE'])) { $doFilterByCode = true; $filterCode = $dbHelper->forSql($filter['CODE']['VALUE']); } $doFilterByLang = true; if (strlen($filter['NAME.LANGUAGE_ID']['VALUE'])) { $filterLang = $dbHelper->forSql(substr($filter['NAME.LANGUAGE_ID']['VALUE'], 0, 2)); } else { $filterLang = LANGUAGE_ID; } if (isset($filter['PARENT_ID']) && intval($filter['PARENT_ID']['VALUE']) >= 0) { $doFilterByParent = true; $filterParentId = intval($filter['PARENT_ID']['VALUE']); } if (intval($filter['TYPE_ID']['VALUE'])) { $doFilterByType = true; $filterTypeId = intval($filter['TYPE_ID']['VALUE']); } // filter select fields if (!is_array($parameters['select'])) { $parameters['select'] = array(); } $map = Location\LocationTable::getMap(); $nameAlias = false; foreach ($parameters['select'] as $alias => $field) { if ($field == 'CHILD_CNT') { $doCountChildren = true; } if ($field == 'NAME.NAME') { $nameAlias = $alias; } if (!isset($map[$field]) || !in_array($map[$field]['data_type'], array('integer', 'string', 'float', 'boolean')) || isset($map[$field]['expression'])) { unset($parameters['select'][$alias]); } } ////////////////////////////////// // sql query build ////////////////////////////////// // mandatory fields to be selected anyway // alias => field $fields = array('L.ID' => 'L.ID', 'L.CODE' => 'L.CODE', 'L.SORT' => 'L.SORT', 'LT_SORT' => 'LT.DISPLAY_SORT'); if ($nameAlias === false || !preg_match('#^[a-zA-Z0-9]+$#', $nameAlias)) { $fields['NAME'] = 'LN.NAME'; } else { $fields[$nameAlias] = 'LN.NAME'; } $fields = array_merge($fields, array('L.LEFT_MARGIN' => 'L.LEFT_MARGIN', 'L.RIGHT_MARGIN' => 'L.RIGHT_MARGIN')); $groupFields = $fields; // additional fields to select foreach ($parameters['select'] as $alias => $fld) { $lFld = 'L.' . $fld; // check if field is already selected if ((string) $alias === (string) intval($alias)) { // already selected if (in_array($lFld, $fields)) { continue; } $fields[$lFld] = $lFld; //$groupFields[$lFld] = $lFld; } else { if (isset($fields[$alias])) { continue; } $fields[$alias] = $lFld; //$groupFields[$alias] = $lFld; } $groupFields[$lFld] = $lFld; } if ($doCountChildren) { $fields['CHILD_CNT'] = 'COUNT(LC.ID)'; } // make select sql $selectSql = array(); foreach ($fields as $alias => $fld) { if ($fld == $alias) { $selectSql[] = $fld; } else { $selectSql[] = $fld . ' as ' . $alias; } } $selectSql = implode(', ', $selectSql); //$groupSql = implode(', ', array_keys($groupFields)); $groupSql = implode(', ', $groupFields); $mainSql = "select {$selectSql}\n\t\t\t\t\t\tfrom {$locationTable} L \n\t\t\t\t\t\t\tinner join {$locationNameTable} LN on L.ID = LN.LOCATION_ID\n\t\t\t\t\t\t\tinner join {$locationTypeTable} LT on L.TYPE_ID = LT.ID " . ($doCountChildren ? "\n\t\t\t\t\t\t\t\tleft join {$locationTable} LC on L.ID = LC.PARENT_ID\n\t\t\t\t\t\t\t" : "") . " \n\n\t\t\t\t\t\t%SITE_FILTER_CONDITION%\n\n\t\t\t\t\t\twhere \n\n\t\t\t\t\t\t\t%MAIN_FILTER_CONDITION%\n\n\t\t\t\t\t\t\t%GROUP_BY%\n\t\t\t\t\t\t\t"; $where = array(); if ($doFilterByLang) { $where[] = "LN.LANGUAGE_ID = '" . $filterLang . "'"; } if ($doFilterByParent) { $where[] = "L.PARENT_ID = '" . $filterParentId . "'"; } if ($doFilterById) { $where[] = "L.ID = '" . $filterId . "'"; } if ($doFilterByCode) { $where[] = "L.CODE = '" . $filterCode . "'"; } if ($doFilterByType) { $where[] = "L.TYPE_ID = '" . $filterTypeId . "'"; } if ($doFilterByName) { $where[] = "LN.NAME_UPPER like '" . $filterName . "%'"; } $mainSql = str_replace('%MAIN_FILTER_CONDITION%', implode(' and ', $where), $mainSql); $needDistinct = false; $unionized = false; $artificialNav = false; if (!$doFilterBySite) { $sql = str_replace('%SITE_FILTER_CONDITION%', '', $mainSql); } else { $sql = array(); if ($hasLocLinks) { $sql[] = str_replace('%SITE_FILTER_CONDITION%', "\n\n\t\t\t\t\tinner join {$locationTable} L2 on L2.LEFT_MARGIN <= L.LEFT_MARGIN and L2.RIGHT_MARGIN >= L.RIGHT_MARGIN\n\t\t\t\t\tinner join {$locationSiteTable} LS2 on L2.ID = LS2.LOCATION_ID and LS2.LOCATION_TYPE = 'L' and LS2.SITE_ID = '{$filterSite}'\n\n\t\t\t\t", $mainSql); } if ($hasGrpLinks) { $sql[] = str_replace('%SITE_FILTER_CONDITION%', "\n\n\t\t\t\t\tinner join {$locationTable} L2 on L2.LEFT_MARGIN <= L.LEFT_MARGIN and L2.RIGHT_MARGIN >= L.RIGHT_MARGIN\n\t\t\t\t\tinner join {$locationGroupTable} LG on LG.LOCATION_ID = L2.ID\n\t\t\t\t\tinner join {$locationSiteTable} LS2 on LG.LOCATION_GROUP_ID = LS2.LOCATION_ID and LS2.LOCATION_TYPE = 'G' and LS2.SITE_ID = '{$filterSite}'\n\n\t\t\t\t", $mainSql); $useDistinct = true; } $cnt = count($sql); if ($cnt == 1) { $needDistinct = true; } else { // UNION removes duplicates, so distinct is required only when no union here $unionized = true; } $sql = ($cnt > 1 ? '(' : '') . implode(') union (', $sql) . ($cnt > 1 ? ')' : ''); } // set groupping if needed $sql = str_replace('%GROUP_BY%', $needDistinct || $doCountChildren ? "group by {$groupSql}" : '', $sql); if (!is_array($parameters['order'])) { $sql .= " order by 3, 4 asc, 5"; } else { // currenly spike if (isset($parameters['order']['NAME.NAME'])) { $sql .= " order by 5 " . ($parameters['order']['NAME.NAME'] == 'asc' ? 'asc' : 'desc'); } } $offset = intval($parameters['offset']); $limit = intval($parameters['limit']); if ($limit) { if ($dbConnection->getType() == 'mssql') { // due to huge amount of limitations of windowed functions in transact, using artificial nav here // (does not support UNION and integer indices in ORDER BY) $artificialNav = true; } else { $sql = $dbHelper->getTopSql($sql, $limit, $offset); } } $res = $dbConnection->query($sql); if ($artificialNav) { $result = array(); $i = -1; while ($item = $res->fetch()) { $i++; if ($i < $offset) { continue; } if ($i >= $offset + $limit) { break; } $result[] = $item; } return new DB\ArrayResult($result); } else { return $res; } }
public static function reInitData($parameters = array()) { static::createTables(); $offset = 0; $stat = array(); $types = array(); $typeSort = array(); $res = Location\TypeTable::getList(array('select' => array('ID', 'CODE', 'SORT'))); $allowedTypes = array('REGION', 'SUBREGION', 'CITY', 'VILLAGE', 'STREET'); while ($item = $res->fetch()) { if (in_array($item['CODE'], $allowedTypes)) { $types[$item['CODE']] = $item['ID']; } $typeSort[$item['ID']] = $item['SORT']; } $typesBack = array_flip($types); //print_r($types); //_print_r($typeSort); $wordChain = array(); $pathChain = array(); //_dump_r('GO!'); $prevDepth = 0; while (true) { $res = Location\LocationTable::getList(array('select' => array('ID', 'TYPE_ID', 'LNAME' => 'NAME.NAME', 'DEPTH_LEVEL', 'SORT'), 'filter' => array('=TYPE_ID' => array_values($types), '=NAME.LANGUAGE_ID' => LANGUAGE_ID), 'order' => array('LEFT_MARGIN' => 'asc'), 'limit' => self::STEP_SIZE, 'offset' => $offset)); $cnt = 0; while ($item = $res->fetch()) { if ($item['DEPTH_LEVEL'] < $prevDepth) { //print('DROP to '.$item['DEPTH_LEVEL'].'<br />'); // drop chain to DEPTH_LEVEL inclusively $newWC = array(); $newPC = array(); foreach ($wordChain as $dl => $name) { if ($dl >= $item['DEPTH_LEVEL']) { break; } $newWC[$dl] = $name; } $wordChain = $newWC; foreach ($pathChain as $dl => $id) { if ($dl >= $item['DEPTH_LEVEL']) { break; } $newPC[$dl] = $id; } $pathChain = $newPC; } $wordChain[$item['DEPTH_LEVEL']] = $item['LNAME']; $pathChain[$item['DEPTH_LEVEL']] = array('TYPE' => $item['TYPE_ID'], 'ID' => $item['ID']); $prevDepth = $item['DEPTH_LEVEL']; //print($item['DEPTH_LEVEL'].' - '.implode(' ', WordStatTable::parseQuery(implode(' ', $wordChain))).'<br />'); $parsed = WordStatTable::parseQuery(implode(' ', $wordChain)); $wordMap = array(); $i = 1; foreach ($parsed as $word) { $wordMap['W_' . $i] = $word; $i++; } $pathMap = array(); foreach ($pathChain as $elem) { $pathMap[$typesBack[$elem['TYPE']] . '_ID'] = $elem['ID']; } $data = array_merge($wordMap, $pathMap, array('LOCATION_ID' => $item['ID'], 'TYPE_ID' => $item['TYPE_ID'], 'TYPE_SORT' => $typeSort[$item['TYPE_ID']], 'SORT' => $item['SORT'], 'WORD_COUNT' => count($wordMap))); //print('<pre>'); //print('</pre>'); try { static::add($data); } catch (\Exception $e) { _dump_r('Cant add ' . implode(' ', $wordChain) . ' (' . count($wordMap) . ')<br />'); // duplicate or smth } $cnt++; } if (!$cnt) { break; } $offset += self::STEP_SIZE; } }
protected function obtainDataLocationTypes(&$cachedData) { $res = Location\TypeTable::getList(array('select' => array('ID', 'CODE'), 'order' => array('SORT' => 'asc'))); while($item = $res->fetch()) { $id = $item['ID']; unset($item['ID']); $cachedData['TYPES'][$id] = $item; } }
public static function getTypeList() { static $types; if($types == null) { $res = Location\TypeTable::getList(array( 'filter' => array( 'NAME.LANGUAGE_ID' => LANGUAGE_ID, ), 'select' => array( 'ID', 'LNAME' => 'NAME.NAME' ), 'order' => array( 'SORT' => 'asc', 'NAME.NAME' => 'asc' ) )); $res->addReplacedAliases(array('LNAME' => 'NAME')); $types = array(); while($item = $res->Fetch()) $types[intval($item['ID'])] = htmlspecialcharsbx($item['NAME']); } return $types; }
public static function createType($type) { $map = Location\TypeTable::getMap($type); if (is_array($type)) { foreach ($type as $fld => $val) { if (!isset($map[$fld])) { unset($type[$fld]); } } } $res = Location\TypeTable::add($type); if (!$res->isSuccess()) { throw new Main\SystemException('Type creation failed: ' . implode(', ', $res->getErrorMessages())); } return $res->getId(); }
public static function resetLegacyPath() { $dbConnection = Main\HttpApplication::getConnection(); $locTable = static::getTableName(); $types = array(); $res = TypeTable::getList(array('filter' => array('CODE' => array('COUNTRY', 'REGION', 'CITY')), 'select' => array('ID', 'CODE'))); while ($item = $res->fetch()) { $types[$item['CODE']] = $item['ID']; } if (!empty($types)) { if (!$dbConnection->isTableExists('b_sale_loc_rebind')) { $dbConnection->query("create table b_sale_loc_rebind (TARGET_ID " . Helper::getSqlForDataType('int') . ", LOCATION_ID " . Helper::getSqlForDataType('int') . ")"); } else { $dbConnection->query("truncate table b_sale_loc_rebind"); } $sqlWhere = array(); foreach ($types as $code => $id) { $sqlWhere[] = "'" . intval($id) . "'"; } $dbConnection->query("update " . $locTable . " set COUNTRY_ID = NULL, REGION_ID = NULL, CITY_ID = NULL where TYPE_ID in (" . implode(', ', $sqlWhere) . ")"); if (intval($types['REGION']) && intval($types['COUNTRY'])) { // countries for regions $dbConnection->query("insert into b_sale_loc_rebind (TARGET_ID, LOCATION_ID) select A.ID as ONE, B.ID as TWO from " . $locTable . " A inner join " . $locTable . " B on A.TYPE_ID = '" . intval($types['REGION']) . "' and B.TYPE_ID = '" . intval($types['COUNTRY']) . "' and B.LEFT_MARGIN <= A.LEFT_MARGIN and B.RIGHT_MARGIN >= A.RIGHT_MARGIN"); Helper::mergeTables($locTable, 'b_sale_loc_rebind', array('COUNTRY_ID' => 'LOCATION_ID'), array('ID' => 'TARGET_ID')); $dbConnection->query("truncate table b_sale_loc_rebind"); } if (intval($types['REGION']) && intval($types['CITY'])) { // regions for cities $dbConnection->query("insert into b_sale_loc_rebind (TARGET_ID, LOCATION_ID) select A.ID as ONE, B.ID as TWO from " . $locTable . " A inner join " . $locTable . " B on A.TYPE_ID = '" . intval($types['CITY']) . "' and B.TYPE_ID = '" . intval($types['REGION']) . "' and B.LEFT_MARGIN <= A.LEFT_MARGIN and B.RIGHT_MARGIN >= A.RIGHT_MARGIN"); Helper::mergeTables($locTable, 'b_sale_loc_rebind', array('REGION_ID' => 'LOCATION_ID'), array('ID' => 'TARGET_ID')); $dbConnection->query("truncate table b_sale_loc_rebind"); } if (intval($types['COUNTRY']) && intval($types['CITY'])) { // countries for cities $dbConnection->query("insert into b_sale_loc_rebind (TARGET_ID, LOCATION_ID) select A.ID as ONE, B.ID as TWO from " . $locTable . " A inner join " . $locTable . " B on A.TYPE_ID = '" . intval($types['CITY']) . "' and B.TYPE_ID = '" . intval($types['COUNTRY']) . "' and B.LEFT_MARGIN <= A.LEFT_MARGIN and B.RIGHT_MARGIN >= A.RIGHT_MARGIN"); Helper::mergeTables($locTable, 'b_sale_loc_rebind', array('COUNTRY_ID' => 'LOCATION_ID'), array('ID' => 'TARGET_ID')); } Helper::dropTable('b_sale_loc_rebind'); if (intval($types['COUNTRY'])) { $dbConnection->query("update " . $locTable . " set COUNTRY_ID = ID where TYPE_ID = '" . intval($types['COUNTRY']) . "'"); } if (intval($types['REGION'])) { $dbConnection->query("update " . $locTable . " set REGION_ID = ID where TYPE_ID = '" . intval($types['REGION']) . "'"); } if (intval($types['CITY'])) { $dbConnection->query("update " . $locTable . " set CITY_ID = ID where TYPE_ID = '" . intval($types['CITY']) . "'"); } } }
/** * <p>Метод удаляет все местоположения из базы. Метод динамичный.</p> <br><br> * * * @return mixed * * @static * @link http://dev.1c-bitrix.ru/api_help/sale/classes/csalelocation/csalelocation__deleteall.1cda6559.php * @author Bitrix */ public static function DeleteAll() { global $DB; foreach (GetModuleEvents("sale", "OnBeforeLocationDeleteAll", true) as $arEvent) { if (ExecuteModuleEventEx($arEvent) === false) { return false; } } if (self::isLocationProMigrated()) { //main $DB->Query("DELETE FROM " . Location\LocationTable::getTableName()); $DB->Query("DELETE FROM " . Location\GroupTable::getTableName()); $DB->Query("DELETE FROM " . Location\TypeTable::getTableName()); //names $DB->Query("DELETE FROM " . Location\Name\LocationTable::getTableName()); $DB->Query("DELETE FROM " . Location\Name\GroupTable::getTableName()); $DB->Query("DELETE FROM " . Location\Name\TypeTable::getTableName()); //links $DB->Query("DELETE FROM " . Location\GroupLocationTable::getTableName()); $DB->Query("DELETE FROM " . Location\SiteLocationTable::getTableName()); $DB->Query("DELETE FROM " . Delivery\DeliveryLocationTable::getTableName()); //other $DB->Query("DELETE FROM " . Location\DefaultSiteTable::getTableName()); $DB->Query("DELETE FROM " . Location\ExternalTable::getTableName()); $DB->Query("DELETE FROM " . Location\ExternalServiceTable::getTableName()); } $DB->Query("DELETE FROM b_sale_location2location_group"); $DB->Query("DELETE FROM b_sale_location_group_lang"); $DB->Query("DELETE FROM b_sale_location_group"); $DB->Query("DELETE FROM b_sale_delivery2location"); $DB->Query("DELETE FROM b_sale_location"); $DB->Query("DELETE FROM b_sale_location_city_lang"); $DB->Query("DELETE FROM b_sale_location_city"); $DB->Query("DELETE FROM b_sale_location_country_lang"); $DB->Query("DELETE FROM b_sale_location_country"); $DB->Query("DELETE FROM b_sale_location_region_lang"); $DB->Query("DELETE FROM b_sale_location_region"); $DB->Query("DELETE FROM b_sale_location_zip"); foreach (GetModuleEvents("sale", "OnLocationDeleteAll", true) as $arEvent) { ExecuteModuleEventEx($arEvent); } }
{ include($_SERVER["DOCUMENT_ROOT"].$templateFolder."/confirm.php"); } } else { echo '<div class="page-title">'.GetMessage("SOA_TEMPL_HEADER").'</div><div class="row"><div class="col l7">'; echo '<p class="page-note-text">'.GetMessage("ORDER_NOTICE").'</p>'; ?> <script type="text/javascript"> <?if(CSaleLocation::isLocationProEnabled()):?> <? // spike: for children of cities we place this prompt $city = \Bitrix\Sale\Location\TypeTable::getList(array('filter' => array('=CODE' => 'CITY'), 'select' => array('ID')))->fetch(); ?> BX.saleOrderAjax.init(<?php echo CUtil::PhpToJSObject(array('source' => $this->__component->getPath() . '/get.php', 'cityTypeId' => intval($city['ID']), 'messages' => array('otherLocation' => '--- ' . GetMessage('SOA_OTHER_LOCATION'), 'moreInfoLocation' => '--- ' . GetMessage('SOA_NOT_SELECTED_ALT'), 'notFoundPrompt' => '<div class="-bx-popup-special-prompt">' . GetMessage('SOA_LOCATION_NOT_FOUND') . '.<br />' . GetMessage('SOA_LOCATION_NOT_FOUND_PROMPT', array('#ANCHOR#' => '<a href="javascript:void(0)" class="-bx-popup-set-mode-add-loc">', '#ANCHOR_END#' => '</a>')) . '</div>'))); ?> ); <?endif?> var BXFormPosting = false; function submitForm(val) { if (BXFormPosting === true) return true;
/** * * * @param * * @return */ public static function getListFast($parameters = array()) { $dbConnection = Main\HttpApplication::getConnection(); $dbHelper = $dbConnection->getSqlHelper(); // we require autocomplete to answer ASAP, so say hello to direct query // tables $locationTable = LocationTable::getTableName(); $locationNameTable = Name\LocationTable::getTableName(); $locationGroupTable = GroupLocationTable::getTableName(); $locationSiteTable = SiteLocationTable::getTableName(); $locationTypeTable = TypeTable::getTableName(); ////////////////////////////////// // sql parameters prepare ////////////////////////////////// if (strlen($parameters['filter']['SITE_ID'])) { $filterSite = $dbHelper->forSql(substr($parameters['filter']['SITE_ID'], 0, 2)); $hasLocLinks = SiteLocationTable::checkLinkUsage($filterSite, 'L'); $hasGrpLinks = SiteLocationTable::checkLinkUsage($filterSite, 'G'); if ($hasLocLinks || $hasGrpLinks) { $doFilterBySite = true; } } if (strlen($parameters['filter']['NAME'])) { $doFilterByMainParams = true; $doFilterByName = true; // user-typed '%' are not allowed in like expression - ddos risk $filterName = ToUpper($dbHelper->forSql(str_replace('%', '', $parameters['filter']['NAME']))); } if (strlen($parameters['filter']['PRIMARY'])) { $doFilterByMainParams = true; $doFilterByPrimaryCode = true; // user-typed '%' are not allowed in like expression - ddos risk $filterPrimaryCode = ToLower($dbHelper->forSql(str_replace('%', '', $parameters['filter']['PRIMARY']))); if (is_numeric($parameters['filter']['PRIMARY']) && $parameters['filter']['PRIMARY'] == intval($parameters['filter']['PRIMARY'])) { $doFilterByPrimaryId = true; $filterPrimaryId = intval($parameters['filter']['PRIMARY']); } } if (intval($parameters['filter']['ID'])) { $doFilterById = true; $filterId = intval($parameters['filter']['ID']); } if (strlen($parameters['filter']['LANGUAGE_ID'])) { $filterLang = $dbHelper->forSql(substr($parameters['filter']['LANGUAGE_ID'], 0, 2)); } if (isset($parameters['filter']['PARENT_ID']) && intval($parameters['filter']['PARENT_ID']) >= 0) { $doFilterByParent = true; $filterParentId = intval($parameters['filter']['PARENT_ID']); } if (intval($parameters['filter']['TYPE_ID'])) { $doFilterByType = true; $filterTypeId = intval($parameters['filter']['TYPE_ID']); } if (intval($parameters['filter']['EXCLUDE_SUBTREE'])) { $doFilterByExclude = true; $filterExclude = intval($parameters['filter']['EXCLUDE_SUBTREE']); $res = self::getById($filterExclude)->fetch(); if ($res) { $excludeMarginLeft = $res['LEFT_MARGIN']; $excludeMarginRight = $res['RIGHT_MARGIN']; } else { $doFilterByExclude = false; } } // filter select fields if (!is_array($parameters['select'])) { $parameters['select'] = array(); } $map = self::getMap(); foreach ($parameters['select'] as $k => $field) { if ($field == 'CHILD_CNT') { $doCountChildren = true; } if (in_array($field, array('ID', 'CODE', 'SORT', 'LEFT_MARGIN', 'RIGHT_MARGIN')) || !isset($map[$field]) || !in_array($map[$field]['data_type'], array('integer', 'string', 'float', 'boolean'))) { unset($parameters['select'][$k]); } } ////////////////////////////////// // sql query build ////////////////////////////////// $fields = array('L.ID' => 'L.ID', 'L.CODE' => 'L.CODE', 'L.SORT' => 'L.SORT', 'LT.SORT' => 'LT_SORT', 'LN.NAME' => 'LN.NAME', 'L.LEFT_MARGIN' => 'L.LEFT_MARGIN', 'L.RIGHT_MARGIN' => 'L.RIGHT_MARGIN'); $groupFields = $fields; // for select fields and group fields foreach ($parameters['select'] as $fld) { if ($fld == 'CHILD_CNT') { $fields['COUNT(LC.ID)'] = 'CHILD_CNT'; } else { $lFld = 'L.' . $fld; if (isset($fields[$lFld])) { continue; } $fields[$lFld] = $lFld; $groupFields[$lFld] = $lFld; } } // make select sql $selectSql = array(); foreach ($fields as $fld => $alias) { if ($fld == $alias) { $selectSql[] = $fld; } else { $selectSql[] = $fld . ' as ' . $alias; } } $selectSql = implode(', ', $selectSql); $groupSql = implode(', ', array_keys($groupFields)); $mainSql = "select {$selectSql}\n\t\t\t\t\t\tfrom {$locationTable} L \n\t\t\t\t\t\t\tinner join {$locationNameTable} LN on L.ID = LN.LOCATION_ID\n\t\t\t\t\t\t\tinner join {$locationTypeTable} LT on L.TYPE_ID = LT.ID " . ($doCountChildren ? "\n\t\t\t\t\t\t\t\tleft join {$locationTable} LC on L.ID = LC.PARENT_ID\n\t\t\t\t\t\t\t" : "") . " \n\n\t\t\t\t\t\t%SITE_FILTER_CONDITION%\n\n\t\t\t\t\t\twhere \n\t\t\t\t\t\t\tLN.LANGUAGE_ID = '{$filterLang}'\n\n\t\t\t\t\t\t\t%MAIN_FILTER_CONDITION%\n\n\t\t\t\t\t\t\t" . ($doFilterByParent ? "\n\t\t\t\t\t\t\t\tand L.PARENT_ID = {$filterParentId}\n\t\t\t\t\t\t\t" : "") . ($doFilterById ? "\n\t\t\t\t\t\t\t\tand L.ID = {$filterId}\n\t\t\t\t\t\t\t" : "") . ($doFilterByExclude ? "\n\t\t\t\t\t\t\t\tand not(L.LEFT_MARGIN <= {$excludeMarginLeft} and L.RIGHT_MARGIN >= {$excludeMarginRight})\n\t\t\t\t\t\t\t" : "") . ($doFilterByType ? "\n\t\t\t\t\t\t\t\tand L.TYPE_ID = {$filterTypeId}\n\t\t\t\t\t\t\t" : "") . ($doCountChildren ? "\n\t\t\t\t\t\t\t\tgroup by {$groupSql}\n\t\t\t\t\t\t\t" : ""); // todo: when search by ID or CODE, the better way is to break query onto UNIONs: first union stands for NAME_UPPER search, second - for ID exact match and the third - for CODE if ($doFilterByMainParams) { $mp = array(); if ($doFilterByPrimaryId) { $mp[] = "L.ID = {$filterPrimaryId}"; } if ($doFilterByPrimaryCode) { $mp[] = "L.CODE like '{$filterPrimaryCode}%'"; } if ($doFilterByName) { $mp[] = "LN.NAME_UPPER like '{$filterName}%'"; } $cnt = count($mp); $mainSql = str_replace('%MAIN_FILTER_CONDITION%', ' and ' . ($cnt > 1 ? '(' : '') . implode(' or ', $mp) . ($cnt > 1 ? ')' : ''), $mainSql); } else { $mainSql = str_replace('%MAIN_FILTER_CONDITION%', '', $mainSql); } if (!$doFilterBySite) { $sql = str_replace('%SITE_FILTER_CONDITION%', '', $mainSql); } else { $sql = array(); if ($hasLocLinks) { $sql[] = str_replace('%SITE_FILTER_CONDITION%', "\n\n\t\t\t\t\tinner join {$locationTable} L2 on L2.LEFT_MARGIN <= L.LEFT_MARGIN and L2.RIGHT_MARGIN >= L.RIGHT_MARGIN\n\t\t\t\t\tinner join {$locationSiteTable} LS2 on L2.ID = LS2.LOCATION_ID and LS2.LOCATION_TYPE = 'L' and LS2.SITE_ID = '{$filterSite}'\n\n\t\t\t\t", $mainSql); } if ($hasGrpLinks) { $sql[] = str_replace('%SITE_FILTER_CONDITION%', "\n\n\t\t\t\t\tinner join {$locationTable} L2 on L2.LEFT_MARGIN <= L.LEFT_MARGIN and L2.RIGHT_MARGIN >= L.RIGHT_MARGIN\n\t\t\t\t\tinner join {$locationGroupTable} LG on LG.LOCATION_ID = L2.ID\n\t\t\t\t\tinner join {$locationSiteTable} LS2 on LG.LOCATION_GROUP_ID = LS2.LOCATION_ID and LS2.LOCATION_TYPE = 'G' and LS2.SITE_ID = '{$filterSite}'\n\n\t\t\t\t", $mainSql); } $cnt = count($sql); $sql = ($cnt > 1 ? '(' : '') . implode(') union (', $sql) . ($cnt > 1 ? ')' : ''); } if (!is_array($parameters['order'])) { $sql .= " order by 3, 4 desc, 5"; } else { // currenly spike if (isset($parameters['order']['NAME.NAME'])) { $sql .= " order by 5 " . ($parameters['order']['NAME.NAME'] == 'asc' ? 'asc' : 'desc'); } } $artificialNav = false; $offset = intval($parameters['offset']); $limit = intval($parameters['limit']); if ($limit) { if ($dbConnection->getType() != 'mssql') { $sql = $dbHelper->getTopSql($sql, $limit, $offset); } else { // have no idea how to use limit-offset in UNION for transact $artificialNav = true; } } $res = $dbConnection->query($sql); if ($artificialNav) { $result = array(); $i = -1; while ($item = $res->fetch()) { $i++; if ($i < $offset) { continue; } if ($i >= $offset + $limit) { break; } $result[] = $item; } return new DB\ArrayResult($result); } else { return $res; } }