Перейти к содержанию
Официальный форум поддержки Simpla

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


Перейти к решению Решено insider,

Рекомендуемые сообщения

  • 2 недели спустя...
  • Ответов 72
  • Дата создания
  • Последний ответ

Лучшие авторы в теме

Лучшие авторы в теме

Изображения в теме

Вот что то похожее... 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));

}

 

Изменено пользователем mar
Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

Друзья, привет! Помогите пожалуйста организовать работу скрипта таким образом, что бы заходя на сайт 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>
Изменено пользователем Chudo
Ссылка на сообщение
Поделиться на другие сайты

reg=ymaps.geolocation.region

if(reg=='Курская область'){

location.href='//х2.site.ru/'

}

if(reg=='Брянская область'){

location.href='//х3.site.ru/'

}

Ссылка на сообщение
Поделиться на другие сайты

reg=ymaps.geolocation.region

if(reg=='Курская область'){

location.href='//х2.site.ru/'

}

if(reg=='Брянская область'){

location.href='//х3.site.ru/'

}

 

Спасибо большое, работает)

Ссылка на сообщение
Поделиться на другие сайты
  • 2 месяца спустя...

 

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

 

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

<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 == 'название города есть в массиве городов')

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

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>
Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

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

 

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

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


</script>


{$user_region}

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

Ссылка на сообщение
Поделиться на другие сайты

Все не так...

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

Ссылка на сообщение
Поделиться на другие сайты
  • 5 месяцев спустя...

Все не так...

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

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

 

		$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);	
Ссылка на сообщение
Поделиться на другие сайты
  • 1 месяц спустя...

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...

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

 

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

Ссылка на сообщение
Поделиться на другие сайты
  • 10 месяцев спустя...

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 недели спустя...

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 11 месяцев спустя...
В 02.11.2019 в 23:49, Dmitry86 сказал:

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты
51 минуту назад, a13x сказал:

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

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

Ссылка на сообщение
Поделиться на другие сайты
  • 3 месяца спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...

×
×
  • Создать...