Хак «Выпадающее меню стран и городов»

Если вам надоело, что ваши юзеры указывают непонятно какие города и страны. Например: «росия»,«Росия»,«рося»,«Расия» и др., т.е. юзеров из одной страны и города найти практически невозможно :( Ответом на решение данного вопроса — является «хак выпадающее меню стран и городов».

сурс_код на livestreet: livestreet.ru/addons/91/
демо: ecovoice.ru/ (регистрируемся и смотрим)

UPDATE v.0.2
1. чуток переделал JS + проверил работоспособность на IE6-8,Opera10,FF3.5
2. остался глюк с 500 ошибкой, но это уже глюк библиотеки JsHttpRequest, там у автора написано: «For XML mode, 500 code is okay.»
upgrade с версии 0.1 — просто обновить файлы, базу обновлять не надо

За стандарт было взято выпадающее меню с vkontakte.ru, потому что на мой взгляд оно самое интуитивно понятное из аналогичных ему.
Далее пришлось поискать базу городов и стран. После перебора нескольких, остановился на одной(по моему мнению самой большой и аккуратной), которую нашел здесь. Я ее слегка переделал под нужды хака, а именно добавил поле sort для base_country и base_city, это нужно было для того чтобы выводить связку только актуальных городов и стран, а не полный список разом.

Функционал:
1. Выпадающее меню «распространенных стран» и «всех стран».
2. Выпадающее меню «распространенных городов» и «всех городов» относительно страны.
3. Если города нет даже в полном списке городов, человек имеет возможность ввести свой город.
4. Связки «страна»->«распространненые города» существует только для «распространненых стран», информация и порядок вывода взяты с vkontakte.ru. Если выбрана страна из НЕраспространненых, то выводится только первые 10 городов.
Связки я забивал в полу-автоматическом режиме, так что сделал только для частых стран vkontakte.ru, если кому интересно дальше дозабить — you are welcome.
5. Подгрузка стран и городов сделана на ajax'e, чтобы не перегружать страницу.
6. Скрипт вывода и изменения уже зарегестрированных пользователей, которые неправильно указали страну или город.

Инсталяция:
1. Если изменений в сурсе livestreet'a нет, тогда тупо заменяем файлы из архива. Актуально для версии 0.3.1!
2. Восстанавливаем 3 таблицы в БД с livestreet(`base_country`,`base_city`,`base_region`) — на самом деле актуальны только первые две, третью я оставил — может кто-то активировал себе возможность указывания регионов(тогда придется доделать хак).
Я специально не менял структуру таблиц livestreet'a, чтобы в случае чего можно было быстро убрать этот хак, если он не нужен. Да и к тому же серъезные изменения в родных таблицах — это уже нужно что-то большее чем хак ;)
3. Дальше, можете пойти проверить у себя в изменении профиля — все ли правильно работает.
4. Напоследок заходим на скрипт yoursite.com/change_users.php и видим список всех юзеров, которые неправильно указали страну или город(сверка идет уже по восстановленным нами таблицам). При переходе по линку можно поменять страну и город.
Там есть небольшой баг: не выбирается ajax'ом город при сохранении профиля. Так как на ф-ционал это не влияет, я доделывать скрипт не стал. Эстетическая сторона вопроса нас не должна волновать, потому что скрипт будет запущен всего 1 раз вначале установки хака — потом уже юзеры выбирают из актуальных списков.
5. Не забываем удалить файл change_users.php, потому что я не делал там проверку на права администратора.

П.С. Хотел показать какие изменения были сделаны в файлах, но так как размер топика только 15тыщ. знаков, то не хватает :( Основные файлы изменены не сильно, а вот дополнительные мои файлы большие, поэтому пока только через архив(тем более что таблицы городов и стран нужны). Если есть желание посмотреть что добавлено, то все добавления обрамлены '##### [hack] country_list #####'(только мои файлы не имеют обрамления, а имеют данный заголовок в самом начале файла). Пример для linux, как найти все строчки такие:
grep -nR '##### \[hack\] country_list #####' *

92 комментария

avatar
а где сам хак?
avatar
сам хак на модерации — сейчас опубликую что менять в исходниках
avatar
опубликовать не получилось, ограничение по кол-ву символов, выложил пока исходники на зеркало(к себе), так что — если интересно скачивай смотри
avatar
в шаблоне я бы использовала вместо /templates/skin/new/
{$DIR_STATIC_SKIN}

спасибо за работу.
avatar
ок, спасибо — сейчас подправлю и перезалью
avatar
там же, после {$DIR_STATIC_SKIN} надо поставить /
avatar
спасибо, не проверял ставит ли он trailing slash
avatar
Спасибо большое, все работает отлично!
avatar
нема за шо — пользуйтесь на здоровье :)
avatar
ecovoice.ru — копирайты на livestreet.ru где?
  • ort
  • +4
avatar
ага… забыли совсем…
убирали по причине, чтобы спамеры не нашли, а потом начали заниматься развитием проекта и забыли(сегодня скинут 1к руб.)
спасибо, что напомнил
avatar
Сорри моя вина. Денюжку отправил.
avatar
Есть один косячек. В IE8 после выбора страны не подгружается список городов. Селект появляется, но пустой.
avatar
ок, гляну на днях…
avatar
да, такая же проблема :( пользователи жалуются :(
avatar
обновите до новой версии и проверьте еще раз
если можно, конкретные подробные действия при которых возникает глюк
avatar
Обновился, теперь все работает отлично! Спасибо :)
avatar
Я обновил, теперь все работает как надо. Правда потом попытался прикрутить «Регионы»… На том и застрял. Теперь страны и регионы работают, а города — нет :)
avatar
а что делать если вместо списка стран и городов показываются кракозябры? т.е. кодировка не та…
дамп заливал вот как
открыл пхпмайадмин->sql->вставил в окошко код (который уже был в краказябровой кодировке) и нажал кнопку
avatar
разобрался. изменил кодировку в начальном файле и перезалил
avatar
Нашел глюк.
Редактирую свой профиль (ранее не указано место проживания)
Живу в Кирове

Выбираю «Россия», далее в полном списке нахожу свой город, который указан так «Киров (Кировская обл.)»

Выбираю — жму «сохранить»
Захожу в список пользователей и вижу в облаке 2 новых региона — Киров и Киров (Кировская обл.)

Причем в Кирове меня НЕТ, а в Кировской обл. я есть. Поправьте пожалуйста, а то бред получается.

Еще при редактировании своей записи не показан город для редактирования (только страна)
avatar
Причем в Кирове меня НЕТ, а в Кировской обл. я есть. Поправьте пожалуйста, а то бред получается.

Можете сами в БД подправить и оставить только город Киров, я же все 100+ стран и 18к+ городов — не могу идеально вылизать, к тому же и не должен.
Базу я нашел наиболее точную, но это не означает, что она идеальная.
Еще при редактировании своей записи не показан город для редактирования (только страна)

Если у вас ИЕ8, то как отметил выше тов. olegator — оно и не будет работать, я это подправлю на днях… В случае если баг у вас в другом браузере, прошу уточнить в каком? Все тестилось под ФФ(если в ФФ глюки, тогда прошу уточнить подробнее ваши действия)
avatar
Про базу — понял. я просто думал что это глючит так, а раз это неточность базы — буду редактировать как смогу. Спасибо за разъяснение.

По поводу ИЕ-8 го… нет, у меня не ИЕ, а Опера 10-й версии. Это в ней такое дело
avatar
понял, значит проверю и для оперы 10ой, думаю завтра-послезавтра сделаю
отпишусь здесь и версию обновлю, так что мониторьте
avatar
При попытке открыть файл change_users.php вываливатся вот такое:
Hacking attemp!
avatar
добавьте вверх этого файла
$_SERVER['HTTP_REFERER'] = 'http://' . $_SERVER['HTTP_HOST'] .'/';
avatar
Спасибо огромнейшее! помогло :) Это только в моем случае есть необходимость в этой строчке или это всем нужно сделать?
avatar
только в этом файле :)
avatar
в облаке тэгов, там где города и страны, все еще старые записи, нужно подождать или какие то действия предпринять для их обновления?
avatar
1) надо change_users.php запустит и поправить всех «неправильных» юзеров
2) после, когда вы уверены что у вас все юзеры правильные, тогда надо залезть и подправить чуток `prefix_country` и `prefix_city`
например если у вас уже был забит «минск», и вы всех привели к «Минск»(через change_users.php), тогда идете в БД и находите «минск», просто mysql считает что «минск» и «Минск» это одно и тоже, поэтому приравнивает всех к «минск».
avatar
а если я просто полностью почищу таблицы `prefix_country` и `prefix_city` они сами заполнятся новыми значениями учитывая внесенные изменения?
avatar
не нельзя… нарушаться связи, тех юзеров, которых вы править не будете
avatar
спасибо.
avatar
Что насчёт стран и городов для англоязычной аудитории? Скажем у меня есть список всех стран на англ языке, но городов нет. вы могли бы сделать аналогичный модуль для сайтов не на русском языке? Спасибо
avatar
он и так поддерживает англ.язык, у меня на сайте как раз на английском и реализовано :)
avatar
там чуток надо переделать, а именно вместо `city_name_ru` заменить на `city_name_en` аналогично для country
отдельно делать не буду(разве что 10+ людем не понадобится), потому что это надо уже детально вылизывать… он на то и хак, что там не так много всяких изменений — можно и самому доделать
avatar
Почему фаербаг при каждом запросе показывает 500ую ошибку? Приэтом всё нормально выдаётся и работает.
Хотя не совсем. У меня рисунок загрузки не отображается…
avatar
ага, был глюк точно — я про него забыл, ну потому что все нормально подгружалось :)
ну… рисунок к аякс запросу отношения никакого не имеет, в смысле что он не подгружается через аякс, а всеголишь идикатор, который уже в шаблоне стоит
я скоро буду смотреть в чем дело, тут народ уже поделился что ИЕ8 и Опера глючит, так что буду доделывать
avatar
Гуд ) Будем ждать багфиксов.
avatar
Что то опять нет хака в каталоге, народ дайте кто нибудь скачать пожалуйста.
avatar
по логике он проходит модерацию, наберитесь терпения
avatar
в новой верси нет возможности выбрать город, что-то пропустили?
avatar
какой браузер?
avatar
У меня не видно в ИЕ7 города. В опере не смотрел.
avatar
опера
avatar
попробуйте еще раз, я обновил файл — мог что-то недоложить в архив, сейчас проверил еще раз
+ проверил сразу в ИЕ7 и Опера10
avatar
Обновил, теперь всё работает в ИЕ7.
avatar
Теперь работает. Но есть замечания по модулю:
1. файл profile.tpl
исправить
<img src="/templates/skin/new/

