Jump to content

Определение города посетителя


Go to solution Solved by insider,

Recommended Posts

  • 2 weeks later...
  • Replies 72
  • Created
  • Last Reply

Top Posters In This Topic

Вот что то похожее... http://www.ipinfodb.com/ip_location_api_json.php Если кто готов помочь с кешированием $$$ прошу в ЛС

А что кешировать то?

Как часто чиcтить кеш будем?

---------------------------

Неуправляемый и быстрорастущий кеш могу привести код (ниже).

Чистить вызывая ф-цию clear_cache Можно кроном 1 раз в сутки - можно 1 раз в неделю ... и т .д.

 

Вот может старый классический способ кеширования , им даже DLE грешило.

 

$your_ip=$_SERVER['REMOTE_ADDR'];
/*Можно еще поизвращаться и пытаться определять другими переменными МИМО прокси*/
$cache_in=get_vars($your_ip);
/* Проверяю есть ли кеш с номером этого IP*/
if(!$cache_in){
/*Проверяем соответствие IP городу,стрне и записываем данные методом какой ВЫ выберете*/
$cache_in="/*Перечень данных ВАМ интересных*/";
set_vars($your_ip,$cache_in);
}
/*Выводим данные ВАМ интересные*/
print $cache_in;


/*Вспомогательные ф-ции**/
/*Убийца кеша*/
function clear_cache($cache_area = false){
$dir="."; //Путь где файлы кеша
    if ($cache_area){
    $filename = $dir.'/temp/cache/'.$cache_area.'.tmp';
    @unlink($filename);
    } else {
    $fdir = opendir($dir.'/tmp/cache');
    while ($file = readdir($fdir)){
        if ($file != '.' and $file != '..' and $file != '.htaccess' and $file != 'system'){
                    @unlink($dir.'/temp/cache/'.$file);
            }
        }
    }
}

/*Установим кеш на неопределенное время*/
function set_vars ($file="default", $data){
$dir="."; //Путь где файлы кеша
    @$filename = $dir.'/temp/cache/'.$file.'.tmp';

    $fp = @fopen($filename, 'wb+');
    @fwrite($fp, serialize($data) );
    @fclose($fp);

    @chmod($filename, 0666);
}

/*Возьмем данные если они есть*/
function get_vars ($file="default"){
$dir="."; //Путь где файлы кеша
    $filename = $dir.'/temp/cache/'.$file.'.tmp';

    if (!@filesize($filename)){
        return false;
    }

    return unserialize(file_get_contents($filename));

}

 

Edited by mar
Link to post
Share on other sites
  • 2 months later...

Спасибо! А как бы ещё все это дело кешировать? А то доходит до 30 просмотров на посетителя.

куда его поместить?)поясни плиз

Link to post
Share on other sites
  • 3 weeks later...

Друзья, привет! Помогите пожалуйста организовать работу скрипта таким образом, что бы заходя на сайт site.ru скрипт понимал что к нему зашли из региона "Х" и он оставлял нас на странице site.ru, зайдя из региона "Х2" нас перебрасывало на поддомен х2.site.ru, и заходя из региона "Х3" нас перебрасывало бы на поддомен х3.site.ru. Не пойму какое условие нужно написать.

Использую данный скрипт

 

<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
  window.onload = function () {
      jQuery("#user-region").text(ymaps.geolocation.region);
  }
</script>
<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"></script>
<div id="user-region"></div>
Edited by Chudo
Link to post
Share on other sites
  • 2 months later...

 

потому что айди должен быть уникальным у всех объектов. соответсвенно вы ставите три ссылки с одним айди и вам вставляет только на первую.

 

для множества используйте классы.

<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>
  <script type="text/javascript"> 
  window.onload = function () {
    if(ymaps.geolocation.region == 'Москва и Московская область'){
       jQuery(".region-phone").text('+7 (495) 000-00-00');
       jQuery(".region-phone-href").attr('href', 'tel:+78000000000');
     } else {
       jQuery(".region-phone").text('+7 (800) 000-00-00');
       jQuery(".region-phone-href").attr('href', 'tel:+78000000000');
   }
}
</script>
<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"></script>
<a class="region-phone-href" href="#"><div class="region-phone"></div></a>

 

Добрый день! Подскажите, пожалуйста, если необходимо, чтобы информация показывалась в зависимости не от одного города, а например, если город посетителя есть в списке городов (в массиве), то есть

if(ymaps.geolocation.city == 'название города есть в массиве городов')

 

Заране благодарю за помощь!

Link to post
Share on other sites

Добрый день! Подскажите, пожалуйста, если необходимо, чтобы информация показывалась в зависимости не от одного города, а например, если город посетителя есть в списке городов (в массиве), то есть

if(ymaps.geolocation.city == 'название города есть в массиве городов')

 

Заране благодарю за помощь!

 

