Reputation: 6052
I am having troubles submitting my form using jQuery/AJAX, and returning a success message + the XML file (generated in PHP).
This is what I have now:
invoice.php
:
<form method="post" id="invoiceform">
<? /* Populate the form with input later on. For now, the XML data is hardcoded in PHP */ ?>
<button type="submit">Submit form</button>
</form>
//Submit the form:
$('#invoiceform').on('submit', function(e) { //use on if jQuery 1.7+
e.preventDefault(); //prevent form from submitting
e.stopImmediatePropagation(); //prevent double.
//Show the loading message.
$form = $(this);
// Use Ajax to submit form data
$.ajax({
url: '/api/invoice/invoice_converter',
type: 'POST',
data: $form.serialize(),
dataType: "json",
success: function(data) {
console.log(data);
if (data.result == 'success') {
//Success
$(".status").html(data.message);
} else {
$(".status").html(data.message);
}
},
error: function(data) {
console.log("Something went wrong!");
console.log(data);
}
});
return false;
});
OK so, above simply submits the form to below page
invoice_converter.php
:
$invoice = new Invoice;
if($_POST)
{
$convertInvoice = $invoice->convertInvoice();
if($convertInvoice == 1){
$error = "Error: Error message goes here.";
$stop = true;
}
if($stop){
$result = array("result" => "error","message" => $error);
}else{
$result = array("result" => "success","message" => $convertInvoice);
}
}
header('Content-type: application/json');
echo json_encode($result);
So, above page handles return messages. The actual XML generating function is located in below page
functions.php
:
function convertInvoice(){
/* create a dom document with encoding utf8 */
$domtree = new DOMDocument('1.0', 'UTF-8');
/* create the root element of the xml tree */
$xmlRoot = $domtree->createElement("xml");
/* append it to the document created */
$xmlRoot = $domtree->appendChild($xmlRoot);
$currentTrack = $domtree->createElement("track");
$currentTrack = $xmlRoot->appendChild($currentTrack);
/* you should enclose the following two lines in a cicle */
$currentTrack->appendChild($domtree->createElement('charge','letter'));
$currentTrack->appendChild($domtree->createElement('description','Payable cover letters'));
$currentTrack->appendChild($domtree->createElement('charge','vat'));
$currentTrack->appendChild($domtree->createElement('description','Payable VAT'));
/* get the xml printed */
$xml = $domtree->saveXML();
return $xml;
}
The data returned from above in the console.log is this:
<?xml version="1.0" encoding="UTF-8"?>
<xml>
<track>
<charge>letter</ charge >
<description>Payable cover letters</ description >
<charge>vat</ charge >
<description>Payable VAT</ description >
</track>
</xml>
Which is correct, however, I want to be able to "Save" the above in a XML file, and make it available for the user to download.
Upvotes: 3
Views: 1305
Reputation: 4279
You need make a writable file and write $xml to file.
This code create track.xml and inserts download link to document.
Open file with write (create if not exists) mode using fopen
then write contents to file using fwrite
then close it using fclose
. The file must be placed inside public directory to make sure it's accessible by web server.
// Open file and write contents
$file = fopen('track.xml', 'w+');
fwrite($file, $xml);
fclose($file);
// Generate download link
echo '<a href="/path/to/track.xml" download>Download</a>';
Note: You need to make sure output directory is writeable by PHP using:
chown www-data:www-data /var/www/path/to/output
chmod 775 /var/www/path/to/output
Upvotes: 2