Evo jedan primer, malo sam se igrao. Nisam koristio bazu jer me je mrzelo, pa sam sve smestio u jedan niz, ali nadam se da tebi nije problem to da uradiš. Možda su dodate neke suvišne stravari, kao na primer biranje metode (post ili get) iz padajućeg menija, ali ti možeš se odlučiti samo za jednu i tu koristiti. Kompletan kod sam stavio u jedan fajl kako ne bi postavljao više fajlova.
Code:
<?php
if(isset($_REQUEST['manufacturer'])) {
header('Expires: Mon, 26 Jul 1997 07:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
header('Content-type: text/xml');
$manufacturer = (int)$_REQUEST['manufacturer'];
$models = Array(
1 => Array('Model 11', 'Model 12', 'Model 13'),
2 => Array('Model 21', 'Model 22', 'Model 23', 'Model 24'),
3 => Array('Model 31', 'Model 32', 'Model 33', 'Model 34', 'Model 35')
);
$output = '<?xml version="1.0" ?><options>';
if(!isset($models[$manufacturer])) {
$output .= '<error><![CDATA[Manufacturer "'.$manufacturer.'" did not found.]]></error>';
} else {
for($i=0; $i<count($models[$manufacturer]); $i++) {
$output .= '<option id="'.$i.'"><![CDATA['.$models[$manufacturer][$i].']]></option>';
}
}
$output .= '</options>';
echo $output;
} else {
?>
<html>
<head>
<title>test</title>
<script>
function getRequestObject(){
var req;
try {
req = new ActiveXObject('Msxml2.XMLHTTP');
}
catch (e){
try {
req=new ActiveXObject('Microsoft.XMLHTTP');
}
catch (e2){
req=null;
}
}
if(!req && typeof XMLHttpRequest != 'undefined')
req = new XMLHttpRequest();
return req;
}
function processRequest(args, requestType) {
var req, uri, uriData;
uri = '<?php echo $_SERVER['PHP_SELF'];?>';
uriData = 'manufacturer='+args;
document.getElementsByTagName('body')[0].style.cursor = 'wait';
document.getElementById('status').innerHTML = 'loading...';
switch(requestType) {
case 'GET':
uri += '?' + uriData;
postData = null;
break;
case 'POST':
postData = uriData;
break;
default:
document.getElementsByTagName('body')[0].style.cursor = 'default';
document.getElementById('status').innerHTML = 'error';
alert('Illegal request type: ' + requestType);
return false;
break;
}
req = getRequestObject();
req.open(requestType=='GET'?'GET':'POST', uri, true);
if (requestType == 'POST'){
try{
req.setRequestHeader('Method', 'POST ' + uri + ' HTTP/1.1');
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req.setRequestHeader('Content-Length', postData.length);
req.setRequestHeader('Connection', 'close');
}
catch(e){
document.getElementById('status').innerHTML = 'error';
document.getElementsByTagName('body')[0].style.cursor = 'default';
alert('Your browser does not appear to support asynchronous requests using POST.');
return false;
}
}
req.onreadystatechange = function() {
if (req.readyState != 4) return;
if (req.status == 404) {
document.getElementsByTagName('body')[0].style.cursor = 'default';
document.getElementById('status').innerHTML = 'error';
alert('Error 404: Document "'+uri+'" not found.');
return false;
}
if (req.status==200) {
if (req.responseXML) processResponse(req.responseXML);
else {
document.getElementsByTagName('body')[0].style.cursor = 'default';
document.getElementById('status').innerHTML = 'error';
alert('Error: the XML response that was returned from the server is invalid.');
return false;
}
}
delete req;
}
req.send(postData);
delete req;
return true;
}
function processResponse(xml) {
var elem, output, id;
elem = document.getElementById('model');
xml = xml.getElementsByTagName('options')[0];
if (xml == null) {
document.getElementsByTagName('body')[0].style.cursor = 'default';
document.getElementById('status').innerHTML = 'error';
alert('Error: the XML response that was returned from the server cannot be processed.');
return false;
}
elem.options.length=0;
elemChild = xml.childNodes;
if(elemChild[0].nodeName == 'error') {
document.getElementsByTagName('body')[0].style.cursor = 'default';
document.getElementById('status').innerHTML = '<strong>Error:</strong> ' + elemChild[0].firstChild.nodeValue;
elem.options[elem.options.length] = new Option('----');
return false;
}
for(i=0; i<elemChild.length; i++){
if (elemChild[i].nodeName == 'option') {
id = elemChild[i].attributes.getNamedItem('id').value;
elem.options[elem.options.length] = new Option(elemChild[i].firstChild.nodeValue, id);
}
}
delete xml;
document.getElementsByTagName('body')[0].style.cursor = 'default';
document.getElementById('status').innerHTML = 'finished';
}
</script>
</head>
<body>
<form action="#" method="post">
Methods:
<select name="method" id="method">
<option value="GET">GET</option>
<option value="POST">POST</option>
</select>
<br />
Manufacturers:
<select name="manufacturer" id="manufacturer" onChange="processRequest(document.getElementById('manufacturer').value, document.getElementById('method').value)">
<option value="1">Manufacturer 1</option>
<option value="2">Manufacturer 2</option>
<option value="3">Manufacturer 3</option>
<option value="4">Manufacturer 4</option>
</select>
<br />
Models:
<select name="model" id="model">
<option>----</option>
</select>
</form>
<div id="status"></div>
</body>
</html>
<?php } ?>
Mošda sam neke stvari malo zakomplikovao.
Ti možeš uraditi i mnogo lakše, kao što je gore navedeno, da prosleđuješ niz, tačnije da prosleđuješ string koji će biti sastavljen od članova niza razdvojenih nekim delimiterom, pa da posle pomoću JS-a split-uješ (razbiješ) taj string i dobiješ svoj niz.
[Ovu poruku je menjao Br@nkoR dana 17.01.2006. u 09:34 GMT+1]