взаимосвязанные выпадающие списки
У меня такая проблема: Я создал сайт с библиотеками smarty и php. У меня в php извлекается из бд несколько столбцов. В smarty сделан шаблон
<form action = "index.php?search=ok" method="POST" enctype="multipart/form-data"> <table border="0"> <tr> <td> <select name="ckod" id="select1"> <option value="0">Выберите страну</option> {foreach from=$cod item=new} {$new.id}<option value="{$new.id}" selected>{$new.countrycod}</option> {/foreach} </select> </td> <td> <select id="select2" name="country" style="display:none;"> {foreach from=$codcontry item=new2} {$new2.id}<option value="{$new2.cod_zone}">{$new2.cod_contry}</option> {/foreach} </select> </td> <td> <select name="rkod" id="select3" style="display:none;"> {foreach from=$reg item=new1} {$new1.id}<option value="{$new1.cod_def}">{$new1.cod_def}</option> {/foreach} </select> </td> Мне нужно чтобы при выборе одного элемента в первом списке выбиралась соответствующие элементы во втором. Типа как на сайтах знакомств при поиске и выборе страны, области и города. Появление самих списков и при выборе например России появлялись регионы России, а при выборе США появлялись списки регионов США. А при выборе регионов ещё список. Помогите! как это сделать ? |
То, что вы хотите сделать к серверной технологии имеет отношение только для выборки из базы данных. В основном же все делается с помощью js. Ищите по форуму, тема уже обсуждалась много раз.
|
понимаете. фишка в том что у меня извлекается и бд Mysql. И я нашел динамические списки но там не рассматривается. Как мне брать элементы если их нету. Извлекаются из бд.
|
пишите пожалуйста по русски, используя верные знаки пунктуации
нифига не понятно и тем не менее ваша задача решается прежде всего клиентской частью. будет ли применяться серверная часть, вообще дело десятое, но без клиентской части вам не обойтись посему советую перечитать статьи и етмы про динамические вопросы, а потом, осмыслив прочитанное, сформулировать свой вопрос, если он еще будет |
Вы хотите сказать, что самое главное это клиентская часть а не бд. Тогда проблема то в том что, у меня все списки извлекаются из бд таблицы и как мне связать javascript и бд как например на сайтах знакомств. Я не понимаю этого
|
Вы хотите сказать, что самое главное это клиентская часть а не бд. Тогда проблема то в том что, у меня все списки извлекаются из бд таблицы и как мне связать javascript и бд как например на сайтах знакомств. Я не понимаю этого. спасибо за помощь. Но если вы поможите будет лучше решить эту проблему.
|
Уважаемый, динамические списки уже далеко не новость, а часто используемая структура. Вам что, лень было поискать и почитать найденное? Материала-то куча, причем не где-нибудь, а прямо на первой странице выдачи.
|
я наверно не так описал ситуацию, понимаете у меня всё из базы выводить в эти списки и они должны появляться последовательно. когда выбираешь один из элементов. Например при выборе 1 должны имеено определенные числа( элементы обозначающие один в таблице) если их нету то загружается третий список и выбирается там соответствующие номеру один числа. и тд . Если не сложно вам помогите составить хотябы пример такого же. Я поглядел на пример со странами где выбираешь россию и загружается москва и тд города. но как мне реализовать с помощью бд. Если я извлек все данные тоесть 1, 2,3 соотвествуют своим элементам. тоесть 1 соответствует 920, 1 соответствует 930 и тд у меня так и идёт в одной таблице. Мне также с остальными, Что то похожее я нигде не видел там где вы сказали искать.
а Главное чтобы всё это было с помощью Jquery и ajax |
Ну так и подумайте, как, имея id из списка, получить с сервера связанные с ним данные. Пробуйте, если что-то не будет получаться - задавайте вопросы и приводите код. Если хотите готовый скрипт, то вам сюда.
|
Если я правильно понял - есть событие onchange.
Как только срабатывает событие, проверяешь что выбрал пользователь и отправляешь AJAX запрос на сервер для получения нового списка. |
Вот теперь надо, чтобы это понял топик-стартер
|
понимаете, у меня все списки из базы данных. нужно чтобы когда я выбрал из первого списка например единицу появлялся второй список со своим диапазоном из бд где этот диапазон элементов равен 1. и тд. так как у меня не известны числа.. Если бы знать как получить доступ к элументу одного из options можно было просто запрограммировать что и как выводить во втором списке и тд. Я не давно изучаю Jquery и тем более ajax поэтому и спрашиваю вас. Как мне это сделать ? Хотябы пример моего бы случая.
|
ваш случай стандартен чуть менее чем полностью
для него есть куча примеров на всех возможный фреймворках, и чистом JS даже в гугле, первой строкой по "javascript динамические списки" вылазит то, что вам нужно, только без ajax читайте, повторяйте, учите, пробуйте если что-то конкретное не будет получатся, то задавайте конкретные вопросы. на общий вам уже дали ответ если у вас совсем нчиего не поулчается, то вам в раздел работа |
ajaxcascade.php
$db = mysql_connect("localhost", "alloall", "12345"); mysql_select_db("alloall",$db); if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { if ($_GET['cod_country'] == 1) { $a = mysql_query("SELECT id, cod_contry FROM alloall_code WHERE cod_zone=1"); // Так как запрос возвращает несколько строк, применяем цикл print "["; while($b = mysql_fetch_array($a)) { print "{value:\"".$b['id']."\",text:\"".$b['cod_contry']."\"}"; //создаем циклический список } print "]"; } else {echo "mysql_error"; exit(); } } index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <link rel="stylesheet" type="text/css" href="css/main.css"> <style type="text/css"> <!-- .alloallru { font-family: Mistral; font-size: 40x; font-weight: bold; } --> </style> <link href="tpl/templates/css/style.css" rel="stylesheet" type="text/css"> <script src="js/jquery-1.3.1.js" type="text/javascript"></script> <script type="text/javascript" src="tpl/templates/js/jquerykeypad.js"></script> <script type="text/javascript"> (function($){ // очищаем select $.fn.clearSelect = function() { return this.each(function(){ if(this.tagName=='SELECT') { this.options.length = 0; $(this).attr('disabled','disabled'); } }); } // заполняем select $.fn.fillSelect = function(dataArray) { return this.clearSelect().each(function(){ if(this.tagName=='SELECT') { var currentSelect = this; $.each(dataArray,function(index,data){ var option = new Option(data.text,data.value); if($.support.cssFloat) { currentSelect.add(option,null); } else { currentSelect.add(option); } }); } }); } })(jQuery); </script> <script type="text/javascript"> $(document).ready(function(){ // выбор автомобиля function adjustAuto(){ var countryValue = $('#cod_country').val(); var tmpSelect = $('#cod_contry'); if(countryValue.length == 0) { tmpSelect.attr('disabled','disabled'); tmpSelect.clearSelect(); adjustModel(); } else { $.getJSON('ajaxcascade.php',{cod_country:countryValue},function(data) { tmpSelect.fillSelect(data).attr('disabled',''); adjustModel(); }); } }; // выбор модели function adjustModel(){ var countryValue = $('#cod_country').val(); var autoValue = $('#cod_contry').val(); var tmpSelect = $('#model'); if(countryValue.length == 0||autoValue.length == 0) { tmpSelect.attr('disabled','disabled'); tmpSelect.clearSelect(); } else { $.getJSON('cascadeSelectModel.php',{country:countryValue,auto:autoValue},function(data) { tmpSelect.fillSelect(data).attr('disabled',''); }); } }; $('#cod_country').change(function(){ adjustAuto(); }).change(); $('#cod_contry').change(adjustModel); $('#model').change(function(){ if($(this).val().length != 0) { alert('Выбор сделан!'); } }); }); </script> </head> <body> <h3 align="left">Введите номер для поиска</h3> <form action = "" method="POST" enctype="multipart/form-data"> <table border="0"> <tr> <td> <select id="cod_country"> <option value="">Выбрать страну</option> <option value="1">Германия</option> <option value="2">Ю.Корея</option> <option value="3">Япония</option> </select> </div> </td> <td> <select id="cod_contry" name="cod_contry" disabled="disabled"></select> </td> <td> <select id="model" name="cod_def" disabled="disabled"></select> </td> <td width="100%"> <input type="text" name = "nkod" id="defaultKeypad"> <strong>@allo<span class="alloallru">all</span>.ru</strong> <input type="submit" value="Поиск" name="submit"> </form> </td> </tr> <tr> <td><div id="div"></div></td> </tr> </table> </body> </html> Покажите мне ошибку в этом коде? Я сижу не понимаю |
Форматируй текст
|
но что форматировать.? мне нужно соединение с бд.. может кто поможет?
|
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Отформатировал код.. подскажите что нить?
|
У вас создается массив объектов. А чем вы разделяете элементы? И вообще, есть функция json_encode, если что.
|
я как бы создал шаблон. И делаю его в цикле. А json encode нету. Пробывал по разному делать циклы и всё равно он понимает только своё. А переменные он не понимает.
|
А вы начало моего сообщения принципиально не заметили? Посмотрите на текст json, который сгенерится после вашего цикла. Там ошибку и найдете.
|
всё вроде правильно..
if ($_GET['cod_country'] == 1) { $db = mysql_connect("localhost", "alloall", "12345"); mysql_select_db("alloall",$db); $items=mysql_query('SELECT id, cod_contry FROM alloall_code WHERE cod_zone=1'); print '['; while ($a = mysql_fetch_array($items)); { print "{value:\"".$a['id']."\",text:\"".$a['cod_contry']."\"},"; } print ']'; } не получается создать разделители... он вроде загружает но поле пустое.. хотя раньше вообще было disabled |
Вообще по правилам имена полей тоже должны быть в двойных кавычках. И зачем вы используете экранирование? Не проще ли внешние кавычки сделать одинарными? У вас же все равно подстановка не используется.
|
всё равно не работает.
print '{"value":'.$a['id'].'"text":'.$a['cod_contry'].'}'; |
А вы каждый приведенный листинг здесь руками пишете или копируете из живого кода? Т.к. в каждом у вас ошибка и всегда разная.
Раз уж нельзя воспользоваться json_encode (с которым задача решылись бы в разы проще), придется по старинке: $json = ''; while ($a = mysql_fetch_assoc($items)){ $json .= ($json ? ',' : '') . '{"value" : "' . $a['id'] . '", "text" : "' . addslashes($a['cod_country']) . '"}'; } if ($json) echo '[' . $json . ']'; |
вот что получилось в php
<? header('Content-Type: text/html; charset=windows-1251'); if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { $db = mysql_connect("localhost", "alloall", "12345"); mysql_select_db("alloall",$db); if ($_GET['cod_country'] == 1) { $items=mysql_query('SELECT id, cod_contry FROM alloall_code WHERE cod_zone=1'); $json = ''; while ($a = mysql_fetch_assoc($items)){ $json .= ($json ? ',' : '') . '{"value" : "' . $a['id'] . '", "text" : "' . addslashes($a['cod_country']) . '"}'; } if ($json) echo '[' . $json . ']'; ?> всё равно не работает. |
Не работает - это не ответ. Что именно не работает? Неправильный ответ сервера, отсутствие данных? И кстати, ответ по правилам должен быть на в windows-1251, а в UTF-8.
|
данные извлеклись тока самих данных нету. Тоесть появились пустые поля. и сколько их должно быть для данных.
|
Ну тогда это уже сами ищите. Проверяйте правильность запроса и т.д.
|
всё заработало.. главное шаблон хоть есть.. остальное я попытаюсь сам сделать. А если я использую не Html Шаблон а .tpl
smarty. куда мне кидать файлы php рядом в этой же папке где .tpl? или лучше как то подругому сделать? |
Это вопрос уже совсем из другой оперы. Посмотрите как сделано подобное в распространенных cms, поищите статьи (не знаю, может и есть, сам не искал) или придумайте свое решение. Также может зависеть от конкретной задачи.
|
smarty must die :)
|
Цитата:
|
Правила неписанные, решает, конечно, каждый для себя. Но ИМХО лучше таки так.
|
Цитата:
|
Значит я просто сам уже напутал - видать сказалось то, что мне давно не приходилось делать проекты не в юникоде...
|
мне нужно дописать ещё скрипт к тому что я уже здесь кидал... Чтобы не только был следующий список но и выводилось в <Div> страну..
Я думал аналогичным способом, но не получается... function zone() { var countryValue = $('#cod_country').val(); var zoneValue = $('#zone'); $.getJSON('ajaxcascadezone.php',{cod_country:countryValue},function(jsonObject){zoneValue.html("")}); }; |
xDMK,
Добрый вечер... У меня проблема как ваша, только я со смарти не работал вообще. Можно ваш код сюда выложить? А я вам вышлю код с загрузкой городов во второй селект через гетДЖСОН. Предлагаю бартер |
Часовой пояс GMT +3, время: 02:39. |