на
<img src="{$DIR_STATIC_SKIN}/


2. зачем пользователя вводить в заблуждение целым языковым файлом, который наверняка у всех изменён. В ЛС система автоинклуда файлов а значит в папке language/modules/ создаём папку например city

в ней файл russian.php с содержимым:
<?php

return array(
	
	'settings_profile_city_not_selected' => 'Не выбран',
	'settings_profile_full_list' => 'Полный список',
	'settings_profile_other_name' => 'Другое название',
	
);

?>

разве так не проще? :)

3. Выбираем страну, выбираем город — всё отлично. Выбираем ручной ввод города, ничего не вводим и выбираем другую любую страну — поле выбора городов уже не появляется а должно :)
avatar
Заметил такую же проблему при тестах. Думал в новой версии поправят… видимо так и не поправили
avatar
думаю sys подправит, всё же умница, хороший модуль написал.
avatar
Да, модуль весьма неплох )
avatar
спасибо за замечания и баг-тест :)
1) исправил DIR_STATIC_SKIN
2) добавил по вашему совету в отдельный language-dir, глубоко LS не копал — не знал о такой его возможности
3) исправил баг с пропаданием селекта городов, пришлось подправить JS в profile.tpl
4) settings_profile_country_not_selected — добавил тоже
обновил хак, так что можете качать
avatar
спасибо вам!
avatar
в profile.tpl
{$aLang.settings_profile_country_not_selected}
есть а в текстовке его нет :)
avatar
##### [hack] country_list #####
	public function GetCountryList($full,$userCountry=''){
	    if($full==1) $sql="SELECT * FROM `base_countries` ORDER BY `country_name_ru` ASC";
	    elseif($full==0) $sql="SELECT * FROM `base_countries` WHERE `sort`>0 OR `country_name_ru`= ? ORDER BY `sort` ASC";
	    $aReturn=array();
	    if($aRows=$this->oDb->select($sql,$userCountry))
		foreach($aRows as $aRow) $aReturn[]=array("id"=>$aRow['id_country'],"name"=>$aRow['country_name_ru']);
	    return $aReturn;	    
	}
	public function GetCityListByCountry($full,$cid,$ext,$userCity=''){
	    if($full==0){
			$sql="SELECT 
					`city_name_ru`,`id_country` 
					FROM 
						`base_cities` 
					WHERE 
						(`id_country`= ?d AND `sort`>0) 
						{ OR city_name_ru = ? }
					ORDER BY `sort` ASC";
			$aRows=$this->oDb->select($sql,$cid,($ext==0) ? $userCity : DBSIMPLE_SKIP);
	        $_arr=array(); foreach($aRows as $a) $_arr[]=$a['city_name_ru']; $_arr=array_unique($_arr); # bug with equal city names
	        if(sizeof($_arr)<=1){
	   			$sql="SELECT `city_name_ru`,`id_country` FROM `base_cities` WHERE `id_country`= ?d ORDER BY `city_name_ru` ASC LIMIT 10";
				$aRows=$this->oDb->select($sql,$cid);
			}
	    }elseif($full==1){
			$sql="SELECT `city_name_ru`,`id_country` FROM `base_cities` WHERE `id_country`= ?d ORDER BY `city_name_ru` ASC";
			$aRows=$this->oDb->select($sql,$cid);
	    }
	    $aReturn=array();
	    if($aRows) foreach($aRows as $aRow)
		if($full==0 && $aRow['id_country']==$cid) $aReturn[]=$aRow['city_name_ru'];
		elseif($full==1) $aReturn[]=$aRow['city_name_ru'];
	    return $aReturn;	    
	}
	public function GetCountryNameByCID($cid){
	    $sql="SELECT `country_name_ru` FROM `base_countries` WHERE `id_country`= ?d LIMIT 1";
	    $aRow=$this->oDb->selectRow($sql,$cid);
	    return $aRow['country_name_ru'];
	}
	##### [hack] country_list #####


