Hi, ich habe mir ein kleines Plugin geschrieben welches das Ziel hat eine csv Datei zu erstellen. Über folgenden Code rufe ich meine Funktion auf die mir meine Datei erstellen soll Ext.Ajax.request({ url: '{url action=generateExport}', success: function(response, opts) { var obj = Ext.decode(response.responseText); console.dir(obj); }, failure: function(response, opts) { console.log('server-side failure with status code ' + response.status); } });
Meine Funktion sieht wie folgt aus $this-\>View()-\>setTemplate(); require\_once('./engine/connectors/api/api.php'); $api = new sAPI(); $export =& $api-\>export-\>shopware; $mapping =& $api-\>convert-\>mapping; header('Content-type: text/x-comma-separated-values'); header('Content-Disposition: attachment; filename="export.orders.'.date("Y.m.d").'.csv"'); $orders = $export-\>sGetOrders(); $ordermask = array ( "orderID", "ordernumber", "ordertime" ); $orders = $mapping-\>convert\_array ($ordermask, $orders); $orderIDs = array\_keys($orders); $customers = $export-\>sOrderCustomers(array("orderIDs"=\> $orderIDs)); $customermask = array ( "customernumber", "billing\_company", "billing\_firstname", "billing\_lastname" ); $customers = $mapping-\>convert\_array ($customermask, $customers); $positions = $export-\>sOrderDetails(array("orderIDs"=\> $orderIDs)); $positionmask = array ( "orderdetailsID", "articleID", "articleordernumber", "name", "price", "quantity", "invoice", "releasedate", "tax", "esd", "modus", ); foreach ($positions as $orderID =\>$position) { $tmp[$orderID] = $mapping-\>convert\_array ($positionmask, $position); } $positions = $tmp; $open\_orders = array(); foreach ($orderIDs as $orderID) { if(isset($orders[$orderID])&&isset($customers[$orderID])&&isset($positions[$orderID])) { $orders[$orderID]["count\_positions"] = count($positions[$orderID]); foreach ($positions[$orderID] as $key=\>&$position) { $open\_orders[$position["orderdetailsID"]] = array\_merge($orders[$orderID],$position,$customers[$orderID]); } } unset($orders[$orderID],$customers[$orderID],$positions[$orderID]); } $open\_orders = $api-\>convert-\>csv-\>encode($open\_orders); echo $open\_orders; echo json\_encode(array("result"=\>"true"));
Mein Problem besteht jetzt darin das er mir zwar alle Werte schön zusammen bildet (getestet über echo json_encode) aber mir die eigentliche csv datei nicht zurück gibt. Hoffe mir kann jemand helfen. ------------------------------------------------------------------ Edit Ich habs jetzt mal mit folgenden Code probiert um mir die CSV Datei zu erstellen $Datei = "export/export.csv"; $FilePointer = fopen($Datei, "w"); fwrite($FilePointer, $open\_orders); fclose($FilePointer);
Dies funktioniert auch soweit er legt mir die Datei an mit dem entsprechenden Inhalt. Aber das ist neh nicht so schöne Variante. Weiß zufällig jemand wie ich das direkt an Browser übergeben kann so das die Datei abgespeichert wird vom Client. -------------------------------------------------------------------- Edit Ich hab gerade noch ein Beitrag im Forum gefunden (Forumbeitrag). Wo genau mein Problem gelöst wurde mittels Shopware()-\>Front()-\>Response()-\>setHeader('Content-Type', 'text/x-comma-separated-values', true); Shopware()-\>Front()-\>Response()-\>setHeader('Content-Disposition', 'attachment; filename="export.orders.csv', true);
Leider hab ich dann dennoch keine reaktion -------------------------------------------------------------------- Edit Ich hatte jetzt nochma neh andere Variante probiert. Dies wäre direkt die csv Datei im Ext.Ajax.Request zu bilden mit dem rückgabe wert. var sm = Ext.getCmp('grid').getSelectionModel().getSelections(); var idArray = new Array(); for (i=0; i\<=sm.length-1; i++) { idArray[i]=sm[i].data.ID; } var idJson = Ext.encode(idArray); Ext.MessageBox.wait("Bitte warten...","Die Daten werden exportiert"); Ext.Ajax.request({ url: '{url action=generateExport}', waitMsg: 'Bitte warten...', method: 'POST', params: { id: idJson }, success: function(response, opts) { response.setContentType("text/x-comma-separated-values"); response.setHeader("content-disposition","attachment; filename=export.csv"); response.getWriter().write(obj); Ext.MessageBox.alert("Fertiggestellt", ""); }, failure: function(response, opts) { console.log('server-side failure with status code ' + response.status); } });
Nur leider funktioniert die Variante auch nicht so richtig. bekomme dann immer die Rückgabe das die funktion setContentType nicht exisitiert. Kann mir da niemand helfen? Ich war schon kurz davor einfach neh direkt verlinkung auf die generierte Datei zu machen. Weil der Weg das ich sie in ein Ordner abspeichere funktioniert ja. Bitte um HILFE
Habe den meisten Erfolg mit: ContentType = “text/csv”, wenn es CSV(4180) sein soll aber auch ContentType = “application/CSV”, ist möglich. Je nach dem, was $api->convert->csv->encode() macht, könntest du noch Content-type = “application/vnd.ms-excel” versuchen. Und am Rande… sicher kennst du das Problem von console.log('xyz ’ + response.status); wenn keine console da ist. Gruß