var cities = ['Москва', 'Новоибирск', 'Казань'];
if(cities.indexOf(ymaps.geolocation.city)>-1) {
alert('Вы в нужном городе');
}
Link to post
Share on other sites

 

var cities = ['Москва', 'Новоибирск', 'Казань'];
if(cities.indexOf(ymaps.geolocation.city)>-1) {
alert('Вы в нужном городе');
}

 

Спасибо Мишаня, большое! Я ещё вот такой вариант нашел, вроде тоже работает)

		<script type="text/javascript">
			window.onload = function () {
				var cities = ['Москва','Воронеж','Магадан'];
				
				if(cities.join().search(ymaps.geolocation.city) != -1) {
      				jQuery(".user-city").text('текст 1');
      			} else {
      				jQuery(".user-city").text('текст 2');
      			}
			}
  		</script>
Link to post
Share on other sites
  • 1 month later...

Здравствуйте. 

 

Пытаюсь назначить город в переменную smarty. 

<script type="text/javascript">
  window.onload = function () {
     
      var gorod;
      gorod = ymaps.geolocation.city;
      
      {assign var=user_region value = 'gorod'};
      
  }


</script>


{$user_region}

Вообще никак не работает. Вопрос конечно глупый, но с javascript вообще никак. Подскажите пожалуйста, что не так.

Link to post
Share on other sites
  • 5 months later...

Все не так...

Смарти работает на сервере при генерации страницы, а джаваскрипт - в браузере юзера.

Получилось вот так вывести в переменную:

 

		$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = @$_SERVER['REMOTE_ADDR'];
 
if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client;
elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward;
else $ip = $remote;
echo $ip;
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$data = $SxGeo->get($ip);
$city = $data['city']['name_ru'];
$this->design->assign('city', $city);	
Link to post
Share on other sites
  • 1 month later...

А можно сделать так чтобы когда пользователь первый раз заходит на сайт выбирает город из списка и его город как-то запоминался?

Link to post
Share on other sites
  • 3 months later...

Немного другое решение для вывода переменной в шаблон. 

 

Скачиваем SxGeo.php и SxGeoCity.dat с сайта http://sypexgeo.net/ru/download/

 

В файле IndexView.php после строки:

 

$this->design->assign('module', $module);

Пишем:

 

$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = @$_SERVER['REMOTE_ADDR'];
 
if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client;
elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward;
else $ip = $remote;
//echo $ip;
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$data = $SxGeo->get($ip);
$city = $data['city']['name_ru'];
$this->design->assign('city', $city);	

В шаблоне выводим переменной {$city}

 

Определяет город с точностью 99%. 

Link to post
Share on other sites
  • 10 months later...

Немного другое решение для вывода переменной в шаблон. 

 

Скачиваем SxGeo.php и SxGeoCity.dat с сайта http://sypexgeo.net/ru/download/

 

В файле IndexView.php после строки:

 

$this->design->assign('module', $module);

Пишем:

 

$client  = @$_SERVER['HTTP_CLIENT_IP'];
$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
$remote  = @$_SERVER['REMOTE_ADDR'];
 