Вот так я думаю будет лучше…
avatar
ну… это на любителя :) мне удобнее так как у меня sql-запросы написаны
avatar
Ну я типизирован вводные данные. Точнее это делает DbSimple. Так безопаснее по сути. Ну как я понимаю… Мб конечно я что-то и неправильно понимаю )
avatar
вы правы — это безопаснее, но я там у себя в country_list.php делаю проверку на ввод данных — так что тылы прикрыты :)
а если под стандарт все приводить — то ваш вариант конечно правильнее, в след. версии приведу к вашему виду — чтобы из стандарта не выбиваться
но у меня обычно свой стандарт — я первоначально change_users.php сделал полностью через родные ф-ции mysql — мне так было быстрее ) но потом, когда решил выложить хак — привел к стандартным классам, потому что это правильнее для дальнейшей разработки + поддержки различных версии LS
avatar
Большое спасибо автору хака
avatar
Уважаемый sys!
Подскажите, пожалуйста, сколько будет стоит доработка вашего хака, я имею ввиду прикрутить регионы. Много заплатить не могу, а у самого ничего не вышло. Может кто-то тоже на эту тему мучается и готов поучаствовать в оплате доработки?
avatar
сейчас сильно занят, так что — пока доработка не планируется
довел до стабильного состояния, остальное уже на совести opensource-комьюнити
п.с. как время будет — доработаю
avatar
У вас не появилось времени? А то, что-то комьюнити не сильно суетится… Возможна ли доработка за разумные деньги?
avatar
нет, времени пока нет
avatar
Кто-нибудь реализовал вставку регионов?
Как это можно сделать?
avatar
Присоединяюсь к вопросу.
avatar
А я попутно спрошу, может в виде плагина все организовать :-)
avatar
Не откажусь на будущее, хотя мне под 0.3.1 надобно.
Может, в отдельную тему вынести?
avatar
Я просто думаю, что под 0.3.1 никто уже ничего делать не будет, кроме того, что уже есть.
avatar
Выход четвёртой версии не означает, что предыдущие сразу стали неработоспособными. Мне функционала хватает за глаза. Тем более, что с хаками я справляюсь успешнее, чем с плагинами.
avatar
Все понятно, но никто не станет делать модули для версии, которая уже не актуальна, я так думаю.
avatar
Для тех кто ставит не заменяя файлы, а копируя код — в шаблоне профайла также не забываем менять label for=«profile_country»
avatar
подскажите,
2. Восстанавливаем 3 таблицы в БД с livestreet(`base_country`,`base_city`,`base_region`)
как это сделать?
avatar
открываем в пхпмуадмин базу данных куда установлен лайвстрит, жмем «SQL» (выполнить запрос к мускл) копируем туда содержимое файла country_list.SQL и жмем «ок»
avatar
Выложите пожалуйста sql базу — а то модули здеьс щас не работают — а нужно срочно починить.
avatar
www.filehoster.ru/files/em0890 Если не скачивается в течение 30 дней, то файл удаляется.
avatar
памятка:

