Регистрация
Вход через соцсети
Восстановление пароля

Взаимные списки регион - город

Новый топик
05.09.2012, 10:42
Ответить | Цитировать
Евгений

Зарегистрирован:
2012-05-22
Сообщений: 31

Добрый день. Может кто-то сможет помочь готовым решением довольно стандартного элемента, где пользователь выбирает регион, а затем автоматически подставляются города этого региона?
05.09.2012, 12:27
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Почитайте вот здесь - очень подробно рассказано. У меня получилось. улыбка

05.09.2012, 15:17
Ответить | Цитировать
Евгений

Зарегистрирован:
2012-05-22
Сообщений: 31

Цитата:
Почитайте вот здесь - очень подробно рассказано. У меня получилось. улыбка

А как реализовывали связь с БД?
05.09.2012, 15:37
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

А там ведь в пункте 3.2 Бэк-энд приведен пример php-скрипта, принимающего ajax-запросы. В нем вместо сканирования директорий с текстовыми файлами приделываем обращение к базе данных, и собственно все. В общем-то вот вам готовый скрипт get_cities.php:

Код:
<?php
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {

include_once '../../../vars.inc.php';
include_once '../../connect_io.php';
include_once '../default/function.inc.php';

$region_id = @intval($_GET['region_id']);
if ($region_id>0) {
mysql_query("SET NAMES utf8") or die();

$query_cities = "SELECT Region_ID, Region_Name from Classificator_Region where Value='$region_id' or Region_ID=17590 order by Region_Priority";
$result_cities = mysql_query($query_cities) or die("");
$cities = array();
while ($row=mysql_fetch_row($result_cities))
$cities[] = array('id'=> intval($row[0]), 'title'=> trim($row[1]));
mysql_free_result($result_cities);
$result = array('type'=>'success', 'cities'=>$cities);
}
else {
$result = array('type'=>'error');
}

echo json_encode($result);

}
?>


В моем примере город с кодом 17590 - это город с названием "Другой" (чтобы в каждом регионе был такой город).
Причем в таблице городов (Classificator_Region) в поле Value вам надо указать код региона, т.к. вышеприведенный скрипт составляет список городов именно по этому коду.

Еще обратите внимание, что не на каждом хостинге есть функция json_encode. Если надо, могу привести ее исходник.

p.s. и кому из неткатовских разработчиков пришло в голову таблицу городов назвать Region? грустный Легко запутаться ведь.

07.09.2012, 10:40
Ответить | Цитировать
Евгений

Зарегистрирован:
2012-05-22
Сообщений: 31

Руслан, я все-таки вас помучаю.
Правильно ли я понял, что скрипт привязывается к стандартному списку Regions, в котором указывается Value для городов определенного региона, к примеру есть 1. Ленинградская обл. и города СПб, Приозерск... И вот им присваиваем Value = 1.

А как список этот должен выглядить в шаблоне? У меня что-то не работает никак.
07.09.2012, 16:03
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Да без проблем, спрашивайте, с удовольствием отвечу! улыбка
Давайте все по порядку объясню:

1. В неткате уже есть стандартный список городов, таблица называется Regions. В ней в поле Value (значение) присваиваете каждому городу какой-то код региона. Например, 1 - Ленинградская область, 2 - Московская область, 3 - Кемеровская область
2. Добавляете в неткате еще один список - таблицу регионов(областей), назовем ее, допустим, Area. Туда записываете все области, ID=1 - Ленинградская, ID=2 - Московская и т.д. Поле Value можно оставить пустым.
В компоненте тоже добавляете поле Area, к которому привязываете этот список.
3. Делаете в форме редактирования или добавления того или иного компонента стандартный вывод поля Area:
".nc_list_field("Area", "id='f_Area'", $classID, 1,1)."<br />
И ниже- пустой селектор для городов, вот так:
Регион (*):<br />
<select name='f_Region' id='f_Region' disabled='disabled'>
<option value=0> --- выберите --- </option>
</select><br />

Потом в эту форму (или в макет дизайна) вставляете те яваскрипты, которые будут при любом изменении f_Area подгружать соответствующий селектор f_Region (список городов), обращаясь при этом через ajax к тому Php-скрипту, который будет брать данные уже из базы.
Ну конечно не забудьте предварительно подключить библиотеку jquery, без нее эти яваскрипты не заработают. Прописывать лучше в макете дизайна в теге <head></head>

Если что непонятно, пишите здесь, разберемсяулыбка

07.09.2012, 16:35
Ответить | Цитировать
Евгений

Зарегистрирован:
2012-05-22
Сообщений: 31

Так, сделал в макете дизайна:
Код:
<script type='text/javascript' src='http://*.ru/jquery-1.7.2.min.js'></script>
<script type='text/javascript' src='http://*.ru/selects.js'></script>

".nc_list_field("Area", "id='f_Area'", $classID, 1,1)."<br />
Город (*):<br />
<select name='f_Region' id='f_Region' disabled='disabled'>
<option value=0> --- выберите --- </option>
</select><br />

К компоненту 2 поля: Area, Region. В Region задал для некоторых Value равные ID записей в Area.
В корне сайта 2 файла selects.js и get_cities.php
Код:
$(document).ready(function () {
$('#Area_id').change(function () {
var country_id = $(this).val();
if (country_id == '0') {
$('#region_id').html('');
$('#region_id').attr('disabled', true);
return(false);
}
$('#region_id').attr('disabled', true);
$('#region_id').html('<option>загрузка...</option>');

var url = 'get_cities.php';

$.get(
url,
"Area_id=" + Area_id,
function (result) {
if (result.type == 'error') {
alert('error');
return(false);
}
else {
var options = '';
$(result.regions).each(function() {
options += '<option value="' + $(this).attr('id') + '">' + $(this).attr('title') + '</option>';
});
$('#region_id').html(options);
$('#region_id').attr('disabled', false);
}
},
"json"
);
});
});


Код:
<?php

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {



include_once 'vars.inc.php';

include_once '/netcat/connect_io.php';

include_once '/netcat/modules/default/function.inc.php';



$region_id = @intval($_GET['region_id']);

if ($region_id>0) {

mysql_query("SET NAMES utf8") or die();



$query_cities = "SELECT Region_ID, Region_Name from Classificator_Region where Value='$region_id' or Region_ID=17590 order by Region_Priority";

$result_cities = mysql_query($query_cities) or die("");

$cities = array();

while ($row=mysql_fetch_row($result_cities))

$cities[] = array('id'=> intval($row[0]), 'title'=> trim($row[1]));

mysql_free_result($result_cities);

$result = array('type'=>'success', 'cities'=>$cities);

}

else {

$result = array('type'=>'error');

}



echo json_encode($result);



}

?>


Тем не менее, ничего подгружаться не хочет...
07.09.2012, 20:47
Ответить | Цитировать
Руслан Густокашин
Студия Вэлпис
Руслан Густокашин

Зарегистрирован:
2012-02-06
Сообщений: 869

Так заочно сложно диагностировать проблему - нужно смотреть, какие ошибки и какие данные возвращают ваши скрипты. Если можете, пришлите адрес странички (сюда или лично, на info@welpis.ru), на которой не работает эта штука, я посмотрю дебаггером, в чем дело. Только проверьте, чтобы я как неавторизованный пользователь мог зайти на эту страничку, или сделайте отдельную, тестовую.

198 196 2012-09-07 20:47:43 12559
Описание проекта