oliverbj
oliverbj

Reputation: 6052

PHP - Submit form with ajax, and return XML

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

Answers (1)

TheMisir
TheMisir

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

Related Questions