в profile.tpl
не отмечен метками [hack] авторский блок

<p>
                    <label for="profile_country">{$aLang.settings_profile_country}:</label><br />
                    <select id="country_list" onChange="country_list_action()" name="profile_country" class="w300">
                    	<option value="">- {$aLang.settings_profile_country_not_selected} -</option>
                        {foreach from=$aCountryList key=k item=v}
                        <option value="{$v.name}" id="cid{$v.id}" {if $v.name==$oUserCurrent->getProfileCountry()}selected{/if}>{$v.name}</option>
					    {/foreach}
					    <option value="_full_list_">- {$aLang.settings_profile_full_list} -</option>
                    </select>
                    <img src="{$DIR_STATIC_SKIN}/images/ajax.gif" id="countryAjax" style="float: left; position: relative; top: 7px; display: none" /><br />
					
					<span id="city_list_div" style="display:none">
						<label for="profile_city">{$aLang.settings_profile_city}:</label><br />
						<select id="city_list" onChange="city_list_action()" name="profile_city" class="w300">
	                    <option value="">- {$aLang.settings_profile_city_not_selected} -</option>
	                    </select>
	                    <input type="text" class="w300" id="city_list_input" style="display:none" />
	                    <br />
					</span>
				</p>


будьте внимательны
его тоже надо перенести в ваш темплейт
avatar
пытаюсь сделать sql запрос, получаю такую ошибку:
Fatal error: Maximum execution time of 300 seconds exceeded in /usr/local/cpanel/base/3rdparty/phpMyAdmin/libraries/string_mb.lib.php on line 47
и что делать, кто-нибудь подскажет?
avatar
А что за файлы .DS_Store? Не просмотреть их содержимое. Не описано для чего они.
Какой-то код, зашифрованный, чем-то вроде зенда… опасно
avatar
разобрался.
Файл настроек отображения папки (Mac OS X)
непонятно, зачем они в архиве
avatar
У меня этот хак не фурычит. LS 0.4, таблицы создал, блоки в файлы подобавлял.
А вот при выборе стран, города не подгружаются, при запросе к файлу localhost/include/ajax/country_list.php?PHPSESSID=objsfmh03agtou1lbi3lb9uko2&JsHttpRequest=12714529198250-xml возникает 500 ошибка.
Ответ приходит такой:
{"id":"12714529198250","js":null,"text":"Hacking attemp!"}
avatar
Вы забыли, что в лс0,4 теперь есть обязательный параметр ls_security_key — ищите в движке, в любой форме он есть — и делайте по аналогии.
avatar
Прикольно было бы сделать это плагином для LS 0.4
avatar
Крайне востребован в виде плагина для 0.4.1
avatar
присоединяюсь
avatar
тоже присоединяюсь, ибо просто бесит написание города пользователями
avatar
Верно, полностью согласен. Считаю нужным встроить в страницу регистрации сайта — example.com/registration/, как вот тут startuppoint.ru/registration и без возможности добавления собственного варианта.
avatar
как сделать такую регистрацию?
avatar
шикарно было бы в виде плагина :)
avatar
+1
avatar
Товарищи, подскажите пожалуйста реализовано ли это в версии 4.2? Может скинемся и оплатим доработку? Кто возьмется?
avatar
+1
avatar
Я думаю и для 0.5 вещь незаменимая
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.