XML per Klick generieren und per POST versenden

Hallo,

ich entwickle zurzeit ein Modul für den OXID eShop, durch das bei einem Klick auf einen Button im Warenkorb ein XML-String generiert werden, und per HTTP-POST an eine URL versendet werden soll.
Das funktioniert inzwischen auch alles soweit, allerdings habe ich das Problem, dass das XML jedes Mal neu generiert wird wenn der Warenkorb geöffnet oder aktualisiert wird.

Hier ist der Code für meinen Button:


<form action="[{$oView->getPunchOutBrowserFormPostUrl()}]" method="post">
        <input type="hidden" name="cxml-base64" value="[{$oView->getPunchOutOrderMessage()}]">
        <button type="submit" class="submitButton largeButton nextStep">[{ oxmultilang ident="EXPORT_CXML" }]</button>
</form>

Mir ist klar dass auf diese Art und Weise bei jedem Aufruf des Warenkorbs der komplette Inhalt durch Smarty gerendert wird.

Wie kann ich es erreichen, dass erst beim Klick auf den Button das XML generiert, und der Nutzer trotzdem an die unter action angegebene URL weitergeleitet und das XML per POST gesendet wird?

Ich habe bereits einige Stunden hier im Forum nach Lösungen gesucht und kam zu dem Ergebnis dass es irgendwie mit JavaScript und Ajax zu realisieren sein müsste. Allerdings reichen meine (quasi nicht vorhandenen) JavaScript Kenntnisse nicht aus um einen Weg zu finden wie ich überhaupt anfangen kann.

Vielen Dank im Voraus.
Houree

<form action="[{ $oViewConf->getSelfLink() }]" method="post">
		<input type="hidden" name="cl" value="punchme">
		<input type="hidden" name="fnc" value="getPunchOutOrderMessage">
        <button type="submit" class="submitButton largeButton nextStep">[{ oxmultilang ident="EXPORT_CXML" }]</button>
</form>
class punchme extends punchme_parent
{
	public function getPunchOutOrderMessage()
	{
	$generiereURL= $wasauchimmer;
	oxRegistry::getUtils()->redirect($generiereURL, false);
	}
}

“punchme” als Bsp. für eine eigene Klasse. Wenn Du eine bestehende Klasse erweitert hast, passe cl entsprechend an.

Erst einmal (wenn auch wegen der Feiertage etwas verspätet) vielen Dank für deinen Tipp.

Mit deinem Vorschlag habe ich schon etwas herumprobiert bevor ich die Frage hier im Forum gestellt habe, aber es ist immer daran gescheitert dass ich diese PunchOutOrderMessage per HTTP-POST mitsenden muss.

Ist die mit

oxRegistry::getUtils()->redirect($generiereURL, false);

überhaupt möglich? Wenn ja, konnte ich nicht herausfinden wie.

Grüße
Houree

In der Form sendest alles an die Methode getPunchOutOrderMessage()

Darin kannst natürlich auch Formfields empfangen:
Bsp:

<input type="text" class="textbox"  name="punchoutordermessage" value=...

=>

$punchoutordermessage = oxRegistry::getConfig()->getRequestParameter("punchoutordermessage");

$generiereURL = “https://www.google.de”;

Ich glaube wir reden aneinander vorbei.

Bei folgendem Beispiel


$punchoutordermessage = "blablabla";
$generiereURL = "https://www.google.de";
oxRegistry::getUtils()->redirect($generiereURL, false);

muss ich den Inhalt von $punchoutordermessage beim Redirect auf https://www.google.de dorthin per POST mitsenden.

Achso, da erst beim Absenden die XML-Datei geschrieben werden soll, würde ich es in etwa so mit cURL machen:


$generiereURL = "https://www.google.de";
$punchoutordermessage = oxRegistry::getConfig()->getRequestParameter("punchoutordermessage"); // oder z.B. die generierte XML-Datei
$data = array('punchoutordermessage' => $punchoutordermessage);

$handle = curl_init($generiereURL);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_exec($handle);

Wenn ich es nach deiner Beschreibung mit CURL mache und das Form wie folgt in die .tpl-Datei schreibe:


<form action="[{ $oViewConf->getSelfLink() }]" method="post">
		<input type="hidden" name="cl" value="punchme">
		<input type="hidden" name="fnc" value="getPunchOutOrderMessage">
        <button type="submit" class="submitButton largeButton nextStep">[{ oxmultilang ident="EXPORT_CXML" }]</button>
</form>

“hängt” die Zielseite quasi sofort in meinem Warenkorb. Die Funktion getPunchOutOrderMessage wird also auch nicht erst beim Klick aufgerufen. Oder habe ich da jetzt eine Kleinigkeit übersehen?

Dann muss man das noch ein wenig erweitern:

$handle = curl_init($generiereURL);
curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($handle, CURLOPT_POST, true);
curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
curl_exec($handle);  
return curl_getinfo($handle, CURLINFO_EFFECTIVE_URL);

Kannst ja auch selbst mal schauen, wie cURL verarbeitet wird.

Das hat leider auch nicht geholfen. Aber danke für deine Bemühungen.
Ich habe auch schon einige Male an der Stelle mit CURL experimentiert, aber kam nie weiter. Ich glaube das Problem besteht darin, dass alle Funktionen die direkt in der .tpl-Datei erwähnt werden automatisch aufgerufen werden wenn die Seite gerendert wird. Schon bevor ich auf den entsprechenden Button klicke.

Daher denke ich dass ich in irgend einer Form mit AJAX hantieren muss.

Inzwischen sieht mein Form so aus:


<form>
        <button type="submit" onclick="test('[{$oViewConf->getSslSelfLink()}]');" class="submitButton largeButton nextStep">[{ oxmultilang ident="EXPORT_CXML" }]</button>
</form>

Zuvor habe ich meine JavaScript-Datei inkludiert:


[{oxscript include=$oViewConf->getModuleUrl('hre_cxmlinterface','out/src/js/scriptfile.js')}]

scriptfile.js sieht wie folgt aus:


function test(link)
{
    var url = link + "cl=punchin";
    
    $.ajax({
        url: url,
        type: "POST",
        data: {
            fnc : "getPunchOutOrderMessage"
        },
        success: function(data)
        {
            console.log('JA');
        },
        error: function()
        {
            console.log('NEIN');
        }
    });
}

Auch hier habe ich schon einiges im Forum gelesen und herumprobiert, aber leider bekomme ich in der Konsole immer NEIN, also den error-Fall angezeigt.

Also ich habe das mal kurz getestet. Wenn Du hiermal einen Artikel in dem WK legst und im WK auf den Button “ERROR: Translation for EXPORT_CXML not found!” unter gutscheincode klickst, wirst Du weitergeleitet. Die Klasse basket habe ich mit der Methode erweitert.

Ajax wäre für mich hier unangebracht.

Mit obigem bleibt die URL bestehen, mit folgendem hast den Wechsel.

$handle = curl_init();
	curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($handle, CURLOPT_POST, true);
	curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
	curl_exec($handle);
	curl_close($handle);
	header('Location: http://4102.foxido.de/admin/');
	exit();