Показать сообщение отдельно
  #6 (permalink)  
Старый 16.02.2015, 19:03
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Нет, так конечно не пойдет. Во-первых {return false}, это ничего не значащий мусор, и если бы даже было прописано в положенном месте, в параметрах события, то для div все равно не имело бы значения.

Во-вторых, возвращается набор, и это список, и уж если не выпадающий список, то или нумерованный, или маркированный список, но только не div.

Вот только мудрить с чем-то иным, игнорируя выпадающий список, не стоит. Со списком может возникать лишь одна проблема - если возвращается большой объем марок изделия, то конечно, в длинном списке вряд ли удобно делать выбор. В этом случае может потребоваться и еще один запрос, который будет выводить или фиксированные части этого набора, или выбранные по алфавиту. В общем это уже логика, которая зависит от данные, которых я не знаю.

Если не разбираетесь в JS, то подключите jQuery и используйте его. Использование его не означает наплевать на JS, jQuery не панацея, в сего лишь удобный инструмент, а знание первоисточника желательно всегда. Но что-то написать на jQuery проще, и понять его методы не так сложно.

А в РНР хорошо разбираетесь? Вот простой пример. В нем нет вывода сообщений в случае, если поиск не вернет результата. Как вы это собираетесь выводить, это иной вопрос, и мной опущен. Главное в примере, это первичный запрос поля, которое присутствует всегда, и подгружаемый список, как результат второго запроса к ресурсу.

Второй запрос, то есть марок, в примере, это просто получить из массива по индексу (id) список. Финал диалога, это по id марки, получить описание ее (если у вас уточнение марки, то это надо полагать всего лишь уточнение, а не финал). Фактически же у вас будет три запроса ресурса - первый поиск по id, второй получение марок, третий финальный. Клиент при этом будет запрашивать сервер два раза.

<?
//имитатор результата первого запроса к ресурсу
$a = [
    1 => [1=>'Марка 1-1','Марка 1-2','Марка 1-3'],
         [4=>'Марка 2-1','Марка 2-2','Марка 2-3'],
         [7=>'Марка 3-1','Марка 3-2','Марка 3-3']
];

$b = [
    1 => 'Описание марки 1-1',
         'Описание марки 1-2',
         'Описание марки 1-3',
         'Описание марки 2-1',
         'Описание марки 2-2',
         'Описание марки 2-3',
         'Описание марки 3-1',
         'Описание марки 3-2',
         'Описание марки 3-3'
];


if($_POST) {
    if($id = (int)current($_POST)) {
        //запрос списка, первый запрос клиента
        if(key($_POST)=='a' && array_key_exists($id, $a)) 
        exit('<select id="b" onchange="getBrand(this.id,this.value)"><option value="">Уточните марку...</option>'.
            implode(array_map(function($k, $v) {
                return '<option value="'.$k.'">'.$v.'</option>';    
        }, array_keys($a[$id]), $a[$id])).'</select>');
        //финал - вывод описания, второй запрос клиента 
        else if(array_key_exists($id, $b)) exit($b[$id]);       
    }
}
?>
<!DOCTYPE HTML> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<style>

</style> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> 
<script> 
function getBrand(k, v) {
    v *= 1;
    if(v) {
        $.post(location, k+'='+v, function(d) {
            //получили список - добавили его на страницу
            if(k=='a') $('#f').find('select').remove().end().append(d);
            //иначе результат запроса марки
            else $('#d').html(d)
        })
    } else alert('Значение не выбрано!')
}
</script>     
</head> 

<body>
<div id="f">
    <input id="a" /> <button onclick="getBrand($('#a').attr('id'),$('#a').val())">Search</button>
</div>
<div id="d"></div> 
</body> 
</html>


Пример простой, думаю разобраться не сложно будет. НУ а "мясо на кости" можно нарастить при желании.

Последний раз редактировалось laimas, 17.02.2015 в 00:19.
Ответить с цитированием