8namespace Bitrix\Sale\Location;
12use Bitrix\Main\Entity;
13use Bitrix\Main\Localization\Loc;
15use Bitrix\Sale\Location\Name;
16use Bitrix\Sale\Location\Util\Assert;
17use Bitrix\Sale\Location\Search;
18use Bitrix\Sale\Location\DB\Helper;
20Loc::loadMessages(__FILE__);
47 return 'b_sale_location';
61 $code = Assert::expectStringNotNull(
$code,
'$code');
63 if(!is_array($parameters))
64 $parameters =
array();
66 $parameters[
'filter'][
'=CODE'] =
$code;
67 $parameters[
'limit'] = 1;
69 return self::getList($parameters);
76 foreach(static::getEntity()->getFields() as $field)
80 if ($field->getName() ===
'LATITUDE')
82 $latitude = (string)(
$data[
'LATITUDE'] ??
null);
86 if (!is_numeric($latitude))
88 $error = Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_LATITUDE_TYPE_ERROR');
92 $latitude = (float)$latitude;
93 if ($latitude < -90 || $latitude > 90)
95 $error = Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_LATITUDE_RANGE_ERROR');
101 if ($field->getName() ===
'LONGITUDE')
103 $longitude = (string)(
$data[
'LONGITUDE'] ??
null);
104 if ($longitude !==
'')
107 if (!is_numeric($longitude))
109 $error = Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_LONGITUDE_TYPE_ERROR');
113 $longitude = (float)$longitude;
114 if ($longitude < -180 || $longitude > 180)
116 $error = Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_LONGITUDE_RANGE_ERROR');
127 Entity\FieldError::INVALID_VALUE
164 $resetLegacy = !isset($additional[
'RESET_LEGACY']) || $additional[
'RESET_LEGACY'] !==
false;
166 if(isset(
$data[
'EXTERNAL']))
168 $external =
$data[
'EXTERNAL'];
169 unset(
$data[
'EXTERNAL']);
172 if(isset(
$data[
'NAME']))
175 unset(
$data[
'NAME']);
179 if(isset(
$data[
'CODE']))
186 $addResult = parent::addExtended(
$data, $additional);
189 if($addResult->isSuccess())
191 $primary = $addResult->getId();
201 if(intval(
$data[
'TYPE_ID']) > 0 && $resetLegacy)
205 $GLOBALS[
'CACHE_MANAGER']->ClearByTag(
'sale-location-data');
213 $type = TypeTable::getList(
array(
'filter' =>
array(
'=ID' => $typeId),
'select' =>
array(
'CODE')))->fetch();
214 if(mb_strlen(
$type[
'CODE']) && in_array(
$type[
'CODE'],
array(
'COUNTRY',
'REGION',
'CITY')))
215 static::resetLegacyPath();
249 $primary = Assert::expectIntegerPositive($primary,
'$primary');
250 $resetLegacy = !isset($additional[
'RESET_LEGACY']) || $additional[
'RESET_LEGACY'] !==
false;
254 if(isset(
$data[
'EXTERNAL']))
256 $external =
$data[
'EXTERNAL'];
257 unset(
$data[
'EXTERNAL']);
260 if(isset(
$data[
'NAME']))
263 unset(
$data[
'NAME']);
267 if(isset(
$data[
'CODE']))
273 $updResult = parent::updateExtended($primary,
$data, $additional);
276 if($updResult->isSuccess())
286 if($resetLegacy && (intval(
$data[
'TYPE_ID']) > 0 || isset(
$data[
'PARENT_ID'])))
289 $GLOBALS[
'CACHE_MANAGER']->ClearByTag(
'sale-location-data');
298 public static function delete($primary)
314 $primary = Assert::expectIntegerPositive($primary,
'$primary');
315 $resetLegacy = !isset($additional[
'RESET_LEGACY']) || $additional[
'RESET_LEGACY'] !==
false;
316 $deleteSubtree = !isset($additional[
'DELETE_SUBTREE']) || $additional[
'DELETE_SUBTREE'] !==
false;
321 $rangeSql = parent::getSubtreeRangeSqlForNode($primary);
327 $data = static::getList(
array(
'filter' =>
array(
'=ID' => $primary),
'select' =>
array(
'TYPE_ID')))->fetch();
329 $delResult = parent::deleteExtended($primary, $additional);
332 if($delResult->isSuccess())
337 if($resetLegacy && intval(
$data[
'TYPE_ID']))
340 if(mb_strlen(
$type[
'CODE']) && in_array(
$type[
'CODE'],
array(
'COUNTRY',
'REGION',
'CITY')))
341 static::resetLegacyPath();
344 $GLOBALS[
'CACHE_MANAGER']->ClearByTag(
'sale-location-data');
358 $primary = Assert::expectIntegerPositive($primary,
'$primary');
360 if(!is_array($parameters) || empty($parameters))
361 $parameters =
array();
363 $parameters[
'filter'][
'LOCATION_ID'] = $primary;
365 return ExternalTable::getList($parameters);
378 $code = Assert::expectStringNotNull(
$code,
'$code');
385 if(!$behaviour[
'ACCEPT_CODE'])
386 return static::checkNodeIsParentOfNodeById($primary, $childPrimary, $behaviour);
388 $primary = Assert::expectStringNotNull($primary,
'$primary');
389 $childPrimary = Assert::expectStringNotNull($childPrimary,
'$childPrimary');
391 return static::checkNodeIsParentOfNodeByFilters(
array(
'=CODE' => $primary),
array(
'=CODE' => $childPrimary), $behaviour);
397 $locTable = static::getTableName();
401 'filter' =>
array(
'CODE' =>
array(
'COUNTRY',
'REGION',
'CITY')),
402 'select' =>
array(
'ID',
'CODE')
404 while($item =
$res->fetch())
405 $types[$item[
'CODE']] = $item[
'ID'];
409 if(!$dbConnection->isTableExists(
'b_sale_loc_rebind'))
410 $dbConnection->query(
"create temporary table b_sale_loc_rebind (TARGET_ID ".Helper::getSqlForDataType(
'int').
", LOCATION_ID ".Helper::getSqlForDataType(
'int').
")");
412 $dbConnection->query(
"truncate table b_sale_loc_rebind");
415 foreach($types as
$code => $id)
416 $sqlWhere[] =
"'".intval($id).
"'";
418 $dbConnection->query(
"update ".$locTable.
" set COUNTRY_ID = NULL, REGION_ID = NULL, CITY_ID = NULL where TYPE_ID in (".implode(
', ', $sqlWhere).
")");
420 if(intval($types[
'REGION']) && intval($types[
'COUNTRY']))
423 $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");
424 Helper::mergeTables($locTable,
'b_sale_loc_rebind',
array(
'COUNTRY_ID' =>
'LOCATION_ID'),
array(
'ID' =>
'TARGET_ID'));
425 $dbConnection->query(
"truncate table b_sale_loc_rebind");
428 if(intval($types[
'REGION']) && intval($types[
'CITY']))
431 $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");
432 Helper::mergeTables($locTable,
'b_sale_loc_rebind',
array(
'REGION_ID' =>
'LOCATION_ID'),
array(
'ID' =>
'TARGET_ID'));
433 $dbConnection->query(
"truncate table b_sale_loc_rebind");
436 if(intval($types[
'COUNTRY']) && intval($types[
'CITY']))
439 $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");
440 Helper::mergeTables($locTable,
'b_sale_loc_rebind',
array(
'COUNTRY_ID' =>
'LOCATION_ID'),
array(
'ID' =>
'TARGET_ID'));
443 $dbConnection->query(
'drop table if exists b_sale_loc_rebind');
445 if(intval($types[
'COUNTRY']))
446 $dbConnection->query(
"update ".$locTable.
" set COUNTRY_ID = ID where TYPE_ID = '".intval($types[
'COUNTRY']).
"'");
448 if(intval($types[
'REGION']))
449 $dbConnection->query(
"update ".$locTable.
" set REGION_ID = ID where TYPE_ID = '".intval($types[
'REGION']).
"'");
451 if(intval($types[
'CITY']))
452 $dbConnection->query(
"update ".$locTable.
" set CITY_ID = ID where TYPE_ID = '".intval($types[
'CITY']).
"'");
468 'data_type' =>
'integer',
470 'autocomplete' =>
true,
474 'data_type' =>
'string',
475 'title' => Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_CODE_FIELD'),
477 'validation' =>
array(__CLASS__,
'getCodeValidators')
480 'LEFT_MARGIN' =>
array(
481 'data_type' =>
'integer',
483 'RIGHT_MARGIN' =>
array(
484 'data_type' =>
'integer',
486 'DEPTH_LEVEL' =>
array(
487 'data_type' =>
'integer',
490 'data_type' =>
'integer',
491 'default_value' => 100,
492 'title' => Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_SORT_FIELD')
494 'PARENT_ID' =>
array(
495 'data_type' =>
'integer',
496 'default_value' => 0,
497 'title' => Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_PARENT_ID_FIELD')
500 'data_type' =>
'integer',
502 'title' => Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_TYPE_ID_FIELD')
505 'data_type' =>
'float',
506 'title' => Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_LATITUDE_FIELD')
508 'LONGITUDE' =>
array(
509 'data_type' =>
'float',
510 'title' => Loc::getMessage(
'SALE_LOCATION_LOCATION_ENTITY_LONGITUDE_FIELD')
515 'data_type' =>
'Bitrix\Sale\Location\Type',
516 'reference' =>
array(
517 '=this.TYPE_ID' =>
'ref.ID'
519 'join_type' =>
"inner"
522 'data_type' =>
'Bitrix\Sale\Location\Name\Location',
523 'reference' =>
array(
524 '=this.ID' =>
'ref.LOCATION_ID'
526 'join_type' =>
"inner"
529 'data_type' =>
'Bitrix\Sale\Location\Location',
530 'reference' =>
array(
531 '=this.PARENT_ID' =>
'ref.ID'
535 'data_type' =>
'Bitrix\Sale\Location\Location',
536 'reference' =>
array(
537 '<=ref.LEFT_MARGIN' =>
'this.LEFT_MARGIN',
538 '>=ref.RIGHT_MARGIN' =>
'this.RIGHT_MARGIN'
542 'data_type' =>
'Bitrix\Sale\Location\Location',
543 'reference' =>
array(
544 '=this.ID' =>
'ref.PARENT_ID'
548 'data_type' =>
'Bitrix\Sale\Location\External',
549 'reference' =>
array(
550 '=this.ID' =>
'ref.LOCATION_ID'
553 'DEFAULT_SITE' =>
array(
554 'data_type' =>
'Bitrix\Sale\Location\DefaultSite',
555 'reference' =>
array(
556 '=this.CODE' =>
'ref.LOCATION_CODE'
561 'data_type' =>
'integer',
562 'expression' =>
array(
566 'CHILDREN_CNT' =>
array(
567 'data_type' =>
'integer',
568 'expression' =>
array(
573 'IS_PARENT' =>
array(
574 'data_type' =>
'boolean',
575 'expression' =>
array(
576 'case when count(%s) > 0 then 1 else 0 end',
582 'COUNTRY_ID' =>
array(
583 'data_type' =>
'integer',
585 'REGION_ID' =>
array(
586 'data_type' =>
'integer',
589 'data_type' =>
'integer',
591 'LOC_DEFAULT' =>
array(
592 'data_type' =>
'string',
597 'data_type' =>
'Bitrix\Sale\Location\Location',
598 'reference' =>
array(
599 '=this.ID' =>
'ref.PARENT_ID'
602 'CHILD_CNT' =>
array(
603 'data_type' =>
'integer',
604 'expression' =>
array(
609 'DEFAULT_SORT' =>
array(
610 'data_type' =>
'Bitrix\Sale\Location\DefaultSiteTable',
611 'reference' =>
array(
612 '=this.CODE' =>
'ref.LOCATION_CODE'
626 if(isset($parameters[
'filter'][
'NAME']))
628 $parameters[
'filter'][
'PHRASE'] = $parameters[
'filter'][
'NAME'];
629 unset($parameters[
'filter'][
'NAME']);
632 if(isset($parameters[
'filter'][
'LANGUAGE_ID']))
634 $parameters[
'filter'][
'NAME.LANGUAGE_ID'] = $parameters[
'filter'][
'LANGUAGE_ID'];
635 unset($parameters[
'filter'][
'LANGUAGE_ID']);
638 return \Bitrix\Sale\Location\Search\Finder::find($parameters,
array(
'USE_INDEX' =>
false,
'USE_ORM' =>
false));
static getConnection($name="")
static updateMultipleForOwner($primaryOwner, $external)
static deleteMultipleForOwner($primaryOwner)
static addMultipleForOwner($primaryOwner, $external=array())
static deleteMultipleByParentRangeSql($sql)
static updateExtended($primary, array $data, array $additional=array())
static getExternalData($primary, $parameters=array())
static getCodeValidators()
static getListFast($parameters=array())
static resetLegacy($typeId)
static getByCode($code='', $parameters=array())
static checkFields(Entity\Result $result, $primary, array $data)
static addExtended(array $data, array $additional=array())
static checkNodeIsParentOfNode($primary, $childPrimary, $behaviour=array('ACCEPT_CODE'=> false, 'CHECK_DIRECT'=> false))
static deleteExtended($primary, array $additional=array())
static update($primary, array $data)
static getPathToNodeByCode($code, $parameters, $behaviour=array('SHOW_LEAF'=> true))
static deleteMultipleForOwner($primaryOwner)
static addMultipleForOwner($primaryOwner, $names=array())
static deleteMultipleByParentRangeSql($sql)
static updateMultipleForOwner($primaryOwner, $names)
static applyRestrictions(&$data)
static getPathToNodeByCondition($filter, $parameters=array(), $behaviour=array('SHOW_LEAF'=> true))
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
$GLOBALS['____1690880296']