Portál AbcLinuxu, 12. května 2025 08:14
Jde nějak v PHPku zařídit, abych na jeden XMLHTTP(Ajax) požadavek dostal více odpovědí? V AJAXu dělám importér, který podle importuje data ze souborů, které se během importu stahují, a na každý tento soubor mám vlastní AJAX request. Jenomže každý importovaný soubor má několik podpoložek a ty bych chtěl pomocí AJAXu hlásit do UI.
Schéma jak to ted funguje je takové:
id požadavku 1(ajax request) pozadavek uspesne zpracovan(ajax reply)A toto bych z toho chtel dostat:
id požadavku 1(ajax request) polozka 1 uspesne naimportovana(ajax reply) polozka 2 uspesne naimportovan(ajax reply) ...... pozadavek uspesne zpracovan(ajax reply)
window.onload=function() { start_import(); } function start_import() { var f=document.adminForm; var ajax=new Array(); var tid=f.tid.value.split(","); do_import(ajax,tid,0); } function do_import(ajax, tid,i) { var f=document.adminForm; var msgs=document.getElementById('messages'); var url="index.php?option=com_cbazaar&controller=import&task=import_xxxcars"; if(window.XMLHttpRequest) { ajax.push(new XMLHttpRequest()); } else if(window.ActiveXObject) { ajax.push(new ActiveXObject("Microsoft.XMLHTTP")); } ajax[ajax.length-1].open('POST',url,true); ajax[ajax.length-1].onreadystatechange=function() { /*var p=document.createElement('p'); p.appendChild(document.createTextNode(ajax.length+' '+ajax[ajax.length-1].readyState+ ' '+ajax[ajax.length-1].responseText)); msgs.appendChild(p);*/ if(ajax[ajax.length-1].readyState==4 && ajax[ajax.length-1].status==200) { var xml=ajax[ajax.length-1].responseXML; if(xml.getElementsByTagName('status')[0].firstChild.nodeValue==0) { var p=document.createElement('p'); p.appendChild(document.createTextNode("Successfully imported data to "+xml.getElementsByTagName('title')[0].firstChild.nodeValue)); msgs.appendChild(p); } else { var p=document.createElement('p'); p.appendChild(document.createTextNode("Failed to import data to "+xml.getElementsByTagName('title')[0].firstChild.nodeValue)); var div=document.createElement('div'); div.setAttribute('class','error'); div.appendChild(document.createTextNode(xml.getElementsByTagName('error')[0].firstChild.nodeValue)); p.appendChild(div); msgs.appendChild(p); } if(xml.getElementsByTagName('img_err').length>0) { var p=document.createElement('p'); p.appendChild(document.createTextNode('Image import warnings:')); msgs.appendChild(p); var ul=document.createElement('ul'); for(var j=0;j<xml.getElementsByTagName('img_err').length;j++) { var li=document.createElement('li'); li.appendChild(document.createTextNode(xml.getElementsByTagName('img_err')[j].firstChild.nodeValue)); ul.appendChild(li); } msgs.appendChild(ul); } i++; if(i>=tid.length) { return; } do_import(ajax,tid,i); } } var params="tid="+tid[i]; ajax[ajax.length-1].setRequestHeader("Content-type", "application/x-www-form-urlencoded"); ajax[ajax.length-1].setRequestHeader("Content-length", params.length); ajax[ajax.length-1].setRequestHeader("Connection", "close"); ajax[ajax.length-1].send(params); }
Soubor stahuju nějak takto:
$c = curl_init($this->_url_cars); curl_setopt($c, CURLOPT_RETURNTRANSFER, 1); if(!$this->_update = curl_exec($c)) { $this->setError('Failed to download update file'); return false; } curl_close($c);Takto získám xml soubor jednoho autobazaru(těch bazarů je víc podle obsahu pole tid) a následuje jeho zpracování do db. Když se dokončí zpracování souboru pošlu do prohlížeče xml hlášení jestli se import podařil, nebo ne. A takové hlášení bych chtěl poslat po zpracování každého auta, aby z toho šel udělat třeba teploměr, že tolik a tolik aut z toho bazaru už je zpracováno.
cometd
, určitě se dozvíte víc.
Kedysi som experimentoval s tým, že som HTTP odpoveď rozdelil na viac častí, ktoré som postupne odosielal, ale spojenie za nimi neuzatváral. Nejak takto:
<?php for ($i=0;$i<=100;$i++) { echo $i."\n"; flush(); sleep(1); } ?>
Bohužiaľ, prehliadače to v prípade normálneho requestu spracujú pekne, ale v prípade requestu cez AJAX to veľa prehliadačov vôbec nepochopilo. Možno to ale dnes už funguje lepšie...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.