Стандартными способами как оказалось не совсем уж и простая задача. Пришлось хорошенько покапаться в коде...
А решение довольно простое... Пишем собственный обработчик для определения по ip адресу (точнее кастомизируем имеющийся)
[spoiler]
обработчик
обработка данных (под ajax)
А решение довольно простое... Пишем собственный обработчик для определения по ip адресу (точнее кастомизируем имеющийся)
[spoiler]
обработчик
CModule::IncludeModule("statistic"); AddEventHandler("statistic", "OnCityLookup", Array("CCityLookup_siteshouse_getip", "OnCityLookup")); class CCityLookup_siteshouse_getip extends CCityLookup { var $country_avail = false; var $city_avail = false; function OnCityLookup($arDBRecord = false) { return new CCityLookup_siteshouse_getip($arDBRecord); } function __construct($arDBRecord = false) { parent::__construct($arDBRecord); $DB = CDatabase::GetModuleConnection('statistic'); if(!$arDBRecord) { $country_recs = COption::GetOptionString("statistic", "COUNTRY_INDEX_LOADED", "N"); if($country_recs !== "Y") { $rs = $DB->Query(CStatistics::DBTopSql("SELECT /*TOP*/ * FROM b_stat_country", 1)); if($rs->Fetch()) { $country_recs = "Y"; COption::SetOptionString("statistic", "COUNTRY_INDEX_LOADED", "Y"); } } $this->country_avail = $country_recs === "Y"; if($this->country_avail) { $city_recs = COption::GetOptionString("statistic", "CITY_INDEX_LOADED", "N"); if($city_recs !== "Y") { $rs = $DB->Query(CStatistics::DBTopSql("SELECT /*TOP*/ * FROM b_stat_city_ip", 1)); if($rs->Fetch()) COption::SetOptionString("statistic", "CITY_INDEX_LOADED", "Y"); } $this->city_avail = COption::GetOptionString("statistic", "CITY_INDEX_LOADED", "N") === "Y"; } $this->is_installed = $this->country_avail; } } function GetFullInfo() { global $APPLICATION; //print_r($this->city_id); //если в куках есть город, то переопределяем $townid = $APPLICATION->get_cookie("BANER_TOWNID"); if($townid) { $this->city_id = $townid; $this->country_code = "RU"; } if(!$this->country_full_name && !$this->region_name && !$this->city_name) { if($this->city_id > 0) { $DB = CDatabase::GetModuleConnection('statistic'); $rs = $DB->Query(" SELECT C.NAME COUNTRY_NAME, CITY.REGION REGION_NAME, CITY.NAME CITY_NAME from b_stat_city CITY INNER JOIN b_stat_country C on C.ID = CITY.COUNTRY_ID WHERE CITY.ID = ".intval($this->city_id)); $ar = $rs->Fetch(); if($ar) { $this->country_full_name = $ar["COUNTRY_NAME"]; $this->region_name = $ar["REGION_NAME"]; $this->city_name = $ar["CITY_NAME"]; } } } return parent::GetFullInfo(); } function GetDescription() { return array( "CLASS" => "CCityLookup_siteshouse_getip", "DESCRIPTION" => 'измененный выбор города', "IS_INSTALLED" => true, "CAN_LOOKUP_COUNTRY" => $this->country_avail, "CAN_LOOKUP_CITY" => $this->city_avail, ); } function IsInstalled() { return true; } function Lookup() { $DB = CDatabase::GetModuleConnection('statistic'); global $APPLICATION; $townid = $APPLICATION->get_cookie("BANER_TOWNID"); //если в куках есть город то переопределяем if($townid) { $this->city_id = $townid; $this->country_code = "RU"; return; } if($this->city_avail && $this->ip_number) { $rs = $DB->Query(" SELECT * FROM b_stat_city_ip WHERE START_IP = ( SELECT MAX(START_IP) FROM b_stat_city_ip WHERE START_IP <= ".$this->ip_number." ) AND END_IP >= ".$this->ip_number." ", true); if($rs) { $ar = $rs->Fetch(); if($ar) { $this->country_code = $ar["COUNTRY_ID"]; $this->city_id = $ar["CITY_ID"]; } } else { //Here is mysql 4.0 version which does not supports subqueries //and not smart to optimeze query $rs = $DB->Query(" SELECT START_IP FROM b_stat_city_ip WHERE START_IP <= ".$this->ip_number." ORDER BY START_IP DESC LIMIT 1 "); $ar = $rs->Fetch(); if($ar && strlen($ar["START_IP"]) > 0) { $rs = $DB->Query(" SELECT * FROM b_stat_city_ip WHERE START_IP = ".$ar["START_IP"]." AND END_IP >= ".$this->ip_number." "); $ar = $rs->Fetch(); if($ar) { $this->country_code = $ar["COUNTRY_ID"]; $this->city_id = $ar["CITY_ID"]; } } } } if(!$this->country_code && $this->country_avail) { $this->country_code = i2c_get_country(); } } } |
define("STOP_STATISTICS", true); define("PUBLIC_AJAX_MODE", true); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); $arResult = array(); if(CModule::IncludeModule("statistic")) { if(!empty($_REQUEST["search"]) && is_string($_REQUEST["search"])) { $search = $APPLICATION->UnJSEscape($_REQUEST["search"]); $rsLocationsList = CCity::GetList(array(), array("CITY_NAME" => $search."%",)); while ($arCity = $rsLocationsList->GetNext()) { $arResult[] = array( "ID" => $arCity["CITY_ID"], "NAME" => $arCity["CITY_NAME"], "REGION_NAME" => $arCity["REGION_NAME"], "COUNTRY_NAME" => "", ); } } //при выборе города сюда кидаем айдишник elseif($_REQUEST["addtown"]>0){ $APPLICATION->set_cookie("BANER_TOWNID", intval($_REQUEST["addtown"])); unset($_SESSION["SESS_COUNTRY_ID"]); unset($_SESSION["SESS_CITY_ID"]); } } echo CUtil::PhpToJSObject($arResult); require_once($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_after.php"); die(); |