Сделаем аякс подбор города при регистрации и при редактировании профиля из геобазы. Также страна, регион и город всегда будут возвращаться методом getUser в массиве geo, поскольку всё хранится в профиле пользователя БД.
Демо тут.
2. Выполним запросы к БД:После вставить:4. В файле /components/registration/frontend.php
Найти:Перед вставить:
Найти:Заменить:6. В файле /components/users/model.php
Найти:Заменить:Найти:После вставить:7. В файле /components/users/frontend.php
Удалить:Удалить:Найти:Заменить:Вот и всё!
A: Нет
Q: Для 1.9 подойдёт?
A: Вряд ли
Q: Сделаете для 1.9?
A: Нет
Q: Ню пожалуйстя...
A: Нет
Демо тут.
Установка
1. Заливаем содержимое папки upload архива в корень и импортируем в БД geo.sql из него же.2. Выполним запросы к БД:
ALTER TABLE `cms_user_profiles` ADD INDEX ( `city` ); ALTER TABLE `cms_user_profiles` ADD `geo` TEXT NOT NULL AFTER `city`;
Если вам это поле необходимо при регистрации
3. В файле com_registration.tpl вашего шаблона найти:
112 {if $cfg.ask_icq} <tr> <td valign="top" class=""><strong>ICQ:</strong></td> <td valign="top" class=""> <input name="icq" type="text" class="text-input" id="icq" value="{$item.icq}" style="width:300px"/> </td> </tr> {/if}
<tr> <td valign="top" class=""> <div><strong>Город:</strong></div> <div><small>Выберите город из списка</small></div> </td> <td valign="top" class=""> <input name="city" type="text" class="text-input" id="city" value="Введите первые символы" style="width:300px"/> <span class="regstar">*</span> <input name="city_int" type="hidden" class="text-input" id="city_int" value=""/> {literal}<script type="text/javascript"> $(function () { $('#city').autocomplete({ serviceUrl: '/cities.php', minChars: 1, deferRequestBy: 300, onSelect: function (value, data) { $('#city_int').val(data.id_city); $("#city").removeClass("bad_value"); } }); $("#city").focus(function(){ if($(this).val()=='Введите первые символы')$(this).val(''); }); $("#city").blur(function(){ if(!$('#city_int').val()){ $(this).addClass("bad_value"); $(this).val('Введите первые символы'); }else $(this).removeClass("bad_value"); }); }); </script>{/literal} </td> </tr>
Найти:
177 // День рождения
$item['city_int'] = cmsCore::request('city_int', 'int', 0); $item['city'] = cmsCore::request('city', 'str', ''); if(!$item['city_int']){cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;} else{ $sql = "SELECT s.id_city, s.id_region, s.id_country, s.city_name_ru, r.region_name_ru, c.country_name_ru FROM cms_geo_cities s LEFT JOIN cms_geo_countries c ON s.id_country = c.id_country LEFT JOIN cms_geo_regions r ON s.id_region = r.id_region WHERE s.id_city={$item['city_int']}"; $city = $inDB->query($sql); if($inDB->num_rows($city)){ $city = $inDB->fetch_assoc($city); $item['city'] = $city['city_name_ru']; $item['geo'] = cmsCore::arrayToYaml($city); }else{cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;} }
В профиле
5. В файле com_users_edit_profile.tpl вашего шаблонаНайти:
53 <td valign="top"> <input name="city" type="text" id="city" class="text-input" style="width:300px" value="{$usr.city|escape:'html'}"/> <script type="text/javascript"> {$autocomplete_js} </script> </td>
<td valign="top" class=""> <input name="city" type="text" class="text-input" id="city" value="{$usr.city|escape:'html'}" style="width:300px"/> <input name="city_int" type="hidden" class="text-input" id="city_int" value="{$usr.geo.id_city}"/> {literal}<script type="text/javascript"> $(function () { $('#city').autocomplete({ serviceUrl: '/cities.php', minChars: 1, deferRequestBy: 300, onSelect: function (value, data) { $('#city_int').val(data.id_city); $("#city").removeClass("bad_value"); } }); $("#city").focus(function(){ if($(this).val()=='Введите первые символы')$(this).val(''); }); $("#city").blur(function(){ if(!$('#city_int').val()){ $(this).addClass("bad_value"); $(this).val('Введите первые символы'); }else $(this).removeClass("bad_value"); }); }); </script>{/literal} </td>
Найти:
341 p.city, p.description, p.showmail, p.showbirth, p.showicq,
p.city, p.geo, p.description, p.showmail, p.showbirth, p.showicq,
368 $user['status_date'] = cmsCore::dateDiffNow($user['status_date']);
$user['geo'] = cmsCore::yamlToArray($user['geo']);
Удалить:
219 $smarty->assign('autocomplete_js', $inPage->getAutocompleteJS('citysearch', 'city', false));
210 $inPage->initAutocomplete();
238 if (mb_strlen($city)>25) { cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error'); $errors = true; }
$city_int = cmsCore::request('city_int', 'int', 0); if(!$city_int){cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;} else{ $sql = "SELECT s.id_city, s.id_region, s.id_country, s.city_name_ru, r.region_name_ru, c.country_name_ru FROM cms_geo_cities s LEFT JOIN cms_geo_countries c ON s.id_country = c.id_country LEFT JOIN cms_geo_regions r ON s.id_region = r.id_region WHERE s.id_city={$city_int}"; $geo = $inDB->query($sql); if($inDB->num_rows($geo)){ $geo = $inDB->fetch_assoc($geo); $city= $geo['city_name_ru']; $geo = cmsCore::arrayToYaml($geo); }else{cmsCore::addSessionMessage('Город необходимо выбрать из вариантов!', 'error');$errors = true;} }
Топ 3 ответов на популярные вопросы
Q: Плагином можно?A: Нет
Q: Для 1.9 подойдёт?
A: Вряд ли
Q: Сделаете для 1.9?
A: Нет
Q: Ню пожалуйстя...
A: Нет
Реклама #
lokanaft 11 лет назад #
SJen 11 лет назад #
lokanaft 11 лет назад #
Игорь 11 лет назад #
Anton 11 лет назад #
Игорь 11 лет назад #
Madmax 11 лет назад #
lokanaft 11 лет назад #
AndroS 11 лет назад #
st.Puh 11 лет назад #
AndroS 11 лет назад #
Крот 11 лет назад #
Крот 11 лет назад #
Крот 11 лет назад #
lokanaft 11 лет назад #
st.Puh 11 лет назад #
"Ошибка SQL-запрос:
ALTER TABLE `cms_geo_cities` ADD INDEX ( `city_name_ru` ) ;
Ответ MySQL:
#1072 - Key column 'city_name_ru' doesn't exist in table"
lokanaft 11 лет назад #
st.Puh 11 лет назад #
st.Puh 11 лет назад #
"Ошибка SQL-запрос:
ALTER TABLE `cms_user_profiles` ADD `geo` TEXT NOT NULL AFTER `city` ;
Ответ MySQL:
#1060 - Duplicate column name 'geo'"
st.Puh 11 лет назад #
lokanaft 11 лет назад #
Удалите из таблицы cms_user_profiles лишние дубли индексов city, раз вы несколько раз запросы выполняли. А так всё должно работать.
alexbabo 11 лет назад #
lesterkey 11 лет назад #
KS 11 лет назад #
Soul 11 лет назад #
st.Puh 11 лет назад #
st.Puh 11 лет назад #
lokanaft 11 лет назад #
st.Puh 11 лет назад #
lokanaft 11 лет назад #
lezginka.ru 11 лет назад #
Anonim 11 лет назад #
Soul 11 лет назад #
st.Puh 11 лет назад #
вот даже пользователь зарегался где выбрал город и это есть в базе
Код вставленый в файл /components/users/frontend.php перепроверил пару раз зделал все верно да и в остальных файлах,а где есть вывод города те страницы не работают
Что уже делать незнаю
lokanaft 11 лет назад #
st.Puh 11 лет назад #
lokanaft 11 лет назад #
st.Puh 11 лет назад #
st.Puh 11 лет назад #
Игорь 11 лет назад #
lokanaft 11 лет назад #
Игорь 11 лет назад #
st.Puh 11 лет назад #
Def 11 лет назад #
picaboo 11 лет назад #
Anonim 11 лет назад #
lokanaft 11 лет назад #
Fuze 11 лет назад #
lokanaft 11 лет назад #
Dost 11 лет назад #
Марат 11 лет назад #
хорошие наработки и адекватный человек с чувством юмора
st.Puh 11 лет назад #
lokanaft 11 лет назад #
Петр 11 лет назад #
Как это убрать? Если например уже выбран город, но хочешь отредактировать другие поля профиля, то приходится вводить город заново, хотя поле заполнено.
Если не заполняешь заново поле - город слетает все что ты отредактировал в профиле, что не есть хорошо. Как быть?
lokanaft 11 лет назад #
Петр 11 лет назад #
Петр 11 лет назад #
lokanaft 11 лет назад #
Miron 11 лет назад #
Андрей 11 лет назад #
ведь геобаза не знает все деревень :)
и еще момент, есть возможность разработать трехуровневую систему (страна, область, город)
даже за какую нибудь приятную оплату?
Олег Васильевич я 11 лет назад #
AndroS 11 лет назад #
Выбор города одним полем для ввода. При вводе также подсвечиваются города и области, если вашего города нет, то справа должен быть плюсик, щелкая по котором появляется форма для добавления населенного пункта (область, район, статус нас.пункта и т.д.). Далее этот населенный пункт отправляется на модерацию. Если он не проходит модерацию, то есть, не существует, то юзера в зависимости от настроек системы, нужно обязать ввести другой нас.пункт, ограничив его в использовании сайта.
lokanaft 11 лет назад #
lokanaft 11 лет назад #
Артем 11 лет назад #
Артем 11 лет назад #
mogulkhan 11 лет назад #
EVV 11 лет назад #
БИБАБО 11 лет назад #
Импорт через Sypex Dumper и через phpmyadmin пробывал ни в какую не хочет ...
У кого получилось, чем импорт делали?)
Петр 11 лет назад #
AlLar 11 лет назад #
trOid поясните на счёт трёх строчек
Код SQL: ALTER TABLE `cms_user_profiles` ADD INDEX ( `city` );
ALTER TABLE `cms_user_profiles` ADD `geo` TEXT NOT NULL AFTER `city`;
Петр 11 лет назад #
Петр 11 лет назад #
Петр 11 лет назад #
lesterkey 11 лет назад #
Петр 11 лет назад #
делайте шаг 1, 2, и вместо третьего вот это
в файле /templates/_default_/components/com_board_edit.tpl
вместо
lesterkey 11 лет назад #
udaff 9 лет назад #
Все круто, но при регистрации в город пользователю попадает значение "Array"
А если отредкатировать профиль - тогда все как надо.. Почему так, не понятно..