|
|
05.09.2012, 10:42
|
|
Евгений
Зарегистрирован: 2012-05-22
Сообщений: 31
|
Добрый день. Может кто-то сможет помочь готовым решением довольно стандартного элемента, где пользователь выбирает регион, а затем автоматически подставляются города этого региона?
|
|
|
05.09.2012, 12:27
|
|
Руслан Густокашин
Студия Вэлпис
Зарегистрирован: 2012-02-06
Сообщений: 962
|
Почитайте вот здесь - очень подробно рассказано. У меня получилось.
|
|
|
05.09.2012, 15:17
|
|
Евгений
Зарегистрирован: 2012-05-22
Сообщений: 31
|
Цитата:Почитайте вот здесь - очень подробно рассказано. У меня получилось.
А как реализовывали связь с БД?
|
|
|
05.09.2012, 15:37
|
|
Руслан Густокашин
Студия Вэлпис
Зарегистрирован: 2012-02-06
Сообщений: 962
|
А там ведь в пункте 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
Сообщений: 962
|
Да без проблем, спрашивайте, с удовольствием отвечу!
Давайте все по порядку объясню:
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
Сообщений: 962
|
Так заочно сложно диагностировать проблему - нужно смотреть, какие ошибки и какие данные возвращают ваши скрипты. Если можете, пришлите адрес странички (сюда или лично, на info@welpis.ru), на которой не работает эта штука, я посмотрю дебаггером, в чем дело. Только проверьте, чтобы я как неавторизованный пользователь мог зайти на эту страничку, или сделайте отдельную, тестовую.
|