1C-Bitrix 25.700.0
Загрузка...
Поиск...
Не найдено
location.php
См. документацию.
1<?php
2
10
11use Bitrix\Main;
18
19IncludeModuleLangFile(__FILE__);
20
22{
23 const LOC2_M_OPT = 'sale_locationpro_migrated';
24 const LOC2_DEBUG_MODE_OPT = 'location2_debug_mode';
25
26 const SELF_ENTITY_NAME = 'Bitrix\Sale\Location\Location';
27 const NAME_ENTITY_NAME = 'Bitrix\Sale\Location\Name\Location';
28 const DEFAULT_SITE_ENTITY_NAME = 'Bitrix\Sale\Location\DefaultSite';
29
31 const ZIP_EXT_SERVICE_CODE = 'ZIP';
32
33 const MODIFIER_SEARCH_R = '#^((!|\+)?(>=|>|<=|<|@|~|%|=)?)#';
34 const KEY_PARSE_R = '#^(!|\+)?(>=|>|<=|<|@|~|%|=)?(.+)#';
35 const LEADING_TILDA_SEARCH_R = '#^~#';
36
38 // enable this when you want to turn on the new functionality
39
40 public static function isLocationProEnabled()
41 {
43 }
44
45 public static function locationProEnable()
46 {
48 }
49
50 public static function locationProDisable()
51 {
53 }
54
56 // enable this when you had done the migration
57
58 public static function isLocationProMigrated()
59 {
60 return Config\Option::get('sale', self::LOC2_M_OPT, '') == 'Y';
61 }
62
63 public static function locationProSetMigrated()
64 {
65 Config\Option::set('sale', self::LOC2_M_OPT, 'Y', '');
66 }
67
68 public static function locationProSetRolledBack()
69 {
70 Config\Option::set('sale', self::LOC2_M_OPT, 'N', '');
71 }
72
73 // very temporal code
74 public static function locationProCheckEnabled()
75 {
76 if(!self::isLocationProEnabled())
77 {
78 if($_REQUEST['l2switch'] == 'ON')
79 {
81 return true;
82 }
83
84 ?>
85 <form action="" method="post">
86 Location 2.0 were disabled.&nbsp;<button name="l2switch" value="ON">Enable</button>
87 </form>
88 <?
89 return false;
90 }
91 return true;
92 }
93
94 // very temporal code
95 public static function locationProControlForm()
96 {
97 ?>
98
99 <?if($_REQUEST['l2migrated']):?>
100 <?if($_REQUEST['l2migrated'] == 'ON'):?>
102 <?else:?>
104 <?endif?>
105 <?endif?>
106
107 <?if($_REQUEST['l2switch']):?>
108 <?if($_REQUEST['l2switch'] == 'ON'):?>
110 <?else:?>
112 <?endif?>
113 <?endif?>
114
115 <?if($_REQUEST['l2debug']):?>
116 <?if($_REQUEST['l2debug'] == 'ON'):?>
118 <?else:?>
120 <?endif?>
121 <?endif?>
122
123 <?$l2enabled = self::isLocationProEnabled();?>
124 <?$l2migrated = self::isLocationProMigrated();?>
125 <?$l2debug = self::isLocationProInDebug();?>
126
127 <form action="" method="post">
128 Migration: <br />
129 <button name="l2migrated" value="<?=($l2migrated ? 'OFF' : 'ON')?>"><?=($l2migrated ? 'Go Down' : 'Go Up')?></button>
130 </form>
131
132 <form action="" method="post">
133 Location 2.0: <br />
134 <button name="l2switch" value="<?=($l2enabled ? 'OFF' : 'ON')?>"><?=($l2enabled ? 'Turn OFF' : 'Turn ON')?></button>
135 </form>
136
137 <form action="" method="post">
138 Debug mode: <br />
139 <button name="l2debug" value="<?=($l2debug ? 'OFF' : 'ON')?>"><?=($l2debug ? 'Turn OFF' : 'Turn ON')?></button>
140 </form>
141
142 <?
143 }
144
145 // for old admin pages the following function should be used
146 // (for the new ones - direct call of sale.location.selector.*)
147 public static function proxySaleAjaxLocationsComponent($parameters = array(), $additionalParams = array(), $template = '', $hideIcons = true, $wrapNewComponentWith = false)
148 {
149 global $APPLICATION;
150
151 if(self::isLocationProEnabled())
152 {
153 if(!is_array($additionalParams))
154 $additionalParams = array();
155
156 $parametersProxed = array_merge(array(
157 "ID" => $parameters["LOCATION_VALUE"],
158 "CODE" => '',
159 "INPUT_NAME" => $parameters["CITY_INPUT_NAME"],
160 "CACHE_TYPE" => "A",
161 "CACHE_TIME" => "36000000",
162 "PROVIDE_LINK_BY" => "id",
163 "SEARCH_BY_PRIMARY" => "N",
164 "SHOW_DEFAULT_LOCATIONS" => "N",
165 //"JS_CALLBACK" => "submitFormProxy",
166 //"JS_CONTROL_DEFERRED_INIT" => "soa_deferred"
167 ), $additionalParams);
168
169 $siteExists = isset($parameters['SITE_ID']) && $parameters['SITE_ID'];
170 if (
171 $siteExists || !defined('ADMIN_SECTION') || ADMIN_SECTION != 'Y'
172 )
173 {
174 $parametersProxed["FILTER_BY_SITE"] = "Y";
175 $parametersProxed["FILTER_SITE_ID"] = $siteExists ? $parameters['SITE_ID'] : SITE_ID;
176 }
177
178 if($wrapNewComponentWith <> '')
179 {
180 print('<div class="'.$wrapNewComponentWith.'">');
181 }
182
183 if($template == '')
184 $appearance = \Bitrix\Sale\Location\Admin\Helper::getWidgetAppearance();
185 else
186 {
187 $appearance = 'steps';
188
189 if($template == 'popup' || $template == 'search')
190 $appearance = 'search';
191 }
192
193 $GLOBALS["APPLICATION"]->IncludeComponent(
194 "bitrix:sale.location.selector.".$appearance,
195 "",
196 $parametersProxed,
197 null,
198 array('HIDE_ICONS' => $hideIcons ? 'Y' : 'N')
199 );
200
201 if($wrapNewComponentWith)
202 print('</div>');
203 }
204 else
205 {
206 $GLOBALS["APPLICATION"]->IncludeComponent(
207 'bitrix:sale.ajax.locations',
208 $template,
209 $parameters,
210 null,
211 array('HIDE_ICONS' => $hideIcons ? 'Y' : 'N')
212 );
213 }
214 }
215
217 // enable this when you want to get debugging
218
219 public static function isLocationProInDebug()
220 {
221 return Config\Option::get('sale', self::LOC2_DEBUG_MODE_OPT, '') == 'Y';
222 }
223
224 public static function locationProDebugEnable()
225 {
226 Config\Option::set('sale', self::LOC2_DEBUG_MODE_OPT, 'Y', '');
227 }
228
229 public static function locationProDebugDisable()
230 {
231 Config\Option::set('sale', self::LOC2_DEBUG_MODE_OPT, 'N', '');
232 }
233
237
238 public static function getLocationIDbyCODE($code)
239 {
241 {
242 $item = Location\LocationTable::getList(array(
243 'select' => array(
244 'ID'
245 ),
246 'filter' => array(
247 '=CODE' => $code
248 )
249 ))->fetch();
250
251 if(empty($item))
252 return 0;
253
254 return $item['ID'];
255 }
256
257 return $code;
258 }
259
260 public static function getLocationCODEbyID($id)
261 {
262 if(CSaleLocation::isLocationProMigrated() && intval($id))
263 {
264 // we must convert ID to CODE
265 $item = Location\LocationTable::getList(array('filter' => array('=ID' => $id), 'select' => array('ID', 'CODE')))->fetch();
266
267 if(empty($item))
268 return '';
269
270 return $item['CODE'];
271 }
272
273 return $id;
274 }
275
276 public static function checkIsCode($id)
277 {
278 return ((string) $id !== (string) intval($id));
279 }
280
281 public static function tryTranslateIDToCode($id)
282 {
284 return $id;
285
286 $id = (string) $id;
287
288 if($id != '' && $id === (string) intval($id))
289 {
290 // ID came, need to translate to CODE and store
291 $location = \Bitrix\Sale\Location\LocationTable::getList(array('filter' => array('=ID' => $id), 'select' => array('ID', 'CODE')))->fetch();
292 if((string) $location['CODE'] != '')
293 return $location['CODE'];
294 }
295
296 return $id;
297 }
298
299 public static function checkLocationIsAboveCity($locationId)
300 {
301 if($locationId <> '')
302 {
304 if(!empty($tail))
305 {
306 $location = Location\LocationTable::getList(array('select' => array('TYPE_ID'), 'filter' => array(
307 'LOGIC' => 'OR',
308 array('=ID' => intval($locationId)),
309 array('=CODE' => $locationId)
310 )))->fetch();
311
312 if(!isset($tail[$location['TYPE_ID']])) // is not a city and not a descendant of it
313 {
314 return true;
315 }
316 }
317 }
318
319 return false;
320 }
321
322 public static function getLocationCityTail()
323 {
324 static $tail;
325
326 if($tail == null)
327 {
328 $tail = array();
329
330 // spike to emulate previous logic of "city" field
331 $res = Location\TypeTable::getList(array('select' => array('CODE', 'ID'), 'order' => array('SORT' => 'asc')));
332 $types = array();
333 $start = false;
334 while($item = $res->fetch())
335 {
336 if($item['CODE'] == 'CITY')
337 $start = true;
338
339 if($start)
340 $tail[$item['ID']] = true;
341 }
342 }
343
344 return $tail;
345 }
346
347 private static function getLanguages()
348 {
349 $langs = array();
350 $res = Localization\LanguageTable::getList();
351 while($item = $res->fetch())
352 $langs[] = $item['LID'];
353
354 return $langs;
355 }
356
357 public static function getSites()
358 {
359 $sites = array();
361 while($item = $res->fetch())
362 $sites[] = $item['LID'];
363
364 return $sites;
365 }
366
367 public static function getTypes()
368 {
369 static $types;
370
371 if($types == null)
372 {
373 $types = array();
374 $res = Location\TypeTable::getList();
375 while($item = $res->fetch())
376 $types[$item['CODE']] = $item['ID'];
377 }
378
379 return $types;
380 }
381
382 private static function getZipId()
383 {
384 $res = Location\ExternalServiceTable::getList(array('filter' => array('=CODE' => self::ZIP_EXT_SERVICE_CODE), 'limit' => 1))->fetch();
385
386 if($res)
387 return $res['ID'];
388
389 return false;
390 }
391
392 private static function refineFieldsForSaveCRC($id, $arFields)
393 {
394 if(!is_array($arFields[self::ORIGIN_NAME_LANGUAGE_ID]))
395 {
396 // make default names as en-names
397 $arFields[self::ORIGIN_NAME_LANGUAGE_ID] = array(
398 'LID' => self::ORIGIN_NAME_LANGUAGE_ID,
399 'NAME' => $arFields['NAME'],
400 'SHORT_NAME' => $arFields['SHORT_NAME']
401 );
402 }
403
404 $names = array();
405 foreach(self::getLanguages() as $lid)
406 {
407 if(is_array($arFields[$lid]))
408 {
409 unset($arFields[$lid]['LID']);
410 $names[$lid] = $arFields[$lid];
411 }
412 }
413
414 return array(
415 'ID' => $id, // array should not be empty
416 'NAME' => $names
417 );
418 }
419
420 private static function getLocationIdByCountryId($legacyId)
421 {
422 $res = $item = Location\LocationTable::getList(array(
423 'filter' => array(
424 '=TYPE.CODE' => 'COUNTRY',
425 '=COUNTRY_ID' => intval($legacyId),
426 '=REGION_ID' => false,
427 '=CITY_ID' => false
428 ),
429 'select' => array(
430 'ID'
431 )
432 ))->fetch();
433
434 return $res['ID'];
435 }
436
437 private static function getLocationIdByCityId($legacyId)
438 {
439 $res = Location\LocationTable::getList(array(
440 'filter' => array(
441 '=TYPE.CODE' => 'CITY',
442 '=CITY_ID' => intval($legacyId),
443 ),
444 'select' => array(
445 'ID'
446 )
447 ))->fetch();
448
449 return $res['ID'];
450 }
451
452 private static function getLocationIdByRegionId($legacyId)
453 {
454 $res = Location\LocationTable::getList(array(
455 'filter' => array(
456 '=TYPE.CODE' => 'REGION',
457 '=REGION_ID' => intval($legacyId),
458 '=CITY_ID' => false
459 ),
460 'select' => array(
461 'ID'
462 )
463 ))->fetch();
464
465 return $res['ID'];
466 }
467
468 private static function checkLangPresenceInSelect($type, $fields)
469 {
470 return in_array($type.'_NAME_', $fields, true) || in_array($type.'_SHORT_NAME', $fields, true) || in_array($type.'_NAME', $fields, true) || in_array($type.'_NAME_LANG', $fields, true) || in_array($type.'_LID', $fields, true);
471 }
472
473 private static function getTypeValueToStore($type, $arFields)
474 {
475 if(isset($arFields[$type]) && is_array($arFields[$type]) && !empty($arFields[$type]))
476 return $arFields[$type];
477
478 if(isset($arFields[$type.'_ID']) && intval($arFields[$type.'_ID']))
479 return intval($arFields[$type.'_ID']);
480
481 return false;
482 }
483
484 protected static function checkIsRealInt($val)
485 {
486 return ((string) intval($val) === (string) $val);
487 }
488
489 protected static function GetLocationTypeList($typeCode = '', $arOrder = Array("NAME_LANG"=>"ASC"), $arFilter=Array(), $strLang = LANGUAGE_ID)
490 {
491 global $DB;
492 $arSqlSearch = Array();
493
494 if(!in_array($typeCode, array('COUNTRY', 'REGION', 'CITY')))
495 {
496 $res = new CDBResult();
497 $res->InitFromArray(array());
498 return $res;
499 }
500
501 $types = self::getTypes();
502 if(!isset($types[$typeCode]))
503 {
504 $res = new CDBResult();
505 $res->InitFromArray(array());
506 return $res;
507 }
508
509 $arSqlSearch[] = "L.TYPE_ID = '".intval($types[$typeCode])."'";
510
511 if(!is_array($arFilter))
512 $filter_keys = Array();
513 else
514 $filter_keys = array_keys($arFilter);
515
516 $joinLCO = false;
517 $joinLRE = false;
518
519 $countFilterKey = count($filter_keys);
520 for($i=0; $i < $countFilterKey; $i++)
521 {
522 $val = $DB->ForSql($arFilter[$filter_keys[$i]]);
523 if ($val == '') continue;
524
525 $key = $filter_keys[$i];
526 if ($key[0]=="!")
527 {
528 $key = mb_substr($key, 1);
529 $bInvert = true;
530 }
531 else
532 $bInvert = false;
533
534 switch(mb_strtoupper($key))
535 {
536 case "ID":
537
538 if(self::checkIsRealInt($val)) // real int
539 {
540 $field = 'ID';
541 $val = intval($val);
542 }
543 else
544 {
545 $field = 'CODE';
546 $val = $DB->ForSql($val);
547 }
548
549 $arSqlSearch[] = "L.".$field." ".($bInvert?"<>":"=")." '".$val."' ";
550 break;
551 case "NAME":
552 $arSqlSearch[] = "LLN.NAME ".($bInvert?"<>":"=")." '".$val."' ";
553 break;
554 case "COUNTRY_ID":
555
556 if(self::checkIsRealInt($val)) // real int
557 {
558 $val = intval($val);
559 $arSqlSearch[] = "L.COUNTRY_ID ".($bInvert?"<>":"=")." '".$val."' ";
560 }
561 else
562 {
563 $val = $DB->ForSql($val);
564 $joinLCO = true;
565 $arSqlSearch[] = "LCO.CODE ".($bInvert?"<>":"=")." '".$val."' ";
566 }
567
568 break;
569
570 case "REGION_ID":
571
572 if(self::checkIsRealInt($val)) // real int
573 {
574 $val = intval($val);
575 $arSqlSearch[] = "L.REGION_ID ".($bInvert?"<>":"=")." '".$val."' ";
576 }
577 else
578 {
579 $val = $DB->ForSql($val);
580 $joinLRE = true;
581 $arSqlSearch[] = "LRE.CODE ".($bInvert?"<>":"=")." '".$val."' ";
582 }
583
584 break;
585 }
586 }
587
588 $strSqlSearch = "";
589 $countSqlSearch = count($arSqlSearch);
590 for($i=0; $i < $countSqlSearch; $i++)
591 {
592 $strSqlSearch .= " AND ";
593 $strSqlSearch .= " (".$arSqlSearch[$i].") ";
594 }
595
596 /*
597 L - location table
598 LN - language-independent
599 LLN - language-dependent
600 */
601
602 $strSql =
603 "SELECT L.ID as ID, L.CODE as CODE, LN.NAME as NAME_ORIG, LLN.SHORT_NAME as SHORT_NAME, LLN.NAME as NAME, L.SORT as SORT, ".
604 " CASE WHEN LLN.LOCATION_ID IS NULL THEN LN.NAME ELSE LLN.NAME END as NAME_LANG ".
605 "FROM b_sale_location L ".
606 " LEFT JOIN b_sale_loc_name LN ON (L.ID = LN.LOCATION_ID AND LN.LANGUAGE_ID = 'en') ".
607 " LEFT JOIN b_sale_loc_name LLN ON (L.ID = LLN.LOCATION_ID AND LLN.LANGUAGE_ID = '".$DB->ForSql($strLang, 2)."') ".
608
609 ($joinLCO ?
610 " INNER JOIN b_sale_location LCO ON (L.COUNTRY_ID = LCO.ID) " :
611 "").
612
613 ($joinLRE ?
614 " INNER JOIN b_sale_location LRE ON (L.REGION_ID = LRE.ID) " :
615 "").
616
617 " WHERE 1 = 1 ".$strSqlSearch." ";
618
619 $arSqlOrder = Array();
620 foreach ($arOrder as $by=>$order)
621 {
622 $by = mb_strtoupper($by);
623 $order = mb_strtoupper($order);
624 if ($order!="ASC") $order = "DESC";
625
626 if ($by == "SORT") $arSqlOrder[] = " L.SORT ".$order;
627 elseif ($by == "ID") $arSqlOrder[] = " L.ID ".$order." ";
628 elseif ($by == "NAME") $arSqlOrder[] = " LN.NAME ".$order." ";
629 elseif ($by == "SHORT_NAME") $arSqlOrder[] = " LN.SHORT_NAME ".$order." ";
630 else
631 {
632 $arSqlOrder[] = " LLN.NAME ".$order." ";
633 $by = "NAME_LANG";
634 }
635 }
636
637 $strSqlOrder = "";
638 DelDuplicateSort($arSqlOrder);
639 $countSqlOrder = count($arSqlOrder);
640 for ($i=0; $i < $countSqlOrder; $i++)
641 {
642 if ($i==0)
643 $strSqlOrder = " ORDER BY ";
644 else
645 $strSqlOrder .= ", ";
646
647 $strSqlOrder .= $arSqlOrder[$i];
648 }
649
650 $strSql .= $strSqlOrder;
651
652 $db_res = $DB->Query($strSql);
653 return $db_res;
654 }
655
656 public static function checkLocationIdExists($id)
657 {
658 $res = Location\LocationTable::getById($id)->fetch();
659
660 return intval($res['ID']);
661 }
662
663 public static function checkLocationCodeExists($code)
664 {
666
667 return intval($res['ID']);
668 }
669
670 public static function getFreeId($type)
671 {
672 $class = self::SELF_ENTITY_NAME.'Table';
673 $item = $class::getList(array('select' => array($type.'_ID'), 'limit' => 1, 'order' => array($type.'_ID' => 'desc')))->fetch();
674
675 $fromLocTable = intval($item[$type.'_ID']);
676
677 $res = self::GetLocationTypeList($type, array('ID' => 'desc'))->fetch();
678 $fromTypeTable = $res['ID'];
679
680 return max($fromLocTable, $fromTypeTable) + 1;
681 }
682
683 public static function getTypeJOINCondition($ctx = 'this')
684 {
685 static $types;
686
687 if($types == null)
688 {
689 $types = self::getTypes();
690 }
691
692 return array(
693 'LOGIC' => 'OR',
694 array('='.$ctx.'.TYPE_ID' => array('?', $types['COUNTRY'])),
695 array('='.$ctx.'.TYPE_ID' => array('?', $types['REGION'])),
696 array('='.$ctx.'.TYPE_ID' => array('?', $types['CITY'])),
697 );
698 }
699
700 public static function getTypeFilterCondition()
701 {
702 static $types;
703
704 if($types == null)
705 {
706 $types = self::getTypes();
707 }
708
709 return array($types['COUNTRY'], $types['REGION'], $types['CITY']);
710 }
711
712 protected static $allowedOps = array(
713 '='
714 );
715
716 protected static function parseFilter($filter = array())
717 {
718 $result = array();
719 if(is_array($filter))
720 {
721 foreach($filter as $k => $v)
722 {
723 $found = array();
724 preg_match(self::KEY_PARSE_R, $k, $found);
725
726 if($found[3] <> '')
727 {
728 $f = array(
729 'NOT' => $found[1] == '!',
730 'OP' => !mb_strlen($found[2])? '=' : $found[2],
731 'VALUE' => $v
732 );
733
734 if(in_array($f['OP'], static::$allowedOps))
735 {
736 $result[$found[3]] = $f;
737 }
738 }
739 }
740 }
741
742 return $result;
743 }
744
745 public static function getDenormalizedLocationList($entityName, $arFilter = array())
746 {
747 $class = $entityName.'Table';
748 $linkField = $class::getLinkField();
749 $typeField = $class::getTypeField();
750 $locationLinkField = $class::getLocationLinkField();
751 //$useGroups = $class::getUseGroups();
752 $table = $class::getTableName();
753 $useCodes = $class::getUseCodes();
754 $locationTable = Location\LocationTable::getTableName();
755 $groupTable = Location\GroupTable::getTableName();
756
759
761
762 $where = array();
763
764 if(intval($filter[$linkField]['VALUE']))
765 $where[] = 'DL.'.$linkField.' '.($filter[$linkField]['NOT'] ? '!' : '').$filter[$linkField]['OP']." '".intval($filter[$linkField]['VALUE'])."'";
766
767 if(intval($filter['LOCATION_ID']['VALUE']))
768 $where[] = 'LINK.ID '.($filter['LOCATION_ID']['NOT'] ? '!' : '').$filter['LOCATION_ID']['OP']." '".intval($filter['LOCATION_ID']['VALUE'])."'";
769
770 if($filter[$typeField]['VALUE'] == Location\Connector::DB_LOCATION_FLAG || $filter[$typeField]['VALUE'] == Location\Connector::DB_GROUP_FLAG)
771 $where[] = 'DL.'.$typeField.' '.($filter[$typeField]['NOT'] ? '!' : '').$filter[$typeField]['OP']." '".$filter[$typeField]['VALUE']."'";
772
773 $sql = "
774
775 select distinct
776 DL.".$linkField.",
777 LINK.ID as LOCATION_ID,
778 DL.".$typeField."
779 from
780 ".$table." DL
781 inner join
782 ".$locationTable." L on DL.".$typeField." = '".$locFlag."' and DL.".$locationLinkField." = L.".($useCodes ? 'CODE' : 'ID')."
783 inner join
784 ".$locationTable." LINK on LINK.LEFT_MARGIN >= L.LEFT_MARGIN and LINK.RIGHT_MARGIN <= L.RIGHT_MARGIN
785
786 ".(!empty($where) ? 'where '.implode(' and ', $where) : '')."
787
788 union
789
790 select
791 DL.".$linkField.",
792 LINK.ID as LOCATION_ID,
793 DL.".$typeField."
794 from
795 ".$table." DL
796 inner join
797 ".$groupTable." LINK on DL.".$typeField." = '".$grpFlag."' and DL.".$locationLinkField." = LINK.".($useCodes ? 'CODE' : 'ID')."
798
799 ".(!empty($where) ? 'where '.implode(' and ', $where) : '')."
800 ";
801
802 global $DB;
803
804 return $DB->query($sql);
805 }
806
810 // old api works in the old manner only when sale::isLocationProMigrated() returns false
811
812 public static function GetLocationString($locationId, $siteId = SITE_ID, $langId = LANGUAGE_ID)
813 {
814 $locationString = '';
815
817 $locationId = 0;
818
819 $countryId = $regionId = $cityId = 0;
820 if ($locationId > 0)
821 {
822 if ($arLocation = CSaleLocation::GetByID($locationId))
823 {
824 $countryId = $arLocation["COUNTRY_ID"];
825 $regionId = $arLocation["REGION_ID"];
826 $cityId = $arLocation["CITY_ID"];
827 }
828 }
829
830 //check in location city
831 $bEmptyCity = "N";
832 $arCityFilter = array("!CITY_ID" => "NULL", ">CITY_ID" => "0");
833 if ($countryId > 0)
834 $arCityFilter["COUNTRY_ID"] = $countryId;
835 $rsLocCount = CSaleLocation::GetList(array(), $arCityFilter, false, false, array("ID"));
836 if (!$rsLocCount->Fetch())
837 $bEmptyCity = "Y";
838
839 //check in location region
840 $bEmptyRegion = "N";
841 $arRegionFilter = array("!REGION_ID" => "NULL", ">REGION_ID" => "0");
842 if ($countryId > 0 && $regionId > 0)
843 $arRegionFilter["COUNTRY_ID"] = $countryId;
844 if ($regionId > 0)
845 $arRegionFilter["REGION_ID"] = $regionId;
846 $rsLocCount = CSaleLocation::GetList(array(), $arRegionFilter, false, false, array("ID"));
847 if (!$rsLocCount->Fetch())
848 $bEmptyRegion = "Y";
849
850 //check if exist another city
851 if ($bEmptyCity == "Y" && $bEmptyRegion == "Y")
852 {
853 $arCityFilter = array("!CITY_ID" => "NULL", ">CITY_ID" => "0");
854 $rsLocCount = CSaleLocation::GetList(array(), $arCityFilter, false, false, array("ID"));
855 if ($rsLocCount->Fetch())
856 $bEmptyCity = "N";
857 }
858
859 //location value
860 if ($locationId > 0 )
861 {
862 if ($arLocation = CSaleLocation::GetByID($locationId))
863 {
864 if ($bEmptyRegion == "Y" && $bEmptyCity == "Y")
865 $countryId = $locationId;
866 else
867 $countryId = $arLocation["COUNTRY_ID"];
868
869 if ($bEmptyCity == "Y")
870 $regionId = $arLocation["ID"];
871 else
872 $regionId = $arLocation["REGION_ID"];
873
874 $cityId = $locationId;
875 }
876 }
877
878 //select country
879 $arCountryList = array();
880
881 if ($bEmptyRegion == "Y" && $bEmptyCity == "Y")
882 $rsCountryList = CSaleLocation::GetList(array("SORT" => "ASC", "NAME_LANG" => "ASC"), array("LID" => $langId), false, false, array("ID", "COUNTRY_ID", "COUNTRY_NAME_LANG"));
883 else
884 $rsCountryList = CSaleLocation::GetCountryList(array("SORT" => "ASC", "NAME_LANG" => "ASC"));
885
886 while ($arCountry = $rsCountryList->GetNext())
887 {
888 if(!\Bitrix\Sale\SalesZone::checkCountryId($arCountry["ID"], $siteId))
889 continue;
890
891 if ($bEmptyRegion == "Y" && $bEmptyCity == "Y")
892 $arCountry["NAME_LANG"] = $arCountry["COUNTRY_NAME_LANG"];
893
894 $arCountryList[] = $arCountry;
895 if ($arCountry["ID"] == $countryId && $arCountry["NAME_LANG"] <> '')
896 $locationString .= $arCountry["NAME_LANG"];
897 }
898
899 if (count($arCountryList) <= 0)
900 $arCountryList = array();
901 elseif (count($arCountryList) == 1)
902 $countryId = $arCountryList[0]["ID"];
903
904 //select region
905 $arRegionList = array();
906 if ($countryId > 0 || count($arCountryList) <= 0)
907 {
908 $arRegionFilter = array("LID" => $langId, "!REGION_ID" => "NULL", "!REGION_ID" => "0");
909 if ($countryId > 0)
910 $arRegionFilter["COUNTRY_ID"] = intval($countryId);
911
912 if ($bEmptyCity == "Y")
913 $rsRegionList = CSaleLocation::GetList(array("SORT" => "ASC", "NAME_LANG" => "ASC"), $arRegionFilter, false, false, array("ID", "REGION_ID", "REGION_NAME_LANG"));
914 else
915 $rsRegionList = CSaleLocation::GetRegionList(array("SORT" => "ASC", "NAME_LANG" => "ASC"), $arRegionFilter);
916
917 while ($arRegion = $rsRegionList->GetNext())
918 {
919 if(!\Bitrix\Sale\SalesZone::checkRegionId($arRegion["ID"], $siteId))
920 continue;
921
922 if ($bEmptyCity == "Y")
923 $arRegion["NAME_LANG"] = $arRegion["REGION_NAME_LANG"];
924
925 $arRegionList[] = $arRegion;
926 if ($arRegion["ID"] == $regionId && $arRegion["NAME_LANG"] <> '')
927 $locationString = $arRegion["NAME_LANG"].", ".$locationString;
928 }
929 }
930 if (count($arRegionList) <= 0)
931 $arRegionList = array();
932 elseif (count($arRegionList) == 1)
933 $regionId = $arRegionList[0]["ID"];
934
935 //select city
936 $arCityList = array();
937 if (
938 $bEmptyCity == "N"
939 && ((count($arCountryList) > 0 && count($arRegionList) > 0 && $countryId > 0 && $regionId > 0)
940 || (count($arCountryList) <= 0 && count($arRegionList) > 0 && $regionId > 0)
941 || (count($arCountryList) > 0 && count($arRegionList) <= 0 && $countryId > 0)
942 || (count($arCountryList) <= 0 && count($arRegionList) <= 0))
943 )
944 {
945 $arCityFilter = array("LID" => $langId);
946 if ($countryId > 0)
947 $arCityFilter["COUNTRY_ID"] = $countryId;
948 if ($regionId > 0)
949 $arCityFilter["REGION_ID"] = $regionId;
950
951 $rsLocationsList = CSaleLocation::GetList(
952 array(
953 "SORT" => "ASC",
954 "COUNTRY_NAME_LANG" => "ASC",
955 "CITY_NAME_LANG" => "ASC"
956 ),
957 $arCityFilter,
958 false,
959 false,
960 array(
961 "ID", "CITY_ID", "CITY_NAME"
962 )
963 );
964
965 while ($arCity = $rsLocationsList->GetNext())
966 {
967 if(!\Bitrix\Sale\SalesZone::checkCityId($arCity["CITY_ID"], $siteId))
968 continue;
969
970 $arCityList[] = array(
971 "ID" => $arCity["ID"],
972 "CITY_ID" => $arCity['CITY_ID'],
973 "CITY_NAME" => $arCity["CITY_NAME"],
974 );
975 if ($arCity["ID"] == $cityId)
976 $locationString = ($arCity["CITY_NAME"] <> '' ? $arCity["CITY_NAME"].", " : "").$locationString;
977 }//end while
978 }
979
980 return $locationString;
981 }
982
984
985 public static function CountryCheckFields($ACTION, &$arFields)
986 {
987 global $DB;
988
989 if ((is_set($arFields, "NAME") || $ACTION=="ADD") && $arFields["NAME"] == '') return false;
990
991 /*
992 $db_lang = CLangAdmin::GetList(($b="sort"), ($o="asc"), array("ACTIVE" => "Y"));
993 while ($arLang = $db_lang->Fetch())
994 {
995 if ((is_set($arFields[$arLang["LID"]], "NAME") || $ACTION=="ADD") && strlen($arFields[$arLang["LID"]]["NAME"])<=0) return false;
996 }
997 */
998
999 return True;
1000 }
1001
1002 public static function UpdateCountry($ID, $arFields)
1003 {
1004 global $DB;
1005
1006 $ID = intval($ID);
1007
1008 if ($ID <= 0 || !CSaleLocation::CountryCheckFields("UPDATE", $arFields))
1009 return false;
1010
1011 foreach (GetModuleEvents("sale", "OnBeforeCountryUpdate", true) as $arEvent)
1012 if (ExecuteModuleEventEx($arEvent, array($ID, &$arFields))===false)
1013 return false;
1014
1016
1017 if(self::isLocationProMigrated())
1018 {
1019 try
1020 {
1021 // get location id by country id
1022 $locId = self::getLocationIdByCountryId($ID);
1023
1024 if(!$locId)
1025 return false;
1026
1028 $locId,
1029 self::refineFieldsForSaveCRC($locId, $arFields),
1030 array('REBALANCE' => false)
1031 );
1032
1033 if($res->isSuccess())
1034 return $ID;
1035
1036 return false;
1037 }
1038 catch(Exception $e)
1039 {
1040 return false;
1041 }
1042 }
1043 else
1044 {
1045 $strUpdate = $DB->PrepareUpdate("b_sale_location_country", $arFields);
1046 $strSql = "UPDATE b_sale_location_country SET ".$strUpdate." WHERE ID = ".$ID."";
1047 $DB->Query($strSql);
1048
1049 $db_lang = CLangAdmin::GetList("sort", "asc", array("ACTIVE" => "Y"));
1050 while ($arLang = $db_lang->Fetch())
1051 {
1052 if ($arCntLang = CSaleLocation::GetCountryLangByID($ID, $arLang["LID"]))
1053 {
1054 $strUpdate = $DB->PrepareUpdate("b_sale_location_country_lang", $arFields[$arLang["LID"]]);
1055 $strSql = "UPDATE b_sale_location_country_lang SET ".$strUpdate." WHERE ID = ".$arCntLang["ID"]."";
1056 }
1057 else
1058 {
1059 $arInsert = $DB->PrepareInsert("b_sale_location_country_lang", $arFields[$arLang["LID"]]);
1060 $strSql =
1061 "INSERT INTO b_sale_location_country_lang(COUNTRY_ID, ".$arInsert[0].") ".
1062 "VALUES(".$ID.", ".$arInsert[1].")";
1063 }
1064 $DB->Query($strSql);
1065 }
1066 }
1067
1069
1070 foreach (GetModuleEvents("sale", "OnCountryUpdate", true) as $arEvent)
1072
1073 return $ID;
1074 }
1075
1076 public static function DeleteCountry($ID)
1077 {
1078 global $DB;
1079 $ID = intval($ID);
1080
1081 foreach (GetModuleEvents("sale", "OnBeforeCountryDelete", true) as $arEvent)
1082 if (ExecuteModuleEventEx($arEvent, array($ID))===false)
1083 return false;
1084
1085 if(self::isLocationProMigrated())
1086 {
1087 try
1088 {
1089 /*
1090 $locId = self::getLocationIdByCountryId($ID);
1091
1092 if(!$locId)
1093 return false;
1094
1095 // just "unlink" it, so CSaleLocation::GetCountryByID() wont able to find it
1096 $res = Location\LocationTable::update($locId, array(
1097 'COUNTRY_ID' => ''
1098 ));
1099
1100 return $res->isSuccess();
1101 */
1102 return true;
1103 }
1104 catch(Exception $e)
1105 {
1106 return false;
1107 }
1108 }
1109
1110 // and also drop old records, if any
1111 $DB->Query("DELETE FROM b_sale_location_country_lang WHERE COUNTRY_ID = ".$ID."", true);
1112 $bDelete = $DB->Query("DELETE FROM b_sale_location_country WHERE ID = ".$ID."", true);
1113
1114 foreach (GetModuleEvents("sale", "OnCountryDelete", true) as $arEvent)
1115 ExecuteModuleEventEx($arEvent, array($ID));
1116
1117 return $bDelete;
1118 }
1119
1120 public static function GetCountryByID($ID)
1121 {
1122 if(self::isLocationProMigrated())
1123 {
1124 try
1125 {
1126 $res = Location\LocationTable::getList(array(
1127 'filter' => array(
1128 '=TYPE.CODE' => 'COUNTRY',
1129 '=ID' => intval($ID),
1130 '=NAME.LANGUAGE_ID' => self::ORIGIN_NAME_LANGUAGE_ID
1131 ),
1132 'select' => array(
1133 'ID',
1134 'LNAME' => 'NAME.NAME',
1135 'SHORT_NAME' => 'NAME.SHORT_NAME'
1136 )
1137 ));
1138 $res->addReplacedAliases(array('LNAME' => 'NAME'));
1139
1140 $item = $res->fetch();
1141
1142 if($item)
1143 return $item;
1144
1145 return false;
1146 }
1147 catch(Exception $e)
1148 {
1149 return false;
1150 }
1151 }
1152 else
1153 {
1154 global $DB;
1155
1156 $ID = intval($ID);
1157 $strSql =
1158 "SELECT * ".
1159 "FROM b_sale_location_country ".
1160 "WHERE ID = ".$ID." ";
1161 $db_res = $DB->Query($strSql);
1162
1163 if ($res = $db_res->Fetch())
1164 {
1165 return $res;
1166 }
1167 return False;
1168
1169 }
1170 }
1171
1172 public static function GetCountryLangByID($ID, $strLang = LANGUAGE_ID)
1173 {
1174 if(self::isLocationProMigrated())
1175 {
1176 try
1177 {
1178 $res = Location\LocationTable::getList(array(
1179 'filter' => array(
1180 '=TYPE.CODE' => 'COUNTRY',
1181 '=ID' => intval($ID),
1182 '=NAME.LANGUAGE_ID' => trim($strLang)
1183 ),
1184 'select' => array(
1185 'ID',
1186 'ID_' => 'NAME.ID',
1187 'LID' => 'NAME.LANGUAGE_ID',
1188 'LNAME' => 'NAME.NAME',
1189 'SHORT_NAME' => 'NAME.SHORT_NAME',
1190 )
1191 ));
1192
1193 $item = $res->fetch();
1194
1195 if($item)
1196 {
1197 return array(
1198 'ID' => $item['ID_'],
1199 'COUNTRY_ID' => $item['ID'],
1200 'LID' => $item['LID'],
1201 'NAME' => $item['LNAME'],
1202 'SHORT_NAME' => $item['SHORT_NAME'],
1203 );
1204 }
1205
1206 return false;
1207 }
1208 catch(Exception $e)
1209 {
1210 return false;
1211 }
1212 }
1213 else
1214 {
1215
1216 global $DB;
1217
1218 $ID = intval($ID);
1219 $strLang = Trim($strLang);
1220
1221 $strSql =
1222 "SELECT * ".
1223 "FROM b_sale_location_country_lang ".
1224 "WHERE COUNTRY_ID = ".$ID." ".
1225 " AND LID = '".$DB->ForSql($strLang, 2)."' ";
1226 $db_res = $DB->Query($strSql);
1227
1228 if ($res = $db_res->Fetch())
1229 {
1230 return $res;
1231 }
1232 return False;
1233
1234 }
1235 }
1236
1238
1239 public static function RegionCheckFields($ACTION, &$arFields)
1240 {
1241 if ((is_set($arFields, "NAME") || $ACTION=="ADD") && $arFields["NAME"] == '') return false;
1242
1243 return True;
1244 }
1245
1246 public static function UpdateRegion($ID, $arFields)
1247 {
1248 global $DB;
1249
1250 $ID = intval($ID);
1251
1252 if ($ID <= 0 || !CSaleLocation::RegionCheckFields("UPDATE", $arFields))
1253 return false;
1254
1255 foreach (GetModuleEvents("sale", "OnBeforeRegionUpdate", true) as $arEvent)
1256 if (ExecuteModuleEventEx($arEvent, array($ID, &$arFields))===false)
1257 return false;
1258
1259 if(self::isLocationProMigrated())
1260 {
1261 try
1262 {
1263 $locId = self::getLocationIdByRegionId($ID);
1264
1265 if(!$locId)
1266 return false;
1267
1269 $locId,
1270 self::refineFieldsForSaveCRC($locId, $arFields),
1271 array('REBALANCE' => false)
1272 );
1273
1274 if($res->isSuccess())
1275 return $ID;
1276
1277 return false;
1278 }
1279 catch(Exception $e)
1280 {
1281 return false;
1282 }
1283 }
1284 else
1285 {
1286 $strUpdate = $DB->PrepareUpdate("b_sale_location_region", $arFields);
1287 $strSql = "UPDATE b_sale_location_region SET ".$strUpdate." WHERE ID = ".$ID."";
1288 $DB->Query($strSql);
1289
1290 $db_lang = CLangAdmin::GetList("sort", "asc", array("ACTIVE" => "Y"));
1291 while ($arLang = $db_lang->Fetch())
1292 {
1293 if ($arCntLang = CSaleLocation::GetRegionLangByID($ID, $arLang["LID"]))
1294 {
1295 $strUpdate = $DB->PrepareUpdate("b_sale_location_region_lang", $arFields[$arLang["LID"]]);
1296
1297 $strSql = "UPDATE b_sale_location_region_lang SET ".$strUpdate." WHERE ID = ".$arCntLang["ID"]."";
1298 }
1299 else
1300 {
1301 $arInsert = $DB->PrepareInsert("b_sale_location_region_lang", $arFields[$arLang["LID"]]);
1302 $strSql =
1303 "INSERT INTO b_sale_location_region_lang(REGION_ID, ".$arInsert[0].") ".
1304 "VALUES(".$ID.", ".$arInsert[1].")";
1305 }
1306 $DB->Query($strSql);
1307 }
1308 }
1309
1310 foreach (GetModuleEvents("sale", "OnRegionUpdate", true) as $arEvent)
1312
1313 return $ID;
1314 }
1315
1316 public static function DeleteRegion($ID)
1317 {
1318 // there is no such entity in terms of location 2.0, so... just delete old entity
1319
1320 global $DB;
1321 $ID = intval($ID);
1322
1323 foreach (GetModuleEvents("sale", "OnBeforeRegionDelete", true) as $arEvent)
1324 if (ExecuteModuleEventEx($arEvent, array($ID))===false)
1325 return false;
1326
1327 if(self::isLocationProMigrated())
1328 {
1329 try
1330 {
1331 /*
1332 $locId = self::getLocationIdByRegionId($ID);
1333
1334 if(!$locId)
1335 return false;
1336
1337 // just "unlink" it, so CSaleLocation::GetCityByID() wont able to find it
1338 $res = Location\LocationTable::update($locId, array(
1339 'REGION_ID' => ''
1340 ));
1341
1342 return $res->isSuccess();
1343 */
1344 return true;
1345 }
1346 catch(Exception $e)
1347 {
1348 return false;
1349 }
1350 }
1351
1352 // and also drop old records, if any
1353 $DB->Query("DELETE FROM b_sale_location_region_lang WHERE REGION_ID = ".$ID."", true);
1354 $bDelete = $DB->Query("DELETE FROM b_sale_location_region WHERE ID = ".$ID."", true);
1355
1356 foreach (GetModuleEvents("sale", "OnRegionDelete", true) as $arEvent)
1357 ExecuteModuleEventEx($arEvent, array($ID));
1358
1359 return $bDelete;
1360 }
1361
1362 public static function GetRegionByID($ID)
1363 {
1364 if(self::isLocationProMigrated())
1365 {
1366 try
1367 {
1368 $res = Location\LocationTable::getList(array(
1369 'filter' => array(
1370 '=TYPE.CODE' => 'REGION',
1371 '=ID' => intval($ID),
1372 'NAME.LANGUAGE_ID' => self::ORIGIN_NAME_LANGUAGE_ID
1373 ),
1374 'select' => array(
1375 'ID',
1376 'LNAME' => 'NAME.NAME',
1377 'SHORT_NAME' => 'NAME.SHORT_NAME',
1378 )
1379 ));
1380 $res->addReplacedAliases(array('LNAME' => 'NAME'));
1381
1382 $item = $res->fetch();
1383
1384 if($item)
1385 return $item;
1386
1387 return false;
1388 }
1389 catch(Exception $e)
1390 {
1391 return false;
1392 }
1393 }
1394 else
1395 {
1396 global $DB;
1397
1398 $ID = intval($ID);
1399 $strSql =
1400 "SELECT * ".
1401 "FROM b_sale_location_region ".
1402 "WHERE ID = ".$ID." ";
1403 $db_res = $DB->Query($strSql);
1404
1405 if ($res = $db_res->Fetch())
1406 {
1407 return $res;
1408 }
1409 return False;
1410 }
1411 }
1412
1413 public static function GetRegionLangByID($ID, $strLang = LANGUAGE_ID)
1414 {
1415 if(self::isLocationProMigrated())
1416 {
1417 try
1418 {
1419 $res = Location\LocationTable::getList(array(
1420 'filter' => array(
1421 '=TYPE.CODE' => 'REGION',
1422 '=ID' => intval($ID),
1423 'NAME.LANGUAGE_ID' => trim($strLang)
1424 ),
1425 'select' => array(
1426 'ID',
1427 'ID_' => 'NAME.ID',
1428 'LID' => 'NAME.LANGUAGE_ID',
1429 'LNAME' => 'NAME.NAME',
1430 'SHORT_NAME' => 'NAME.SHORT_NAME',
1431 )
1432 ));
1433 $res->addReplacedAliases(array('LNAME' => 'NAME'));
1434
1435 $item = $res->fetch();
1436
1437 if($item)
1438 {
1439 return array(
1440 'ID' => $item['ID_'],
1441 'REGION_ID' => $item['ID'],
1442 'LID' => $item['LID'],
1443 'NAME' => $item['LNAME'],
1444 'SHORT_NAME' => $item['SHORT_NAME'],
1445 );
1446 }
1447
1448 return false;
1449 }
1450 catch(Exception $e)
1451 {
1452 return false;
1453 }
1454 }
1455 else
1456 {
1457 global $DB;
1458
1459 $ID = intval($ID);
1460 $strLang = Trim($strLang);
1461
1462 $strSql =
1463 "SELECT * ".
1464 "FROM b_sale_location_region_lang ".
1465 "WHERE REGION_ID = ".$ID." ".
1466 " AND LID = '".$DB->ForSql($strLang, 2)."' ";
1467 $db_res = $DB->Query($strSql);
1468
1469 if ($res = $db_res->Fetch())
1470 {
1471 return $res;
1472 }
1473 return False;
1474 }
1475 }
1476
1478
1479 public static function CityCheckFields($ACTION, &$arFields)
1480 {
1481 global $DB;
1482
1483 if ((is_set($arFields, "NAME") || $ACTION=="ADD") && $arFields["NAME"] == '') return false;
1484
1485 /*
1486 $db_lang = CLangAdmin::GetList(($b="sort"), ($o="asc"), array("ACTIVE" => "Y"));
1487 while ($arLang = $db_lang->Fetch())
1488 {
1489 if ((is_set($arFields[$arLang["LID"]], "NAME") || $ACTION=="ADD") && strlen($arFields[$arLang["LID"]]["NAME"])<=0) return false;
1490 }
1491 */
1492
1493 return True;
1494 }
1495
1496 public static function UpdateCity($ID, $arFields)
1497 {
1498 global $DB;
1499
1500 $ID = intval($ID);
1501
1502 if ($ID <= 0 || !CSaleLocation::CityCheckFields("UPDATE", $arFields))
1503 return false;
1504
1505 foreach (GetModuleEvents("sale", "OnBeforeCityUpdate", true) as $arEvent)
1506 if (ExecuteModuleEventEx($arEvent, array($ID, &$arFields))===false)
1507 return false;
1508
1509 if(self::isLocationProMigrated())
1510 {
1511 try
1512 {
1513 $locId = self::getLocationIdByCityId($ID);
1514
1515 if(!$locId)
1516 return false;
1517
1519 $locId,
1520 self::refineFieldsForSaveCRC($locId, $arFields),
1521 array('REBALANCE' => false)
1522 );
1523
1524 if($res->isSuccess())
1525 return $ID;
1526
1527 return false;
1528 }
1529 catch(Exception $e)
1530 {
1531 return false;
1532 }
1533 }
1534 else
1535 {
1536 $strUpdate = $DB->PrepareUpdate("b_sale_location_city", $arFields);
1537 $strSql = "UPDATE b_sale_location_city SET ".$strUpdate." WHERE ID = ".$ID."";
1538 $DB->Query($strSql);
1539
1540 $db_lang = CLangAdmin::GetList("sort", "asc", array("ACTIVE" => "Y"));
1541 while ($arLang = $db_lang->Fetch())
1542 {
1543 if ($arCntLang = CSaleLocation::GetCityLangByID($ID, $arLang["LID"]))
1544 {
1545 $strUpdate = $DB->PrepareUpdate("b_sale_location_city_lang", $arFields[$arLang["LID"]]);
1546 $strSql = "UPDATE b_sale_location_city_lang SET ".$strUpdate." WHERE ID = ".$arCntLang["ID"]."";
1547 }
1548 else
1549 {
1550 $arInsert = $DB->PrepareInsert("b_sale_location_city_lang", $arFields[$arLang["LID"]]);
1551 $strSql =
1552 "INSERT INTO b_sale_location_city_lang(CITY_ID, ".$arInsert[0].") ".
1553 "VALUES(".$ID.", ".$arInsert[1].")";
1554 }
1555 $DB->Query($strSql);
1556 }
1557 }
1558
1559 foreach (GetModuleEvents("sale", "OnCityUpdate", true) as $arEvent)
1561
1562 return $ID;
1563 }
1564
1565 public static function DeleteCity($ID)
1566 {
1567 // there is no such entity in terms of location 2.0, so... just delete old entity
1568
1569 global $DB;
1570 $ID = intval($ID);
1571
1572 foreach (GetModuleEvents("sale", "OnBeforeCityDelete", true) as $arEvent)
1573 if (ExecuteModuleEventEx($arEvent, array($ID))===false)
1574 return false;
1575
1576 if(self::isLocationProMigrated())
1577 {
1578 try
1579 {
1580 /*
1581 $locId = self::getLocationIdByCityId($ID);
1582
1583 if(!$locId)
1584 return false;
1585
1586 // just "unlink" it, so CSaleLocation::GetCityByID() wont able to find it
1587 $res = Location\LocationTable::update($locId, array(
1588 'CITY_ID' => ''
1589 ));
1590
1591 return $res->isSuccess();
1592 */
1593
1594 return true;
1595 }
1596 catch(Exception $e)
1597 {
1598 return false;
1599 }
1600 }
1601
1602 // and also drop old records, if any
1603 $DB->Query("DELETE FROM b_sale_location_city_lang WHERE CITY_ID = ".$ID."", true);
1604 $bDelete = $DB->Query("DELETE FROM b_sale_location_city WHERE ID = ".$ID."", true);
1605
1606 foreach (GetModuleEvents("sale", "OnCityDelete", true) as $arEvent)
1607 ExecuteModuleEventEx($arEvent, array($ID));
1608
1609 return $bDelete;
1610 }
1611
1612 public static function GetCityByID($ID)
1613 {
1614 if(self::isLocationProMigrated())
1615 {
1616 static $regionId;
1617
1618 try
1619 {
1620 if(!$regionId)
1621 {
1622 $params = array('select' => array());
1623 $res = \Bitrix\Sale\Location\TypeTable::getList(array('filter' => array('=CODE' => 'REGION'), 'select' => array('ID')))->fetch();
1624
1625 if($res['ID'])
1626 {
1627 $regionId = $res['ID'];
1628 }
1629 }
1630
1631 if($regionId)
1632 {
1633 $params['runtime'] = array(
1634 'P' => array(
1635 'data_type' => '\Bitrix\Sale\Location\Location',
1636 'reference' => array(
1637 '<=ref.LEFT_MARGIN' => 'this.LEFT_MARGIN',
1638 '>=ref.RIGHT_MARGIN' => 'this.RIGHT_MARGIN',
1639 '=ref.TYPE_ID' => array('?', $regionId)
1640 ),
1641 'join_type' => "left"
1642 )
1643 );
1644
1645 $params['select']['PREGION_ID'] = 'P.ID';
1646 }
1647
1648 $params['filter'] = array(
1649 '=TYPE.CODE' => 'CITY',
1650 '=ID' => intval($ID),
1651 '=NAME.LANGUAGE_ID' => 'en',
1652 );
1653
1654 $params['select'] = array_merge($params['select'], array(
1655 'ID',
1656 'LNAME' => 'NAME.NAME',
1657 'SHORT_NAME' => 'NAME.SHORT_NAME',
1658 ));
1659
1660 $res = \Bitrix\Sale\Location\LocationTable::getList($params);
1661 $res->addReplacedAliases(array('LNAME' => 'NAME', 'PREGION_ID' => 'REGION_ID'));
1662
1663 $item = $res->fetch();
1664
1665 if($item)
1666 {
1667 return $item;
1668 }
1669
1670 return false;
1671 }
1672 catch(Exception $e)
1673 {
1674 return false;
1675 }
1676 }
1677 else
1678 {
1679 global $DB;
1680
1681 $ID = intval($ID);
1682 $strSql =
1683 "SELECT * ".
1684 "FROM b_sale_location_city ".
1685 "WHERE ID = ".$ID." ";
1686 $db_res = $DB->Query($strSql);
1687
1688 if ($res = $db_res->Fetch())
1689 {
1690 return $res;
1691 }
1692 return False;
1693 }
1694 }
1695
1696 public static function GetCityLangByID($ID, $strLang = LANGUAGE_ID)
1697 {
1698 if(self::isLocationProMigrated())
1699 {
1700 try
1701 {
1702 $res = Location\LocationTable::getList(array(
1703 'filter' => array(
1704 '=TYPE.CODE' => 'CITY',
1705 '=ID' => intval($ID),
1706 'NAME.LANGUAGE_ID' => trim($strLang)
1707 ),
1708 'select' => array(
1709 'ID',
1710 'ID_' => 'NAME.ID',
1711 'LID' => 'NAME.LANGUAGE_ID',
1712 'LNAME' => 'NAME.NAME',
1713 'SHORT_NAME' => 'NAME.SHORT_NAME',
1714 )
1715 ));
1716 $res->addReplacedAliases(array('LNAME' => 'NAME'));
1717
1718 $item = $res->fetch();
1719
1720 if($item)
1721 {
1722 return array(
1723 'ID' => $item['ID_'],
1724 'CITY_ID' => $item['ID'],
1725 'LID' => $item['LID'],
1726 'NAME' => $item['LNAME'],
1727 'SHORT_NAME' => $item['SHORT_NAME'],
1728 );
1729 }
1730
1731 return false;
1732 }
1733 catch(Exception $e)
1734 {
1735 return false;
1736 }
1737 }
1738 else
1739 {
1740 global $DB;
1741
1742 $ID = intval($ID);
1743 $strLang = Trim($strLang);
1744
1745 $strSql =
1746 "SELECT * ".
1747 "FROM b_sale_location_city_lang ".
1748 "WHERE CITY_ID = ".$ID." ".
1749 " AND LID = '".$DB->ForSql($strLang, 2)."' ";
1750 $db_res = $DB->Query($strSql);
1751
1752 if ($res = $db_res->Fetch())
1753 {
1754 return $res;
1755 }
1756 return False;
1757 }
1758 }
1759
1761
1762 private static function processOrderForGetList($arOrder, $fieldMap = array(), $fieldProxy = array())
1763 {
1764 if(is_array($arOrder))
1765 {
1766 $arOrderParsed = array();
1767 $fieldProxy = array_flip($fieldProxy);
1768
1769 // parse order and stirp away unknown fields
1770 $arOrder = array_change_key_case($arOrder, CASE_UPPER);
1771 foreach($arOrder as $fld => $direction)
1772 {
1773 $direction = mb_strtoupper($direction);
1774
1775 if($direction != 'ASC' && $direction != 'DESC')
1776 continue;
1777
1778 if(isset($fieldProxy[$fld]))
1779 $fld = $fieldProxy[$fld];
1780
1781 if(!isset($fieldMap[$fld]))
1782 continue;
1783
1784 $fld = $fieldMap[$fld];
1785
1786 $arOrderParsed[$fld] = $direction;
1787 }
1788
1789 return $arOrderParsed;
1790 }
1791 else
1792 return false;
1793 }
1794
1795 public static function processFilterForGetList($arFilter, $fieldMap = array(), $fieldProxy = array(), $query = null)
1796 {
1797 if(is_array($arFilter))
1798 {
1799 $filterFieldsClean = array();
1800 $arFilterParsed = array();
1801 $pseudoFields = array();
1802 $fieldProxy = array_flip($fieldProxy);
1803
1804 $dbConnection = Main\HttpApplication::getConnection();
1805 $dbHelper = $dbConnection->getSqlHelper();
1806
1807 // parse filter and stirp away unknown fields
1808 $arFilter = array_change_key_case($arFilter, CASE_UPPER);
1809 foreach($arFilter as $fld => $value)
1810 {
1811 $fld = trim($fld);
1812 $fld = preg_replace(self::LEADING_TILDA_SEARCH_R, '', $fld);
1813
1814 $found = array();
1815 preg_match(self::MODIFIER_SEARCH_R, $fld, $found);
1816
1817 $modifier = $found[1] <> ''? $found[1] : '';
1818 $fldClean = preg_replace(self::MODIFIER_SEARCH_R, '', $fld);
1819
1820 if(isset($fieldProxy[$fldClean]))
1821 $fldClean = $fieldProxy[$fldClean];
1822
1823 if(!isset($fieldMap[$fldClean]))
1824 continue;
1825
1826 $fldClean = $fieldMap[$fldClean];
1827
1828 if($modifier == '+') // ORM does not understand + modifier in a filter
1829 {
1830 if($query != null)
1831 {
1832 // $value could be array or scalar
1833
1834 if(is_array($value))
1835 {
1836 foreach($value as $i => $v)
1837 {
1838 $value[$i] = "'".$dbHelper->forSql($v)."'";
1839 }
1840 $value = 'in ('.implode(', ', $value).')';
1841 }
1842 else
1843 $value = '= '.$dbHelper->forSql($value);
1844
1845 $query->registerRuntimeField('PLUS_'.$fldClean, array(
1846 'data_type' => 'integer',
1847 'expression' => array(
1848 "case when ((%s ".$value.") or (%s is null) or (%s = 0)) then 1 else 0 end",
1849 $fldClean,
1850 $fldClean,
1851 $fldClean
1852 )
1853 ));
1854 $arFilterParsed['=PLUS_'.$fldClean] = 1;
1855 }
1856
1857 continue;
1858 }
1859
1860 $arFilterParsed[$modifier.$fldClean] = $value;
1861 $filterFieldsClean[] = $fldClean;
1862 }
1863
1864 return array($arFilterParsed, $filterFieldsClean, $pseudoFields);
1865 }
1866 else
1867 return array(false, array(), array());
1868 }
1869
1870 public static function processSelectForGetList($arSelectFields, $fieldMap)
1871 {
1872 $selectFields = array();
1873 if(is_array($arSelectFields) && !empty($arSelectFields) && !in_array('*', $arSelectFields, true))
1874 {
1875 $arSelectFields = array_map("strtoupper", $arSelectFields);
1876 foreach($arSelectFields as $fld)
1877 {
1878 if(isset($fieldMap[$fld])) // legal one
1879 $selectFields[$fld] = $fieldMap[$fld];
1880 }
1881 }
1882 else
1883 $selectFields = $fieldMap;
1884
1885 $select = array();
1886 foreach($selectFields as $fldFrom => $fldTo)
1887 {
1888 if($fldFrom == $fldTo)
1889 $select[] = $fldTo;
1890 else
1891 $select[$fldFrom] = $fldTo;
1892 }
1893
1894 return $select;
1895 }
1896
1897 private static function proxyFieldsInResult($res, $fieldProxy = array())
1898 {
1899 if(!is_array($fieldProxy) || empty($fieldProxy))
1900 return $res;
1901
1902 $result = array();
1903 while($item = $res->fetch())
1904 {
1905 $pItem = array();
1906 foreach($item as $k => $v)
1907 {
1908 if(isset($fieldProxy[$k]))
1909 $pItem[$fieldProxy[$k]] = $v;
1910 else
1911 $pItem[$k] = $v;
1912 }
1913
1914 $result[] = $pItem;
1915 }
1916
1917 return new DB\ArrayResult($result);
1918 }
1919
1920 private static function stripModifiers($filter)
1921 {
1922 if(is_array($filter) && !empty($filter))
1923 {
1924 $result = array();
1925 foreach($filter as $k => $v)
1926 {
1927 $k = preg_replace(self::MODIFIER_SEARCH_R, '', $k);
1928 $result[$k] = $v;
1929 }
1930
1931 return $result;
1932 }
1933
1934 return $filter;
1935 }
1936
1938
1939 public static function getFilterForGetList($arFilter)
1940 {
1941 if(self::isLocationProMigrated())
1942 {
1943 $types = self::getTypes();
1944
1945 $arFilter['TYPE_ID'] = array();
1946
1947 if(intval($types['COUNTRY']))
1948 $arFilter['TYPE_ID'][] = intval($types['COUNTRY']);
1949
1950 if(intval($types['REGION']))
1951 $arFilter['TYPE_ID'][] = intval($types['REGION']);
1952
1953 if(intval($types['CITY']))
1954 $arFilter['TYPE_ID'][] = intval($types['CITY']);
1955 }
1956
1957 return $arFilter;
1958 }
1959
1960 public static function getFieldMapForGetList($arFilter)
1961 {
1962 global $DB;
1963
1964 $additionalFilterLCL = '';
1965 $additionalFilterLRL = '';
1966 $additionalFilterLGL = '';
1967 $siteId = (string)($arFilter['LID'] ?? '');
1968 if ($siteId !== '')
1969 {
1970 $siteId = $DB->ForSql($siteId, 2);
1971 if(self::isLocationProMigrated())
1972 {
1973 $additionalFilterLCL = " AND COL.LANGUAGE_ID = '".$siteId."'";
1974 $additionalFilterLRL = " AND REL.LANGUAGE_ID = '".$siteId."'";
1975 $additionalFilterLGL = " AND CIL.LANGUAGE_ID = '".$siteId."'";
1976 }
1977 else
1978 {
1979 $additionalFilterLCL = " AND LCL.LID = '".$siteId."'";
1980 $additionalFilterLRL = " AND LRL.LID = '".$siteId."'";
1981 $additionalFilterLGL = " AND LGL.LID = '".$siteId."'";
1982 }
1983 }
1984 if(self::isLocationProMigrated())
1985 {
1987
1988 // FIELDS -->
1989 $arFields = array(
1990
1991 "LOC_DEFAULT" => array("FIELD" => "CASE WHEN DEF.LOCATION_CODE IS NULL THEN 'N' ELSE 'Y' END", "TYPE" => "string", "FROM" => "LEFT JOIN ".$tableDefault." DEF ON (DEF.LOCATION_CODE = L.CODE)"),
1992
1993 /*
1994 COO = COuntry Original
1995 COL = Country Language
1996 REO = REgion Original
1997 REL = REgion Language
1998 CIO = CIty Original
1999 CIL = CIty Language
2000 */
2001
2002 // lang-independent
2003 "COUNTRY_NAME_ORIG" => array("FIELD" => "COO.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COO ON (L.COUNTRY_ID = COO.LOCATION_ID and COO.LANGUAGE_ID = 'en')"),
2004 "COUNTRY_SHORT_NAME" => array("FIELD" => "COO.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COO ON (L.COUNTRY_ID = COO.LOCATION_ID and COO.LANGUAGE_ID = 'en')"),
2005
2006 // lang-dependent
2007 "COUNTRY_NAME" => array("FIELD" => "COL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COL ON (L.COUNTRY_ID = COL.LOCATION_ID".$additionalFilterLCL.")"),
2008 "COUNTRY_LID" => array("FIELD" => "COL.LANGUAGE_ID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COL ON (L.COUNTRY_ID = COL.LOCATION_ID".$additionalFilterLCL.")"),
2009 "COUNTRY_NAME_LANG" => array("FIELD" => "COL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COL ON (L.COUNTRY_ID = COL.LOCATION_ID".$additionalFilterLCL.")"),
2010 "COUNTRY_SHORT_NAME_LANG" => array("FIELD" => "COL.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COL ON (L.COUNTRY_ID = COL.LOCATION_ID".$additionalFilterLCL.")"),
2011
2012
2013 // lang-independent
2014 "CITY_NAME_ORIG" => array("FIELD" => "CIO.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIO ON (L.CITY_ID = CIO.LOCATION_ID and CIO.LANGUAGE_ID = 'en')"),
2015 "CITY_SHORT_NAME" => array("FIELD" => "CIO.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIO ON (L.CITY_ID = CIO.LOCATION_ID and CIO.LANGUAGE_ID = 'en')"),
2016
2017 // lang-dependent
2018 "CITY_NAME" => array("FIELD" => "CIL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIL ON (L.CITY_ID = CIL.LOCATION_ID".$additionalFilterLGL.")"),
2019 "CITY_LID" => array("FIELD" => "CIL.LANGUAGE_ID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIL ON (L.CITY_ID = CIL.LOCATION_ID".$additionalFilterLGL.")"),
2020 "CITY_NAME_LANG" => array("FIELD" => "CIL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIL ON (L.CITY_ID = CIL.LOCATION_ID".$additionalFilterLGL.")"),
2021 "CITY_SHORT_NAME_LANG" => array("FIELD" => "CIL.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIL ON (L.CITY_ID = CIL.LOCATION_ID".$additionalFilterLGL.")"),
2022
2023
2024 // lang-independent
2025 "REGION_NAME_ORIG" => array("FIELD" => "REO.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REO ON (L.REGION_ID = REO.LOCATION_ID and REO.LANGUAGE_ID = 'en')"),
2026 "REGION_SHORT_NAME" => array("FIELD" => "REO.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REO ON (L.REGION_ID = REO.LOCATION_ID and REO.LANGUAGE_ID = 'en')"),
2027
2028 // lang-dependent
2029 "REGION_NAME" => array("FIELD" => "REL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REL ON (L.REGION_ID = REL.LOCATION_ID".$additionalFilterLRL.")"),
2030 "REGION_LID" => array("FIELD" => "REL.LANGUAGE_ID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REL ON (L.REGION_ID = REL.LOCATION_ID".$additionalFilterLRL.")"),
2031 "REGION_NAME_LANG" => array("FIELD" => "REL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REL ON (L.REGION_ID = REL.LOCATION_ID".$additionalFilterLRL.")"),
2032 "REGION_SHORT_NAME_LANG" => array("FIELD" => "REL.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REL ON (L.REGION_ID = REL.LOCATION_ID".$additionalFilterLRL.")"),
2033
2034 "COUNTRY" => array("FIELD" => "COL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name COL ON (L.COUNTRY_ID = COL.LOCATION_ID".$additionalFilterLCL.")"),
2035 "CITY" => array("FIELD" => "CIL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name CIL ON (L.CITY_ID = CIL.LOCATION_ID".$additionalFilterLGL.")"),
2036 "REGION" => array("FIELD" => "REL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_loc_name REL ON (L.REGION_ID = REL.LOCATION_ID".$additionalFilterLRL.")"),
2037
2038 "TYPE_ID" => array("FIELD" => "L.TYPE_ID", "TYPE" => "int")
2039 );
2040 }
2041 else
2042 {
2043
2044 // FIELDS -->
2045 $arFields = array(
2046
2047 "LOC_DEFAULT" => array("FIELD" => "L.LOC_DEFAULT", "TYPE" => "string"),
2048
2049 "COUNTRY_NAME_ORIG" => array("FIELD" => "LC.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country LC ON (L.COUNTRY_ID = LC.ID)"),
2050 "COUNTRY_SHORT_NAME" => array("FIELD" => "LC.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country LC ON (L.COUNTRY_ID = LC.ID)"),
2051
2052 "CITY_NAME_ORIG" => array("FIELD" => "LG.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city LG ON (L.CITY_ID = LG.ID)"),
2053 "CITY_SHORT_NAME" => array("FIELD" => "LG.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city LG ON (L.CITY_ID = LG.ID)"),
2054
2055 "REGION_NAME_ORIG" => array("FIELD" => "LR.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region LR ON (L.REGION_ID = LR.ID)"),
2056 "REGION_SHORT_NAME" => array("FIELD" => "LR.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region LR ON (L.REGION_ID = LR.ID)"),
2057
2058 "COUNTRY_LID" => array("FIELD" => "LCL.LID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country_lang LCL ON (L.COUNTRY_ID = LCL.COUNTRY_ID".$additionalFilterLCL.")"),
2059 "COUNTRY_NAME" => array("FIELD" => "LCL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country_lang LCL ON (L.COUNTRY_ID = LCL.COUNTRY_ID".$additionalFilterLCL.")"),
2060 "COUNTRY_NAME_LANG" => array("FIELD" => "LCL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country_lang LCL ON (L.COUNTRY_ID = LCL.COUNTRY_ID".$additionalFilterLCL.")"),
2061 "COUNTRY_SHORT_NAME_LANG" => array("FIELD" => "LCL.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country_lang LCL ON (L.COUNTRY_ID = LCL.COUNTRY_ID".$additionalFilterLCL.")"),
2062
2063 "REGION_LID" => array("FIELD" => "LRL.LID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region_lang LRL ON (L.REGION_ID = LRL.REGION_ID".$additionalFilterLRL.")"),
2064 "REGION_NAME" => array("FIELD" => "LRL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region_lang LRL ON (L.REGION_ID = LRL.REGION_ID".$additionalFilterLRL.")"),
2065 "REGION_NAME_LANG" => array("FIELD" => "LRL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region_lang LRL ON (L.REGION_ID = LRL.REGION_ID".$additionalFilterLRL.")"),
2066 "REGION_SHORT_NAME_LANG" => array("FIELD" => "LRL.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region_lang LRL ON (L.REGION_ID = LRL.REGION_ID".$additionalFilterLRL.")"),
2067
2068 "CITY_LID" => array("FIELD" => "LGL.LID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city_lang LGL ON (L.CITY_ID = LGL.CITY_ID".$additionalFilterLGL.")"),
2069 "CITY_NAME" => array("FIELD" => "LGL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city_lang LGL ON (L.CITY_ID = LGL.CITY_ID".$additionalFilterLGL.")"),
2070 "CITY_NAME_LANG" => array("FIELD" => "LGL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city_lang LGL ON (L.CITY_ID = LGL.CITY_ID".$additionalFilterLGL.")"),
2071 "CITY_SHORT_NAME_LANG" => array("FIELD" => "LGL.SHORT_NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city_lang LGL ON (L.CITY_ID = LGL.CITY_ID".$additionalFilterLGL.")"),
2072
2073 "COUNTRY" => array("FIELD" => "LCL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_country_lang LCL ON (L.COUNTRY_ID = LCL.COUNTRY_ID".$additionalFilterLCL.")"),
2074 "CITY" => array("FIELD" => "LGL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_city_lang LGL ON (L.CITY_ID = LGL.CITY_ID".$additionalFilterLGL.")"),
2075 "REGION" => array("FIELD" => "LRL.NAME", "TYPE" => "string", "FROM" => "LEFT JOIN b_sale_location_region_lang LRL ON (L.REGION_ID = LRL.REGION_ID".$additionalFilterLRL.")")
2076 );
2077
2078 }
2079
2080 return array_merge(array(
2081 "ID" => array("FIELD" => "L.ID", "TYPE" => "int"),
2082 "CODE" => array("FIELD" => "L.CODE", "TYPE" => "string"),
2083 "COUNTRY_ID" => array("FIELD" => "L.COUNTRY_ID", "TYPE" => "int"),
2084 "CITY_ID" => array("FIELD" => "L.CITY_ID", "TYPE" => "int"),
2085 "REGION_ID" => array("FIELD" => "L.REGION_ID", "TYPE" => "int"),
2086 "SORT" => array("FIELD" => "L.SORT", "TYPE" => "int")
2087 ), $arFields);
2088 }
2089
2090 protected static function getNameOfParentOfType($item, $typeCode, $strLang = LANGUAGE_ID)
2091 {
2092 /*
2093 $item = Location\LocationTable::getList(array('filter' => array(
2094 '<=LEFT_MARGIN' => $item['LEFT_MARGIN'],
2095 '>=RIGHT_MARGIN' => $item['RIGHT_MARGIN'],
2096 '=TYPE.CODE' => $typeCode,
2097 '=NAME.LANGUAGE_ID' => $strLang
2098 ), 'select' => array(
2099 ToUpper($typeCode).'_NAME' => 'NAME.NAME',
2100 ToUpper($typeCode).'_NAME_ORIG' => 'NAME.NAME',
2101 ToUpper($typeCode).'_SHORT_NAME' => 'NAME.SHORT_NAME',
2102 ToUpper($typeCode).'_NAME_LANG' => 'NAME.LANGUAGE_ID'
2103 )))->fetch();
2104 */
2105
2106 global $DB;
2107
2108 $dbConnection = Main\HttpApplication::getConnection();
2109 $dbHelper = $dbConnection->getSqlHelper();
2110
2111 $types = self::getTypes();
2112 $typeCode = mb_strtoupper($dbHelper->forSql($typeCode));
2113 $strLang = mb_substr($dbHelper->forSql($strLang), 0, 2);
2114
2115 $mappedTypes = array("'".intval($types[$typeCode])."'");
2116
2117 if($typeCode == 'CITY' && intval($types['VILLAGE'])) // VILLAGE is also can be CITY in the old terms
2118 {
2119 $mappedTypes[] = "'".intval($types['VILLAGE'])."'";
2120 }
2121
2122 $query = "
2123 select
2124 N.NAME as ".$typeCode."_NAME,
2125 N.SHORT_NAME as ".$typeCode."_SHORT_NAME,
2126 L.ID as ".$typeCode."_ID
2127 from
2128 b_sale_loc_name N
2129 inner join b_sale_location L on
2130 N.LOCATION_ID = L.ID
2131 and
2132 N.LANGUAGE_ID = '".$strLang."'
2133 and
2134 L.LEFT_MARGIN <= '".intval($item['LEFT_MARGIN'])."'
2135 and
2136 L.RIGHT_MARGIN >= '".intval($item['RIGHT_MARGIN'])."'
2137 and
2138 L.TYPE_ID in (".implode(', ', $mappedTypes).")
2139 ";
2140
2141 $item = $DB->query($query)->fetch();
2142 if(!is_array($item))
2143 {
2144 return [];
2145 }
2146
2147 $item[$typeCode.'_NAME_ORIG'] = $item[$typeCode.'_NAME'];
2148 $item[$typeCode.'_NAME_LANG'] = $item[$typeCode.'_NAME'];
2149
2150 return $item;
2151 }
2152
2153 protected static $city2RegionMap = array(
2154 '0000073738' => '0000028025', // moscow => moskovskaya oblast
2155 '0000103664' => '0000028043', // stpetersburg => leningradskaya oblast
2156 );
2157
2158 protected static $specialCities = array('MOSCOW', 'STPETERSBURG');
2159
2160 public static function GetByIDForLegacyDelivery($primary, $strLang = LANGUAGE_ID)
2161 {
2162 $primary = trim($primary);
2163 $regLoc = false;
2164
2165 $loc = CSaleLocation::GetByID($primary, $strLang);
2166
2167 $noRegion = empty($loc);
2168 if (!$noRegion)
2169 {
2170 $noRegion = (int)($loc['REGION_ID'] ?? 0) <= 0;
2171 }
2172
2173 if ($noRegion) // no region
2174 {
2175 if(isset(self::$city2RegionMap[(string) $primary])) // got CODE and this code in The List
2176 {
2177 $regLoc = CSaleLocation::GetByID(self::$city2RegionMap[(string) $primary], $strLang);
2178 }
2179 elseif(!empty($loc['CODE']) && !empty(self::$city2RegionMap[(string) $loc['CODE']]))
2180 {
2181 $regLoc = CSaleLocation::GetByID(self::$city2RegionMap[(string) $loc['CODE']], $strLang);
2182 }
2183 elseif (!empty($loc))
2184 {
2185 $nameNang = (string)($loc['CITY_NAME_LANG'] ?? '');
2186
2187 if ($nameNang !== '') // search by name
2188 {
2189 $name = mb_strtoupper(trim($loc['CITY_NAME_LANG']));
2190 $regionName = false;
2191
2192 foreach (self::$specialCities as $city)
2193 {
2194 if ($name == mb_strtoupper(GetMessage('CITY_' . $city)))
2195 {
2196 $regionName = GetMessage('REGION_' . $city);
2197 }
2198 }
2199
2200 if ($regionName !== false)
2201 {
2202 $regLoc = CSaleLocation::GetList(
2203 false,
2204 ['~REGION_NAME_LANG' => $regionName . '%', 'LID' => $strLang],
2205 false,
2206 ['nTopCount' => 1],
2207 ['REGION_ID', 'REGION_NAME', 'REGION_SHORT_NAME', 'REGION_NAME_ORIG', 'REGION_NAME_LANG']
2208 )->fetch();
2209 }
2210 }
2211 }
2212 }
2213
2214 if($regLoc !== false)
2215 {
2216 if(intval($regLoc['REGION_ID']))
2217 {
2218 $loc['REGION_ID'] = $regLoc['REGION_ID'];
2219 $loc['REGION_NAME'] = $regLoc['REGION_NAME'];
2220 $loc['REGION_SHORT_NAME'] = $regLoc['REGION_SHORT_NAME'];
2221 $loc['REGION_NAME_ORIG'] = $regLoc['REGION_NAME_ORIG'];
2222 $loc['REGION_NAME_LANG'] = $regLoc['REGION_NAME_LANG'];
2223 }
2224 }
2225
2226 return $loc;
2227 }
2228
2229 public static function GetByID($primary, $strLang = LANGUAGE_ID)
2230 {
2231 if($primary == '')
2232 return false;
2233
2234 try
2235 {
2236 // try code
2237 $item = Location\LocationTable::getList(array('filter' => array(
2238 array('=CODE' => $primary)
2239 ), 'select' =>
2240 array('ID', 'SORT', 'LEFT_MARGIN', 'RIGHT_MARGIN', 'CODE')
2241 ))->fetch();
2242
2243 if(!is_array($item))
2244 {
2245 // try id
2246 $item = Location\LocationTable::getList(array('filter' => array(
2247 array('=ID' => $primary)
2248 ), 'select' =>
2249 array('ID', 'SORT', 'LEFT_MARGIN', 'RIGHT_MARGIN', 'CODE')
2250 ))->fetch();
2251 }
2252 }
2253 catch(\Exception $e)
2254 {
2255 return false;
2256 }
2257
2258 if(!is_array($item) || !intval($item['ID']))
2259 return false;
2260
2261 $country = self::getNameOfParentOfType($item, 'COUNTRY', $strLang);
2262 $region = self::getNameOfParentOfType($item, 'REGION', $strLang);
2263 $city = self::getNameOfParentOfType($item, 'CITY', $strLang);
2264
2265 $item = array_merge($item, $country, $region, $city);
2266
2267 unset($item['LEFT_MARGIN']);
2268 unset($item['RIGHT_MARGIN']);
2269
2270 return $item;
2271 }
2272
2273 public static function LocationCheckFields($ACTION, &$arFields)
2274 {
2275 global $DB;
2276
2277 if ((is_set($arFields, "SORT") || $ACTION=="ADD") && intval($arFields["SORT"])<=0) $arFields["SORT"] = 100;
2278 if (is_set($arFields, "COUNTRY_ID")) $arFields["COUNTRY_ID"] = intval($arFields["COUNTRY_ID"]);
2279 if (is_set($arFields, "CITY_ID")) $arFields["CITY_ID"] = intval($arFields["CITY_ID"]);
2280
2281 return True;
2282 }
2283
2284 public static function UpdateLocation($ID, $arFields)
2285 {
2286 // it seems that method is okay... we probably want to move region and city as it set in $arFields, but then we`ll have to adjsut the rest of locations
2287
2288 global $DB;
2289
2290 $ID = intval($ID);
2291
2292 if ($ID <= 0 || !CSaleLocation::LocationCheckFields("UPDATE", $arFields))
2293 return false;
2294
2295 foreach (GetModuleEvents("sale", "OnBeforeLocationUpdate", true) as $arEvent)
2296 if (ExecuteModuleEventEx($arEvent, array($ID, &$arFields))===false)
2297 return false;
2298
2299 $strUpdate = $DB->PrepareUpdate("b_sale_location", $arFields);
2300 $strSql = "UPDATE b_sale_location SET ".$strUpdate." WHERE ID = ".$ID."";
2301 $DB->Query($strSql);
2302
2303 foreach (GetModuleEvents("sale", "OnLocationUpdate", true) as $arEvent)
2305
2306 return $ID;
2307 }
2308
2309 public static function CheckFields($ACTION, &$arFields)
2310 {
2311 global $DB;
2312
2313 if (is_set($arFields, "CHANGE_COUNTRY") && $arFields["CHANGE_COUNTRY"]!="Y")
2314 $arFields["CHANGE_COUNTRY"] = "N";
2315 if (is_set($arFields, "WITHOUT_CITY") && $arFields["WITHOUT_CITY"]!="Y")
2316 $arFields["WITHOUT_CITY"] = "N";
2317
2318 if (is_set($arFields, "COUNTRY_ID"))
2319 $arFields["COUNTRY_ID"] = trim($arFields["COUNTRY_ID"]);
2320 // $arFields["COUNTRY_ID"] = IntVal($arFields["COUNTRY_ID"]);
2321
2322 if (is_set($arFields, "CHANGE_COUNTRY") && $arFields["CHANGE_COUNTRY"]=="Y"
2323 && (!is_set($arFields, "COUNTRY_ID") || $arFields["COUNTRY_ID"]<=0))
2324 return false;
2325
2326 return True;
2327 }
2328
2329 private static function AddLocationPart($creat, $type, $parent, $sort)
2330 {
2331 $langs = self::getLanguages();
2332 $types = self::getTypes();
2333
2334 $creatFlds = array();
2335 if(is_numeric($creat))
2336 {
2337
2338 // check whether location exists...
2339 $res = Location\LocationTable::getList(array('filter' => array('='.$type.'_ID' => $creat, 'TYPE_ID' => $types[$type]), 'select' => array('ID'), 'limit' => 1))->fetch();
2340 if($res['ID'])
2341 {
2342 $parent = intval($res['ID']);
2343 }
2344 else
2345 {
2346 if($type == 'COUNTRY')
2347 $res = self::GetCountryByID($creat);
2348 elseif($type == 'REGION')
2349 $res = self::GetRegionByID($creat);
2350 elseif($type == 'CITY')
2351 $res = self::GetCityByID($creat);
2352
2353 if(!$res) // no such type exists, smth strange
2354 throw new Exception('No such '.$type);
2355
2356 // create location using type found
2357 $creatFlds[$type.'_ID'] = $res['ID'];
2358
2359 $creatFlds['NAME'] = array();
2360 foreach($langs as $lid)
2361 {
2362 if($type == 'COUNTRY')
2363 $name = self::GetCountryLangByID($res['ID'], $lid);
2364 elseif($type == 'REGION')
2365 $name = self::GetRegionLangByID($res['ID'], $lid);
2366 elseif($type == 'CITY')
2367 $name = self::GetCityLangByID($res['ID'], $lid);
2368
2369 $creatFlds['NAME'][$lid] = array(
2370 'NAME' => $name['NAME'],
2371 'SHORT_NAME' => $name['SHORT_NAME']
2372 );
2373 }
2374 }
2375 }
2376 elseif(is_array($creat)) // should create type
2377 {
2378 $creatFlds[$type.'_ID'] = self::getFreeId($type);
2379 $creatFlds['NAME'] = array();
2380
2381 foreach($creat as $lid => $name)
2382 {
2383 $creatFlds['NAME'][$lid] = array(
2384 'NAME' => $name['NAME'],
2385 'SHORT_NAME' => $name['SHORT_NAME']
2386 );
2387 }
2388 }
2389
2390 if(!empty($creatFlds))
2391 {
2392 $creatFlds['PARENT_ID'] = $parent;
2393 $creatFlds['TYPE_ID'] = $types[$type];
2394
2395 $creatFlds['CODE'] = rand(999,99999999);
2396
2397 if($sort !== false)
2398 $creatFlds['SORT'] = $sort;
2399
2400 $res = Location\LocationTable::add($creatFlds);
2401 if(!$res->isSuccess())
2402 throw new Exception('Cannot add location');
2403
2404 $parent = $res->getId();
2405 Location\LocationTable::update($parent, array('CODE' => $parent));
2406 }
2407
2408 return $parent;
2409 }
2410
2411 public static function Add($arFields)
2412 {
2413 global $DB;
2414
2416 return false;
2417
2418 if(self::isLocationProMigrated())
2419 {
2420 try
2421 {
2422 $country = self::getTypeValueToStore('COUNTRY', $arFields);
2423 $region = self::getTypeValueToStore('REGION', $arFields);
2424 $city = self::getTypeValueToStore('CITY', $arFields);
2425
2426 // Let`s treat a location 1.0 structure as a static structure where you can not move nodes up\down
2427 // along a tree by passing just IDs in triplets like (COUNTRY_ID, REGION_ID, CITY_ID).
2428 // Then parse out some meaningless situations to preserve tree integrity:
2429
2430 // you cann not add existing region to a non-existing country
2431 if($region && is_numeric($region) && $country && is_array($country))
2432 throw new Exception;
2433
2434 // you cann not add existing city to a non-existing country
2435 if($city && is_numeric($city) && $country && is_array($country))
2436 throw new Exception;
2437
2438 // you cann not add existing city to a non-existing region
2439 if($city && is_numeric($city) && $region && is_array($region))
2440 throw new Exception;
2441
2442 $parent = 0;
2443 $sort = isset($arFields['SORT']) ? intval($arFields['SORT']) : false;
2444
2445 if($country)
2446 {
2447 $parent = self::AddLocationPart($country, 'COUNTRY', $parent, $sort);
2448 }
2449
2450 if($region)
2451 {
2452 $parent = self::AddLocationPart($region, 'REGION', $parent, $sort);
2453 }
2454
2455 if($city)
2456 {
2457 $parent = self::AddLocationPart($city, 'CITY', $parent, $sort);
2458 }
2459
2460 return $parent;
2461 }
2462 catch(Exception $e)
2463 {
2464 return false;
2465 }
2466 }
2467 else
2468 {
2469
2470 if ((!is_set($arFields, "COUNTRY_ID") || intval($arFields["COUNTRY_ID"])<=0) && $arFields["COUNTRY_ID"] <> '')
2471 {
2472 $arFields["COUNTRY_ID"] = CSaleLocation::AddCountry($arFields["COUNTRY"]);
2473 if (intval($arFields["COUNTRY_ID"])<=0) return false;
2474
2475 if ($arFields["WITHOUT_CITY"]!="Y" && $arFields["REGION_ID"] == '')
2476 {
2477 UnSet($arFields["CITY_ID"]);
2479 }
2480 }
2481
2482 if ($arFields["REGION_ID"] <= 0 && $arFields["REGION_ID"] != "")
2483 {
2484 $arFields["REGION_ID"] = CSaleLocation::AddRegion($arFields["REGION"]);
2485 if (intval($arFields["REGION_ID"])<=0) return false;
2486
2487 if ($arFields["WITHOUT_CITY"] != "Y")
2488 {
2489 //$arFieldsTmp = $arFields;
2490 UnSet($arFields["CITY_ID"]);
2492 }
2493 }
2494 elseif ($arFields["REGION_ID"] == '')
2495 {
2496 UnSet($arFields["REGION_ID"]);
2497 }
2498
2499 if ($arFields["WITHOUT_CITY"]!="Y")
2500 {
2501 if (intval($arFields["REGION_ID"]) > 0)
2502 $arFields["CITY"]["REGION_ID"] = $arFields["REGION_ID"];
2503 $arFields["CITY_ID"] = CSaleLocation::AddCity($arFields["CITY"]);
2504 if (intval($arFields["CITY_ID"])<=0) return false;
2505 }
2506 else
2507 {
2508 UnSet($arFields["CITY_ID"]);
2509 }
2510
2512
2513 return $ID;
2514
2515 }
2516 }
2517
2518 public static function Update($ID, $arFields)
2519 {
2520 global $DB;
2521
2522 if (!CSaleLocation::CheckFields("UPDATE", $arFields)) return false;
2523
2524 if (!($arLocRes = CSaleLocation::GetByID($ID, LANGUAGE_ID))) return false;
2525
2526 if(self::isLocationProMigrated())
2527 {
2528 try
2529 {
2530 // only partial support: name update functionality
2531
2532 if(($arFields["CHANGE_COUNTRY"]=="Y" || intval($arFields["COUNTRY_ID"])) && is_array($arFields["COUNTRY"]))
2533 CSaleLocation::UpdateCountry($arFields["COUNTRY_ID"], $arFields["COUNTRY"]);
2534
2535 if(intval($arFields["REGION_ID"]) && is_array($arFields["REGION"]))
2536 CSaleLocation::UpdateRegion($arFields["REGION_ID"], $arFields["REGION"]);
2537
2538 if(intval($arFields["CITY_ID"]) && is_array($arFields["CITY"]))
2539 CSaleLocation::UpdateCity($arFields["CITY_ID"], $arFields["CITY"]);
2540 }
2541 catch(Exception $e)
2542 {
2543 return false;
2544 }
2545 }
2546 else
2547 {
2548 if ((!is_set($arFields, "COUNTRY_ID") || intval($arFields["COUNTRY_ID"])<=0) && $arFields["COUNTRY_ID"] != "")
2549 {
2550 $arFields["COUNTRY_ID"] = CSaleLocation::AddCountry($arFields["COUNTRY"]);
2551 if (intval($arFields["COUNTRY_ID"])<=0) return false;
2552
2553 UnSet($arFields["CITY_ID"]);
2554 UnSet($arFields["REGION_ID"]);
2556 }
2557 elseif ($arFields["CHANGE_COUNTRY"]=="Y" || $arFields["COUNTRY_ID"] == "")
2558 {
2559 CSaleLocation::UpdateCountry($arFields["COUNTRY_ID"], $arFields["COUNTRY"]);
2560 }
2561
2562 //city
2563 if ($arFields["WITHOUT_CITY"]!="Y")
2564 {
2565 if (intval($arLocRes["CITY_ID"])>0)
2566 {
2567 CSaleLocation::UpdateCity(intval($arLocRes["CITY_ID"]), $arFields["CITY"]);
2568 }
2569 else
2570 {
2571 $arFields["CITY_ID"] = CSaleLocation::AddCity($arFields["CITY"]);
2572 if (intval($arFields["CITY_ID"])<=0) return false;
2573 }
2574 }
2575 else
2576 {
2577 CSaleLocation::DeleteCity($arLocRes["CITY_ID"]);
2578 $arFields["CITY_ID"] = false;
2579 }
2580
2581 //region
2582 if (intval($arFields["REGION_ID"])>0)
2583 {
2584 CSaleLocation::UpdateRegion(intval($arLocRes["REGION_ID"]), $arFields["REGION"]);
2585 }
2586 elseif ($arFields["REGION_ID"] == 0 && $arFields["REGION_ID"] != '')
2587 {
2588 $db_res = CSaleLocation::GetRegionList(array("ID" => "DESC"), array("NAME" => $arFields["REGION"][LANGUAGE_ID]["NAME"]));
2589 $arRegion = $db_res->Fetch();
2590
2591 if (count($arRegion) > 1)
2592 $arFields["REGION_ID"] = $arRegion["ID"];
2593 else
2594 {
2595 $arFields["REGION_ID"] = CSaleLocation::AddRegion($arFields["REGION"]);
2596 if (intval($arFields["REGION_ID"])<=0)
2597 return false;
2598
2599 $arFieldsTmp = $arFields;
2600 UnSet($arFieldsTmp["CITY_ID"]);
2601 CSaleLocation::AddLocation($arFieldsTmp);
2602 }
2603 }
2604 elseif ($arFields["REGION_ID"] == '')
2605 {
2606 //CSaleLocation::DeleteRegion($arLocRes["REGION_ID"]);
2607 $arFields["REGION_ID"] = 0;
2608 }
2609 else
2610 {
2611 UnSet($arFields["REGION_ID"]);
2612 }
2613
2615
2616 return $ID;
2617 }
2618 }
2619
2620 // ???
2621 public static function Delete($ID)
2622 {
2623 global $DB;
2624 $ID = intval($ID);
2625
2626 if (!($arLocRes = CSaleLocation::GetByID($ID, LANGUAGE_ID)))
2627 return false;
2628
2629 foreach (GetModuleEvents("sale", "OnBeforeLocationDelete", true) as $arEvent)
2630 if (ExecuteModuleEventEx($arEvent, array($ID))===false)
2631 return false;
2632
2633 if (intval($arLocRes["CITY_ID"]) > 0)
2634 CSaleLocation::DeleteCity($arLocRes["CITY_ID"]);
2635
2636 $bDelCountry = True;
2638 array("SORT" => "ASC"),
2639 array("COUNTRY_ID" => $arLocRes["COUNTRY_ID"], "!ID"=>$ID),
2640 LANGUAGE_ID
2641 );
2642 if ($db_res->Fetch())
2643 $bDelCountry = false;
2644
2645 if ($bDelCountry && intval($arLocRes["COUNTRY_ID"]) > 0)
2646 CSaleLocation::DeleteCountry($arLocRes["COUNTRY_ID"]);
2647
2648 $bDelRegion = True;
2650 array("SORT" => "ASC"),
2651 array("REGION_ID" => $arLocRes["REGION_ID"], "!ID"=>$ID),
2652 LANGUAGE_ID
2653 );
2654 if ($db_res->Fetch())
2655 $bDelRegion = false;
2656
2657 if ($bDelRegion && intval($arLocRes["REGION_ID"]) > 0)
2658 CSaleLocation::DeleteRegion($arLocRes["REGION_ID"]);
2659
2660 $DB->Query("DELETE FROM b_sale_location2location_group WHERE LOCATION_ID = ".$ID."", true);
2661 $DB->Query("DELETE FROM b_sale_delivery2location WHERE LOCATION_ID = ".$ID." AND LOCATION_TYPE = 'L'", true);
2662 $DB->Query("DELETE FROM b_sale_location_zip WHERE LOCATION_ID = ".$ID."", true);
2663
2664 if(self::isLocationProMigrated())
2665 {
2666 try
2667 {
2668 $res = Location\LocationTable::delete($ID); // the whole subtree will be deleted
2669 if(!$res->isSuccess())
2670 return false;
2671
2672 $bDelete = true;
2673 }
2674 catch(Exception $e)
2675 {
2676 return false;
2677 }
2678 }
2679 else
2680 {
2681 $bDelete = $DB->Query("DELETE FROM b_sale_location WHERE ID = ".$ID."", true);
2682 }
2683
2684 foreach (GetModuleEvents("sale", "OnLocationDelete", true) as $arEvent)
2685 ExecuteModuleEventEx($arEvent, array($ID));
2686
2687 return $bDelete;
2688 }
2689
2690 public static function OnLangDelete($strLang)
2691 {
2692 global $DB;
2693
2694 if(self::isLocationProMigrated())
2695 {
2696 $DB->Query("DELETE FROM ".Location\Name\LocationTable::getTableName()." WHERE LANGUAGE_ID = '".$DB->ForSql($strLang)."'", true);
2697 $DB->Query("DELETE FROM ".Location\Name\TypeTable::getTableName()." WHERE LANGUAGE_ID = '".$DB->ForSql($strLang)."'", true);
2698 $DB->Query("DELETE FROM ".Location\Name\GroupTable::getTableName()." WHERE LANGUAGE_ID = '".$DB->ForSql($strLang)."'", true);
2699 }
2700
2701 $DB->Query("DELETE FROM b_sale_location_city_lang WHERE LID = '".$DB->ForSql($strLang)."'", true);
2702 $DB->Query("DELETE FROM b_sale_location_country_lang WHERE LID = '".$DB->ForSql($strLang)."'", true);
2703
2704 return true;
2705 }
2706
2707 public static function DeleteAll()
2708 {
2709 global $DB;
2710
2711 foreach (GetModuleEvents("sale", "OnBeforeLocationDeleteAll", true) as $arEvent)
2712 if (ExecuteModuleEventEx($arEvent)===false)
2713 return false;
2714
2715 if(self::isLocationProMigrated())
2716 {
2717 //main
2718 $DB->Query("DELETE FROM ".Location\LocationTable::getTableName());
2719 $DB->Query("DELETE FROM ".Location\GroupTable::getTableName());
2720 $DB->Query("DELETE FROM ".Location\TypeTable::getTableName());
2721
2722 //names
2723 $DB->Query("DELETE FROM ".Location\Name\LocationTable::getTableName());
2724 $DB->Query("DELETE FROM ".Location\Name\GroupTable::getTableName());
2725 $DB->Query("DELETE FROM ".Location\Name\TypeTable::getTableName());
2726
2727 //links
2728 $DB->Query("DELETE FROM ".Location\GroupLocationTable::getTableName());
2729 $DB->Query("DELETE FROM ".Location\SiteLocationTable::getTableName());
2730 $DB->Query("DELETE FROM ".Delivery\DeliveryLocationTable::getTableName());
2731
2732 //other
2733 $DB->Query("DELETE FROM ".Location\DefaultSiteTable::getTableName());
2734 $DB->Query("DELETE FROM ".Location\ExternalTable::getTableName());
2735 $DB->Query("DELETE FROM ".Location\ExternalServiceTable::getTableName());
2736 }
2737
2738 $DB->Query("DELETE FROM b_sale_location2location_group");
2739 $DB->Query("DELETE FROM b_sale_location_group_lang");
2740 $DB->Query("DELETE FROM b_sale_location_group");
2741
2742 $DB->Query("DELETE FROM b_sale_delivery2location");
2743 $DB->Query("DELETE FROM b_sale_location");
2744
2745 $DB->Query("DELETE FROM b_sale_location_city_lang");
2746 $DB->Query("DELETE FROM b_sale_location_city");
2747
2748 $DB->Query("DELETE FROM b_sale_location_country_lang");
2749 $DB->Query("DELETE FROM b_sale_location_country");
2750
2751 $DB->Query("DELETE FROM b_sale_location_region_lang");
2752 $DB->Query("DELETE FROM b_sale_location_region");
2753
2754 $DB->Query("DELETE FROM b_sale_location_zip");
2755
2756 foreach (GetModuleEvents("sale", "OnLocationDeleteAll", true) as $arEvent)
2757 ExecuteModuleEventEx($arEvent);
2758
2759 }
2760
2761 public static function GetLocationZIP($location)
2762 {
2763 if(self::isLocationProMigrated())
2764 {
2765 try
2766 {
2767 if(!intval($location))
2768 throw new Exception();
2769
2770 return Location\ExternalTable::getList(array(
2771 'filter' => array(
2772 '=SERVICE.CODE' => self::ZIP_EXT_SERVICE_CODE,
2773 '=LOCATION_ID' => $location
2774 ),
2775 'select' => array(
2776 'ID',
2777 'ZIP' => 'XML_ID'
2778 )
2779 ));
2780 }
2781 catch(Exception $e)
2782 {
2783 return new DB\ArrayResult(array());
2784 }
2785 }
2786 else
2787 {
2788 global $DB;
2789
2790 return $DB->Query("SELECT ZIP FROM b_sale_location_zip WHERE LOCATION_ID='".$DB->ForSql($location)."'");
2791 }
2792 }
2793
2794 public static function GetByZIP($zip)
2795 {
2796 if(self::isLocationProMigrated())
2797 {
2798 try
2799 {
2800 if($zip == '')
2801 throw new Exception();
2802
2803 $res = Location\ExternalTable::getList(array(
2804 'filter' => array(
2805 '=SERVICE.CODE' => self::ZIP_EXT_SERVICE_CODE,
2806 '=XML_ID' => $zip
2807 ),
2808 'select' => array(
2809 'LOCATION_ID',
2810 ),
2811 'limit' => 1
2812 ));
2813
2814 if($item = $res->fetch())
2815 return self::GetByID($item['LOCATION_ID']);
2816 else
2817 return false;
2818 }
2819 catch(Exception $e)
2820 {
2821 return false;
2822 }
2823 }
2824 else
2825 {
2826 global $DB;
2827
2828 $dbRes = $DB->Query('SELECT LOCATION_ID FROM b_sale_location_zip WHERE ZIP=\''.$DB->ForSql($zip).'\'');
2829 if ($arRes = $dbRes->Fetch())
2830 return CSaleLocation::GetByID($arRes['LOCATION_ID']);
2831 else
2832 return false;
2833 }
2834 }
2835
2836 public static function ClearLocationZIP($location)
2837 {
2838 global $DB;
2839
2840 if(self::isLocationProMigrated())
2841 {
2842 $DB->Query("DELETE FROM ".Location\ExternalTable::getTableName()." WHERE LOCATION_ID='".$DB->ForSql($location)."'");
2843 }
2844 else
2845 {
2846 $query = "DELETE FROM b_sale_location_zip WHERE LOCATION_ID='".$DB->ForSql($location)."'";
2847 $DB->Query($query);
2848
2849 return;
2850 }
2851 }
2852
2853 public static function ClearAllLocationZIP()
2854 {
2855 global $DB;
2856
2857 if(self::isLocationProMigrated())
2858 {
2859 $DB->Query("DELETE FROM ".Location\ExternalTable::getTableName());
2860 }
2861 else
2862 {
2863 $DB->Query("DELETE FROM b_sale_location_zip");
2864 }
2865 }
2866
2867 public static function AddLocationZIP($location, $ZIP, $bSync = false)
2868 {
2869 if(self::isLocationProMigrated())
2870 {
2871 try
2872 {
2873 if($bSync)
2874 {
2875 $res = Location\ExternalTable::getList(array(
2876 'filter' => array(
2877 '=SERVICE.CODE' => self::ZIP_EXT_SERVICE_CODE,
2878 '=XML_ID' => $ZIP,
2879 '=LOCATION_ID' => $location
2880 ),
2881 'select' => array(
2882 'ID',
2883 ),
2884 'limit' => 1
2885 ))->fetch();
2886
2887 if($res)
2888 {
2889 if(!Location\ExternalTable::update($res['ID'], array(
2890 'LOCATION_ID' => $location,
2891 'XML_ID' => $ZIP
2892 ))->isSuccess())
2893 {
2894 $bSync = false;
2895 }
2896 }
2897 }
2898
2899 if(!$bSync)
2900 {
2901 $zipId = self::getZipId();
2902 if($zipId)
2903 {
2904 Location\ExternalTable::add(array(
2905 'LOCATION_ID' => $location,
2906 'XML_ID' => $ZIP,
2907 'SERVICE_ID' => $zipId
2908 ));
2909 }
2910 }
2911 }
2912 catch(Exception $e)
2913 {
2914 return new DB\ArrayResult(array());
2915 }
2916 }
2917 else
2918 {
2919 global $DB;
2920
2921 $arInsert = array(
2922 "LOCATION_ID" => intval($location),
2923 "ZIP" => intval($ZIP),
2924 );
2925
2926 if ($bSync)
2927 {
2928 $cnt = $DB->Update(
2929 'b_sale_location_zip',
2930 $arInsert,
2931 "WHERE LOCATION_ID='".$arInsert["LOCATION_ID"]."' AND ZIP='".$arInsert["ZIP"]."'"
2932 );
2933
2934 if ($cnt <= 0)
2935 {
2936 $bSync = false;
2937 }
2938 }
2939
2940 if (!$bSync)
2941 {
2942 $DB->Insert('b_sale_location_zip', $arInsert);
2943 }
2944
2945 return;
2946 }
2947 }
2948
2949 public static function SetLocationZIP($location, $arZipList)
2950 {
2951 global $DB;
2952
2953 if (is_array($arZipList))
2954 {
2956
2957 $arInsert = array(
2958 "LOCATION_ID" => "'".$DB->ForSql($location)."'",
2959 "ZIP" => '',
2960 );
2961
2962 foreach ($arZipList as $ZIP)
2963 {
2964 if ($ZIP <> '')
2966 }
2967 }
2968
2969 return;
2970 }
2971
2972 public static function GetRegionsIdsByNames($arRegNames, $countryId = false)
2973 {
2974 if(self::isLocationProMigrated())
2975 {
2976 try
2977 {
2978 $types = self::getTypes();
2979 $query = new Entity\Query(self::SELF_ENTITY_NAME);
2980
2981 $fieldMap = array(
2982
2983 'RID' => 'REGION_ID',
2984
2985 'RNAME' => 'NAME.NAME',
2986 'RSHORT_NAME' => 'NAME.SHORT_NAME'
2987 );
2988
2989 $selectFields = $fieldMap;
2991 array(
2992 'LOGIC' => 'OR',
2993 'RNAME' => $arRegNames,
2994 'RSHORT_NAME' => $arRegNames,
2995 ),
2996 '=TYPE_ID' => $types['REGION'],
2997 '!=REGION_ID' => '0'
2998 );
2999
3000 if($countryId = intval($countryId))
3001 $filterFields['=COUNTRY_ID'] = $countryId;
3002
3003 // order
3004 $orderFields = array(
3005 'RNAME' => 'asc',
3006 'RSHORT_NAME' => 'asc'
3007 );
3008
3009 // group
3010 $groupFields = array(
3011 'RID'
3012 );
3013
3014 $nameJoinCondition = array(
3015 '=this.ID' => 'ref.LOCATION_ID',
3016 );
3017 if($strLang <> '')
3018 {
3019 $nameJoinCondition['=ref.LANGUAGE_ID'] = array('?', $strLang);
3020 }
3021
3022 $query->registerRuntimeField(
3023 'NAME',
3024 array(
3025 'data_type' => self::NAME_ENTITY_NAME,
3026 'reference' => $nameJoinCondition,
3027 'join_type' => 'left'
3028 )
3029 );
3030
3031 $query->setSelect($selectFields);
3032 $query->setFilter($filterFields);
3033 $query->setOrder($orderFields);
3034 $query->setGroup($groupFields);
3035
3036 $result = array();
3037
3038 $res = $query->exec();
3039 while($item = $res->fetch())
3040 {
3041 $result[$item['RNAME'] <> ''? $item['RNAME'] : $item['RSHORT_NAME']] = $item['RID'];
3042 }
3043
3044 return $result;
3045 }
3046 catch(Exception $e)
3047 {
3048 return array();
3049 }
3050 }
3051 else
3052 {
3053 global $DB;
3054 $arResult = array();
3055 $arWhere = array();
3056 $arQueryFields = array('RL.NAME', 'RL.SHORT_NAME');
3057
3058 if(is_array($arRegNames))
3059 {
3060 foreach ($arRegNames as $regName)
3061 {
3062 $regName = $DB->ForSql($regName);
3063 foreach ($arQueryFields as $field)
3064 $arWhere[] = $field." LIKE '".$regName."'";
3065 }
3066
3067 if (count($arWhere) > 0)
3068 {
3069 $strWhere = implode(' OR ', $arWhere);
3070
3071 $query = " SELECT RL.REGION_ID, RL.NAME, RL.SHORT_NAME
3072 FROM b_sale_location_region_lang RL ";
3073
3074 if ($countryId)
3075 {
3076 $strWhere = 'L.COUNTRY_ID=\''.intval($countryId).'\' AND ('.$strWhere.')';
3077 $query .= "LEFT JOIN b_sale_location L ON L.REGION_ID=RL.REGION_ID ";
3078 }
3079
3080 $query .= "WHERE ".$strWhere;
3081 $query .= " GROUP BY RL.REGION_ID";
3082 $query .= " ORDER BY RL.NAME, RL.SHORT_NAME";
3083
3084 $dbList = $DB->Query($query);
3085
3086 $arRegionsLang = array();
3087
3088 while($arRegion = $dbList->Fetch())
3089 {
3090 if($arRegion["NAME"] <> '')
3091 $idx = $arRegion["NAME"];
3092 else
3093 $idx = $arRegion["SHORT_NAME"];
3094
3095 $arResult[$idx] = $arRegion["REGION_ID"];
3096 }
3097 }
3098 }
3099
3100 return $arResult;
3101
3102 }
3103 }
3104
3105 public static function GetRegionsNamesByIds($arIds, $lang = LANGUAGE_ID)
3106 {
3107 if(self::isLocationProMigrated())
3108 {
3109 try
3110 {
3111 if(!is_array($arIds) || empty($arIds))
3112 throw new Exception();
3113
3114 $arIds = array_unique($arIds);
3115 $parsedList = array();
3116 foreach($arIds as $id)
3117 {
3118 if(intval($id))
3119 $parsedList[] = intval($id);
3120 }
3121
3122 if($lang == '')
3123 $lang = LANGUAGE_ID;
3124
3125 $arResult = array();
3126 foreach ($parsedList as $id)
3127 {
3128 $res = self::GetLocationTypeList(
3129 'REGION',
3130 array('NAME' => 'asc', 'SHORT_NAME' => 'asc'),
3131 array('ID' => $id),
3132 $lang
3133 );
3134
3135 while($arRegion = $res->fetch())
3136 {
3137 $arResult[$arRegion["ID"]] = $arRegion["NAME"] ?: $arRegion["SHORT_NAME"];
3138 }
3139 }
3140
3141 return $arResult;
3142 }
3143 catch(Exception $e)
3144 {
3145 return array();
3146 }
3147 }
3148 else
3149 {
3150 global $DB;
3151 $arResult = array();
3152 $arWhere = array();
3153
3154 if ('' == $lang)
3155 $lang = LANGUAGE_ID;
3156
3157 if(!empty($arIds) && is_array($arIds))
3158 {
3159 foreach ($arIds as $id)
3160 {
3161 if(intval($id) > 0)
3162 $arWhere[] = intval($id);
3163 }
3164
3165 if (!empty($arWhere))
3166 {
3167 $query = "select RL.REGION_ID, RL.NAME, RL.SHORT_NAME from b_sale_location_region_lang RL";
3168 $query .= " where REGION_ID IN(".implode(',', $arWhere).") and RL.LID='".$DB->ForSql($lang, 2)."'";
3169 $query .= " order by RL.NAME, RL.SHORT_NAME";
3170
3171 $dbList = $DB->Query($query);
3172
3173 while($arRegion = $dbList->Fetch())
3174 $arResult[$arRegion["REGION_ID"]] = $arRegion["NAME"] <> '' ? $arRegion["NAME"] : $arRegion["SHORT_NAME"];
3175 }
3176 }
3177
3178 return $arResult;
3179 }
3180 }
3181
3182 // location import is overwritten, and it is enabled when self::isLocationProMigrated() == true, so no proxy provided for the obsolete methods below
3183
3184 public static function _GetZIPImportStats()
3185 {
3186 global $DB;
3187
3188 $query = "SELECT COUNT(*) AS CNT, COUNT(DISTINCT LOCATION_ID) AS CITY_CNT FROM b_sale_location_zip";
3189 $rsStats = $DB->Query($query);
3190 $arStat = $rsStats->Fetch();
3191
3192 return $arStat;
3193 }
3194
3195 public static function _GetCityImport($arCityName, $country_id = false)
3196 {
3197 global $DB;
3198
3199 $arQueryFields = array('LCL.NAME', 'LCL.SHORT_NAME');
3200
3201 $arWhere = array();
3202 foreach ($arCityName as $city_name)
3203 {
3204 $city_name = $DB->ForSql($city_name);
3205 foreach ($arQueryFields as $field)
3206 {
3207 if ($field <> '')
3208 $arWhere[] = $field."='".$city_name."'";
3209 }
3210 }
3211
3212 if (count($arWhere) <= 0) return false;
3213 $strWhere = implode(' OR ', $arWhere);
3214
3215 if ($country_id)
3216 {
3217 $strWhere = 'L.COUNTRY_ID=\''.intval($country_id).'\' AND ('.$strWhere.')';
3218 }
3219
3220 $query = "
3221SELECT L.ID, L.CITY_ID
3222FROM b_sale_location L
3223LEFT JOIN b_sale_location_city_lang LCL ON L.CITY_ID=LCL.CITY_ID
3224WHERE ".$strWhere;
3225
3226 $dbList = $DB->Query($query);
3227
3228 if ($arCity = $dbList->Fetch())
3229 return $arCity;
3230 else
3231 return false;
3232 }
3233
3234 protected static function AddLocationUnattached($typeCode, $names = array())
3235 {
3236 static $types;
3237
3238 if($types == null)
3239 {
3240 $types = self::getTypes();
3241 }
3242
3243 if(!intval($types[$typeCode])) // no such type
3244 {
3245 return false;
3246 }
3247
3248 foreach (GetModuleEvents('sale', 'OnBefore'.ucfirst(mb_strtolower($typeCode)).'Add', true) as $arEvent)
3249 {
3250 if (ExecuteModuleEventEx($arEvent, array($names))===false)
3251 {
3252 return false;
3253 }
3254 }
3255
3256 if(!is_array($names))
3257 {
3258 $names = array();
3259 }
3260
3261 $name = $names['NAME'];
3262 $shortName = $names['SHORT_NAME'];
3263
3264 unset($names['NAME']);
3265 unset($names['SHORT_NAME']);
3266
3267 $fields = array();
3268 foreach($names as $lang => $n)
3269 {
3270 $fields['NAME'][$n['LID']] = array(
3271 'NAME' => $n['NAME'],
3272 'SHORT_NAME' => $n['SHORT_NAME']
3273 );
3274 }
3275
3276 if(!isset($fields['NAME']['en']))
3277 {
3278 $fields['NAME']['en'] = array(
3279 'NAME' => $name,
3280 'SHORT_NAME' => $shortName
3281 );
3282 }
3283
3284 $fields['CODE'] = 'randstr'.rand(999, 99999).rand(999, 99999).rand(999, 99999);
3285 $fields['TYPE_ID'] = $types[$typeCode];
3286 $fields['PARENT_ID'] = 0;
3287
3288 $id = false;
3289 $res = \Bitrix\Sale\Location\LocationTable::add($fields);
3290 if($res->isSuccess())
3291 {
3292 $id = $res->getId();
3293 $uRes = \Bitrix\Sale\Location\LocationTable::update($id, array('CODE' => $id));
3294
3295 foreach (GetModuleEvents('sale', 'On'.ucfirst(mb_strtolower($typeCode)).'Add', true) as $arEvent)
3296 {
3297 ExecuteModuleEventEx($arEvent, array($id, $names));
3298 }
3299 }
3300
3301 return $id;
3302 }
3303
3304 protected static function RebindLocationTriplet($fields = array())
3305 {
3306 $country = intval($fields['COUNTRY_ID']);
3307 $region = intval($fields['REGION_ID']);
3308 $city = intval($fields['CITY_ID']);
3309
3310 foreach (GetModuleEvents('sale', 'OnBeforeLocationAdd', true) as $arEvent)
3311 {
3312 if (ExecuteModuleEventEx($arEvent, array($fields))===false)
3313 {
3314 return false;
3315 }
3316 }
3317
3318 if($region && $country) // set country as PARENT_ID for region
3319 {
3320 $uRes = \Bitrix\Sale\Location\LocationTable::update($region, array('PARENT_ID' => $country));
3321 }
3322 if($city)
3323 {
3324 if($region) // set region as PARENT_ID for city
3325 {
3326 $uRes = \Bitrix\Sale\Location\LocationTable::update($city, array('PARENT_ID' => $region));
3327 }
3328 elseif($country) // set country as PARENT_ID for city
3329 {
3330 $uRes = \Bitrix\Sale\Location\LocationTable::update($city, array('PARENT_ID' => $country));
3331 }
3332 }
3333
3334 if(intval($fields['SORT']))
3335 {
3336 $loc2Update = $city ? $city : ($region ? $region : ($country ? $country : false));
3337 if($loc2Update)
3338 {
3339 $uRes = \Bitrix\Sale\Location\LocationTable::update($loc2Update, array('SORT' => $fields['SORT']));
3340 }
3341 }
3342
3343 foreach (GetModuleEvents('sale', 'OnLocationAdd', true) as $arEvent)
3344 {
3345 ExecuteModuleEventEx($arEvent, array($loc2Update, $fields));
3346 }
3347
3348 return $loc2Update;
3349 }
3350}
$type
Определения options.php:106
$db_res
Определения options_user_settings.php:8
global $APPLICATION
Определения include.php:80
$arResult
Определения generate_coupon.php:16
static getTableName()
Определения type.php:45
static getConnection($name="")
Определения application.php:638
static get($moduleId, $name, $default="", $siteId=false)
Определения option.php:30
static set($moduleId, $name, $value="", $siteId="")
Определения option.php:261
Определения debug.php:6
static getTableName()
Определения group.php:33
static getList(array $parameters=array())
Определения datamanager.php:431
const DB_GROUP_FLAG
Определения connector.php:26
const DB_LOCATION_FLAG
Определения connector.php:25
static getTableName()
Определения external.php:41
static getTableName()
Определения group.php:45
static updateExtended($primary, array $data, array $additional=array())
Определения location.php:247
static delete($primary)
Определения location.php:298
static getByCode($code='', $parameters=array())
Определения location.php:59
static getTableName()
Определения location.php:45
static checkCityId($cityId, $siteId)
Определения saleszone.php:90
static checkRegionId($regionId, $siteId)
Определения saleszone.php:75
static checkLocationId($locationId, $siteId)
Определения saleszone.php:105
static checkCountryId($countryId, $siteId)
Определения saleszone.php:60
static GetList($by="sort", $order="asc", $arFilter=[])
Определения language.php:12
Определения location.php:22
static locationProDebugDisable()
Определения location.php:229
const LOC2_M_OPT
Определения location.php:23
static parseFilter($filter=array())
Определения location.php:716
static GetByID($primary, $strLang=LANGUAGE_ID)
Определения location.php:2229
static ClearAllLocationZIP()
Определения location.php:2853
static GetCountryLangByID($ID, $strLang=LANGUAGE_ID)
Определения location.php:1172
static SetLocationZIP($location, $arZipList)
Определения location.php:2949
static proxySaleAjaxLocationsComponent($parameters=array(), $additionalParams=array(), $template='', $hideIcons=true, $wrapNewComponentWith=false)
Определения location.php:147
static GetByZIP($zip)
Определения location.php:2794
static locationProControlForm()
Определения location.php:95
static RegionCheckFields($ACTION, &$arFields)
Определения location.php:1239
const ZIP_EXT_SERVICE_CODE
Определения location.php:31
static Delete($ID)
Определения location.php:2621
static locationProDebugEnable()
Определения location.php:224
static ClearLocationZIP($location)
Определения location.php:2836
static getTypes()
Определения location.php:367
const LEADING_TILDA_SEARCH_R
Определения location.php:35
static checkIsCode($id)
Определения location.php:276
static CityCheckFields($ACTION, &$arFields)
Определения location.php:1479
static OnLangDelete($strLang)
Определения location.php:2690
const DEFAULT_SITE_ENTITY_NAME
Определения location.php:28
static getFilterForGetList($arFilter)
Определения location.php:1939
static processFilterForGetList($arFilter, $fieldMap=array(), $fieldProxy=array(), $query=null)
Определения location.php:1795
const KEY_PARSE_R
Определения location.php:34
static isLocationProMigrated()
Определения location.php:58
static UpdateCity($ID, $arFields)
Определения location.php:1496
static tryTranslateIDToCode($id)
Определения location.php:281
static Add($arFields)
Определения location.php:2411
static checkIsRealInt($val)
Определения location.php:484
static getLocationCityTail()
Определения location.php:322
static GetLocationString($locationId, $siteId=SITE_ID, $langId=LANGUAGE_ID)
Определения location.php:812
static DeleteRegion($ID)
Определения location.php:1316
static checkLocationCodeExists($code)
Определения location.php:663
static isLocationProInDebug()
Определения location.php:219
static DeleteAll()
Определения location.php:2707
const NAME_ENTITY_NAME
Определения location.php:27
static $allowedOps
Определения location.php:712
static getNameOfParentOfType($item, $typeCode, $strLang=LANGUAGE_ID)
Определения location.php:2090
static getFreeId($type)
Определения location.php:670
const SELF_ENTITY_NAME
Определения location.php:26
static LocationCheckFields($ACTION, &$arFields)
Определения location.php:2273
static DeleteCity($ID)
Определения location.php:1565
static locationProDisable()
Определения location.php:50
static DeleteCountry($ID)
Определения location.php:1076
static getLocationIDbyCODE($code)
Определения location.php:238
static checkLocationIdExists($id)
Определения location.php:656
static $specialCities
Определения location.php:2158
static isLocationProEnabled()
Определения location.php:40
static UpdateRegion($ID, $arFields)
Определения location.php:1246
static $city2RegionMap
Определения location.php:2153
static CheckFields($ACTION, &$arFields)
Определения location.php:2309
static getSites()
Определения location.php:357
static getTypeJOINCondition($ctx='this')
Определения location.php:683
static GetCityByID($ID)
Определения location.php:1612
static checkLocationIsAboveCity($locationId)
Определения location.php:299
static CountryCheckFields($ACTION, &$arFields)
Определения location.php:985
static processSelectForGetList($arSelectFields, $fieldMap)
Определения location.php:1870
static locationProSetMigrated()
Определения location.php:63
static locationProSetRolledBack()
Определения location.php:68
const MODIFIER_SEARCH_R
Определения location.php:33
static GetRegionsIdsByNames($arRegNames, $countryId=false)
Определения location.php:2972
static GetCountryByID($ID)
Определения location.php:1120
static UpdateLocation($ID, $arFields)
Определения location.php:2284
static getTypeFilterCondition()
Определения location.php:700
static getLocationCODEbyID($id)
Определения location.php:260
static UpdateCountry($ID, $arFields)
Определения location.php:1002
static AddLocationZIP($location, $ZIP, $bSync=false)
Определения location.php:2867
const ORIGIN_NAME_LANGUAGE_ID
Определения location.php:30
static getFieldMapForGetList($arFilter)
Определения location.php:1960
static GetLocationTypeList($typeCode='', $arOrder=Array("NAME_LANG"=>"ASC"), $arFilter=Array(), $strLang=LANGUAGE_ID)
Определения location.php:489
static locationProEnable()
Определения location.php:45
static GetByIDForLegacyDelivery($primary, $strLang=LANGUAGE_ID)
Определения location.php:2160
static Update($ID, $arFields)
Определения location.php:2518
static GetCityLangByID($ID, $strLang=LANGUAGE_ID)
Определения location.php:1696
static GetRegionLangByID($ID, $strLang=LANGUAGE_ID)
Определения location.php:1413
static GetRegionByID($ID)
Определения location.php:1362
static getDenormalizedLocationList($entityName, $arFilter=array())
Определения location.php:745
static GetLocationZIP($location)
Определения location.php:2761
const LOC2_DEBUG_MODE_OPT
Определения location.php:24
static locationProCheckEnabled()
Определения location.php:74
static GetList($arOrder=array("SORT"=>"ASC", "COUNTRY_NAME_LANG"=>"ASC", "CITY_NAME_LANG"=>"ASC"), $arFilter=array(), $arGroupBy=false, $arNavStartParams=false, $arSelectFields=array())
Определения location.php:9
static GetByID($primary, $strLang=LANGUAGE_ID)
Определения location.php:118
static AddRegion($arFields)
Определения location.php:554
static AddCountry($arFields)
Определения location.php:462
static AddCity($arFields)
Определения location.php:508
static GetCountryList($arOrder=Array("NAME_LANG"=>"ASC"), $arFilter=Array(), $strLang=LANGUAGE_ID)
Определения location.php:155
static GetRegionList($arOrder=Array("NAME_LANG"=>"ASC"), $arFilter=Array(), $strLang=LANGUAGE_ID)
Определения location.php:261
static AddLocation($arFields)
Определения location.php:599
$sites
Определения clear_component_cache.php:15
$f
Определения component_props.php:52
$arFields
Определения dblapprove.php:5
& nbsp
Определения epilog_main_admin.php:38
$template
Определения file_edit.php:49
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
Определения file_new.php:804
$res
Определения filter_act.php:7
Form FILTER_ACTION disabled
Определения options.php:358
$_REQUEST["admin_mnu_menu_id"]
Определения get_menu.php:8
$result
Определения get_property_values.php:14
$start
Определения get_search.php:9
$query
Определения get_search.php:11
if($ajaxMode) $ID
Определения get_user.php:27
$region
Определения .description.php:13
$select
Определения iblock_catalog_list.php:194
$filter
Определения iblock_catalog_list.php:54
$filterFields
Определения iblock_catalog_list.php:55
$selectFields
Определения iblock_catalog_list.php:160
foreach( $arCellTemplates as $key=> $value) foreach( $arCellTemplates as $key=> $value)
Enable()
Определения idea_email_notify.php:215
global $DB
Определения cron_frame.php:29
$ACTION
Определения csv_new_setup.php:27
endif
Определения csv_new_setup.php:990
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
Определения options.php:195
$siteId
Определения ajax.php:8
ExecuteModuleEventEx($arEvent, $arParams=[])
Определения tools.php:5214
DelDuplicateSort(&$arSort)
Определения tools.php:2055
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
Определения tools.php:5177
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
Определения tools.php:3778
is_set($a, $k=false)
Определения tools.php:2133
GetMessage($name, $aReplace=null)
Определения tools.php:3397
$name
Определения menu_edit.php:35
Определения arrayresult.php:2
Определения ufield.php:9
Определения chain.php:3
$GLOBALS['____1690880296']
Определения license.php:1
if(!function_exists(__NAMESPACE__.'\\___972068685'))
Определения license.php:1
$table
Определения mysql_to_pgsql.php:36
$order
Определения payment.php:8
$country
Определения payment.php:59
$direction
Определения prolog_auth_admin.php:25
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
Определения prolog_main_admin.php:393
if(empty($signedUserToken)) $key
Определения quickway.php:257
const ADMIN_SECTION
Определения rss.php:2
$i
Определения factura.php:643
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"
Определения waybill.php:936
if($inWords) echo htmlspecialcharsbx(Number2Word_Rus(roundEx($totalVatSum $params['CURRENCY']
Определения template.php:799
$arLocation['REGION_NAME']
Определения options.php:2800
$val
Определения options.php:1793
$location
Определения options.php:2729
$langs
Определения options.php:141
$arRes
Определения options.php:104
const SITE_ID
Определения sonet_set_content_view.php:12
$k
Определения template_pdf.php:567
$arFilter
Определения user_search.php:106
$dbRes
Определения yandex_detail.php:168
$fields
Определения yandex_run.php:501