Перейти к содержимому


Фото
* * * * * 7 голосов

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


Best Answer insider , 26.10.2014 - 23:21

Готовый код вставки в любое место сайта с указанием города, региона и страны.

<script src="http://yastatic.net/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
  window.onload = function () {
      jQuery("#user-city").text(ymaps.geolocation.city);
      jQuery("#user-region").text(ymaps.geolocation.region);
	  jQuery("#user-country").text(ymaps.geolocation.country);
  }
</script>
<script src="http://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"></script>
<div id="user-city"></div> <div id="user-region"></div> <div id="user-country"></div>
Перейти к посту


  • Чтобы отвечать, сперва войдите на форум
65 ответов в теме

#61 jonny008

jonny008
  • Пользователь
  • 126 сообщений

Опубликовано 25.06.2018 - 17:52

Все не так...

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

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

 

		$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);	


#62 doni031

doni031
  • Пользователь
  • 3 сообщений
  • Программирование
  • Откуда:Таганрог

Опубликовано 25.08.2018 - 13:48

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



#63 phukortsin

phukortsin
  • Фрилансер
  • 949 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 25.08.2018 - 13:57

Конечно, можно.

Например, по аналогии  с тем, как стандартно выбираются валюты...



#64 jonny008

jonny008
  • Пользователь
  • 126 сообщений

Опубликовано 09.12.2018 - 17:46

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

 

Скачиваем 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%. 



#65 Dmitry86

Dmitry86
  • Пользователь
  • 156 сообщений
  • Пользователь
  • Откуда:Мск

Опубликовано 02.11.2019 - 23:49

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

 

Скачиваем 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 и город. Не пойму, что не правильно сделал.. Подскажите, пожалуйста!



#66 Dmitry86

Dmitry86
  • Пользователь
  • 156 сообщений
  • Пользователь
  • Откуда:Мск

Опубликовано 03.11.2019 - 02:37

Спасибо за отличное решение! Только не получается вывести {$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 не был пустой, если вдруг он не определился у пользователя. Здесь можете делать как вам нужнее.

Вроде всё.


Изменено: Dmitry86, 03.11.2019 - 02:43





0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых