2016-08-08 31 views
0

Ich versuche eine Methode zu erstellen, um eine CSV-Datei zu erstellen, sie in JSON zu analysieren und sie dann mithilfe ihrer REST-API an BigCommerce zu senden. Anfangs wollte ich Javascript verwenden, um alles zu tun, und alles bis zu BigCommerce, um die Daten zu putten. BigCommerce lässt CORS nicht zu, was zu einer 401-Antwort vom Server führt und keine meiner Daten tatsächlich gesendet wird. Aus diesem Grund würde ich es mit PHP machen, aber das spezifische JSON-Objekt zu bekommen ist viel schwieriger als bei Javascript. Die Lösung, die ich mir ausgedacht habe, wäre, die Daten in Javascript zu analysieren, sie Zeile für Zeile an das PHP-Skript zu senden und das PHP-Skript würde sich dann mit BigCommerce verbinden und es mir schicken.JSON über AJAX an PHP-Skript senden

Erstens, ist das möglich?

Hier einige meiner Javascript-Code:

$(document).ready(function() { 
      $('[type=file]').change(function() { 
       if (!("files" in this)) { 
        alert("File reading not supported in this browser"); 
       } 
       var file = this.files && this.files[0]; 
       if (!file) { 
        return; 
       } 


       i=0; 
       Papa.parse(file, { 
        delimiter: ",", // auto-detect 
        newline: "", // auto-detect 
        header: true, 
        dynamicTyping: true, 
        preview: 0, 
        encoding: "", 
        worker: false, 
        comments: false, 
        step: function(results, parser) { 
         console.log("Row data:", results.data); 
         console.log("Row errors:", results.errors); 
         currentID = results.data[i]["id"]; 
         currentResult = results.data[i]; 
         sendToBC(currentID, currentResult); 
         i+1; 
        }, 
        complete: function(results, file) { 
         console.log("Parsing complete:", results, file); 
         $("#parsed_JSON").css("display", "block"); 
         $("#ready_btn").css("display", "block"); 
         $("#select_file").css("display", "none"); 
         $("#retry_btn").css("display", "block"); 
        }, 
        error: function(error, file) { 
         console.log("Parsing failed:", error, file); 
         alert("Parsing failed. Check file and refresh to try again."); 
        }, 
        download: false, 
        skipEmptyLines: true, 
        chunk: undefined, 
        fastMode: undefined, 
        beforeFirstChunk: undefined, 
        withCredentials: undefined 

       }) 
      }); 

      function sendToBC(id,data) { 
       jQuery.ajax({ 
        type: "PUT", 
        url: "https://store.mybigcommerce.com/api/v2/products/" + id + "/discountrules.json", 
        data: data, 
        xhrFields: { 
         withCredentials: true 
        }, 
        headers: { 
         'Authorization': 'Basic ' + btoa('username:key') 
        }, 
        dataType:"json", 
        async: false, 

        success: function() { 
         alert("success") 
        }, 
        error: function(xhr, status, error) { 
         console.log(error); 
        } 

       }); 
      } 

Sie werden bemerken, ich mit dem i seltsam = 0 und der i + 1 in der Mitte des Papa-Code etwas zu tun hatte, aber das war, weil Ich konnte in der Step-Funktion keine for-Schleife machen.

Mein PHP ist nur die grundlegenden Funktionen curl:

$ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $api_url); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Accept: application/json', 'Content-Length: 0')); 
    curl_setopt($ch, CURLOPT_VERBOSE, 0); 
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_USERPWD, "username:key"); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $complete); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $response = curl_exec($ch); 
    curl_close ($ch) 

I dont haben die meiste Erfahrung mit PHP vor allem mit Übergabe von Werten in es durch AJAX, so würde jede mögliche Hilfe groß sein. Ich bin mir nicht sicher, wie das Übergeben von Werten zwischen den Dateien wirklich funktioniert und wie ich diese Daten am besten programmatisch an PHP senden kann.

Danke.

+0

Anstatt die CSV-Datei in Javascript zu lesen, laden Sie sie in PHP hoch. und dann lassen PHP lesen, analysieren und rufen Sie die API über CURL? – Jeet

+0

Die PHP-Funktion json_encode codiert die Daten korrekt, aber ich kann nicht auf ein einzelnes JSON-Objekt zugreifen, um es an die BigCommerce-API zu senden, was wichtig ist, weil sich die ID für jedes Element ändert. – BMitrano825

+1

'json_encode' wird ein Array in einen' JSON' String umwandeln. Wenn Ihre 'json'-Zeichenkette nicht zu einem' json'-Objekt als '{}' wird. Übergeben Sie dann 'JSON_FORCE_OBJECT' als zweiten Parameter an' json_encode'. Vielleicht ist das, wonach Sie suchen? – Jeet

Antwort

0

In Ordnung, so wie ich es gemacht habe, benutzte ich nur PHP und baute eine JSON-Zeichenfolge mit den Werten, die aus dem Array mit ihrem Schlüssel abgerufen wurden. Also habe ich:

contents[$i]['id'] 

die ID des aktuellen Elements zu erhalten und es in einer Variablen gespeichert und tat, für alle anderen Spalten der CSV. Dann baute ich eine Zeichenfolge wie folgt:

$jsonObject[] = '{"min": '.$min.',"max": '.$max.',"type": "'.$type.'","type_value": '.$value.'}'; 

und schickte sie über die API mit CURL BigCommerce.

0

Betrachtet man ein String-Objekt wie {"id": "77", "min": "1", "max": "6", "price": 10}. und Sie möchten die ID (77) vom Objekt JSON abrufen.

$str = '{"id": "77", "min": "1", "max": "6", "price": 10}'; 
$jsonObj = json_decode($str); 
$jsonObj->id; // the id. 

Hier $jsonObj->id ist die ID, über die Sie Ihre API aufrufen können.

+0

Ja, das ist im Grunde das, was ich am Ende gemacht habe, und habe einfach die JSON-Zeichenfolge selbst erstellt, um sie an die API zu senden. Danke für den Helfer, du hast mich auf den richtigen Weg gebracht. – BMitrano825