if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client;
elseif(filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward;
else $ip = $remote;
//echo $ip;
include("SxGeo.php");
$SxGeo = new SxGeo('SxGeoCity.dat');
$data = $SxGeo->get($ip);
$city = $data['city']['name_ru'];
$this->design->assign('city', $city);	

В шаблоне выводим переменной {$city}

 

Определяет город с точностью 99%. 

 

Спасибо за отличное решение! Только не получается вывести {$city} в шаблон.. Пытаюсь вывести в product.tpl

 

В IndexView.php сделал как указано. После:

$this->design->assign('module', $module);

вставил:

		// Определение города посетителя по IP
		$client  = @$_SERVER['HTTP_CLIENT_IP'];
		$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
		$remote  = @$_SERVER['REMOTE_ADDR'];
 
		if(filter_var($client, FILTER_VALIDATE_IP))
			$ip = $client;
		elseif (filter_var($forward, FILTER_VALIDATE_IP))
			$ip = $forward;
		else
			$ip = $remote;

		include("SxGeo/SxGeo.php");
		$SxGeo = new SxGeo('SxGeo/SxGeoCity.dat');
		$data = $SxGeo->get($ip);
		$city = $data['city']['name_ru'];
		
		// Передаем название города в шаблон
		$this->design->assign('city', $city);

И вместо города в шаблоне пусто..

 

Создал в корне сайта тестовый файлик:

<?PHP
		// Определение города посетителя по IP
		$client  = @$_SERVER['HTTP_CLIENT_IP'];
		$forward = @$_SERVER['HTTP_X_FORWARDED_FOR'];
		$remote  = @$_SERVER['REMOTE_ADDR'];
		
		if(filter_var($client, FILTER_VALIDATE_IP))
			$ip = $client;
		elseif (filter_var($forward, FILTER_VALIDATE_IP))
			$ip = $forward;
		else
			$ip = $remote;
			
		echo $ip;
		
		include("SxGeo/SxGeo.php");
		$SxGeo = new SxGeo('SxGeo/SxGeoCity.dat');
		$data = $SxGeo->get($ip);
		$city = $data['city']['name_ru'];
		echo $city;

Он отображает ip и город. Не пойму, что не правильно сделал.. Подскажите, пожалуйста!

Link to post
Share on other sites

 

Спасибо за отличное решение! Только не получается вывести {$city} в шаблон.. Пытаюсь вывести в product.tpl

 

В IndexView.php сделал как указано. После:

$this->design->assign('module', $module);

вставил:

// Определение города посетителя по IP $client = @$_SERVER['HTTP_CLIENT_IP']; $forward = @$_SERVER['HTTP_X_FORWARDED_FOR']; $remote = @$_SERVER['REMOTE_ADDR']; if(filter_var($client, FILTER_VALIDATE_IP)) $ip = $client; elseif (filter_var($forward, FILTER_VALIDATE_IP)) $ip = $forward; else $ip = $remote; include("SxGeo/SxGeo.php"); $SxGeo = new SxGeo('SxGeo/SxGeoCity.dat'); $data = $SxGeo->get($ip); $city = $data['city']['name_ru']; // Передаем название города в шаблон $this->design->assign('city', $city);

И вместо города в шаблоне пусто..

 

Создал в корне сайта тестовый файлик:

get($ip); $city = $data['city']['name_ru']; echo $city;

Он отображает ip и город. Не пойму, что не правильно сделал.. Подскажите, пожалуйста!

 

Разобрался. Сделал немного иначе.

 

в файле View.php после

self::$view_instance = $this;

вставил

            if (!empty($_SERVER['HTTP_X_REAL_IP'])) {
    			$client_ip = $_SERVER['HTTP_X_REAL_IP'];
    		}
    		elseif (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        		$client_ip = $_SERVER['HTTP_CLIENT_IP'];
    		}
    		elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        		$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    		}
    		else {
    			$client_ip = $_SERVER['REMOTE_ADDR'];
    		}
    		
    		if(filter_var($client_ip, FILTER_VALIDATE_IP))
    			$this->current_ip = $client_ip;
    
			include("SxGeo/SxGeo.php");
			$SxGeo = new SxGeo('SxGeo/SxGeoCity.dat');
			$data_ip = $SxGeo->get($this->current_ip);
			$user_city = $data_ip['city']['name_ru'];
		
			//var_dump($user_city);
			// Записать город в куки
			//setCookie("user_city", $user_city, time()+86400,'/');
		
			// Передаем название города в шаблон
			$this->design->assign('user_city', $user_city);

Теперь в любом шаблоне работает переменная {$user_city}

 

Если надо записывать город пользователя в куки, то раскомментируйте строчку:

//setCookie("user_city", $user_city, time()+86400,'/');

и можете поменять время, на которое они устанавливаются. 86400 - это сутки. Чтобы потом в шаблоне вызвать город из куки, то используйте {$smarty.cookies.user_city|urldecode}

 

И ещё обратите внимание, что у меня сервер настроен так, что $_SERVER['REMOTE_ADDR']; отдает адрес самого сервака, поэтому я поставил его в условии последним, чтобы ip не был пустой, если вдруг он не определился у пользователя. Здесь можете делать как вам нужнее.

 

Вроде всё.

Edited by Dmitry86
Link to post
Share on other sites
  • 2 months later...
  • 3 weeks later...

Добрый день, подскажите чайнику начинающему, вставил код в шаблон файл index.tpl, ничего не выводится. 

Заключал в {literal}

ссылку пришлите, надо проверять, ошибок может быть уйма в таком подключении..

Самое первое что приходит на ум - двойное подключение jquery...

Link to post
Share on other sites
  • 11 months later...
В 02.11.2019 в 23:49, Dmitry86 сказал:

Скачиваем SxGeo.php и SxGeoCity.dat с сайта http://sypexgeo.net/ru/download

На основе Sypexgeo на сайте реализовано переадресация на поддомены (регионы РФ). Кто может помочь с реализацией вывода модального окна с запросом - Правильно ли определен Ваш город (выберете из списка, в случае не верного определения).

Интересует качественная ПЛАТНАЯ доработка.

Link to post
Share on other sites

А в чём доработка заключается? Просто выводить модальное окно при первой загрузке страницы и чтобы человек сделал выбор сохранив его?

Link to post
Share on other sites
51 минуту назад, a13x сказал:

А в чём доработка заключается? Просто выводить модальное окно при первой загрузке страницы и чтобы человек сделал выбор сохранив его?

Да, все верно. Сделав выбор он будет переадресован на соответсвующий поддомен сайта.

Link to post
Share on other sites
  • 3 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...