Hallo
Um einem externen System (einer der Warenwirtschaft vorgeschalteten Software) mitzuteilen daß eine neue Bestellung eingegangen ist, möchte ich ein PUSH-Modul bauen. Dieses soll bei abgeschlossener Bestellung einfach nur eine URL mit ein paar Parametern (oder einem JSON-Array) aufrufen.
Dazu habe ich mir gedacht ich könnte thankyou.php erweitern:
<?php
class enzThank extends enzThank_parent{
public function init(){
[...]hier der Code der originalen init-Methode[...]
pushOrderToTheDing();
}
private function pushOrderToTheDing(){
$url = 'http://subdomain.domain.tld:PORT';
$fields = array('orderid' => $this->_oOrder->getOrderId(),
'oderdate' => $this->_oOrder->getOrderDate(),
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
}
}
?>
Wird das so funktionieren oder bin ich komplett falsch?
Danke.
Johannes
Hallo Johannes 
um bei der Überladung der Thankyou Klasse die Überladungskette aufrecht zuerhalten, erweitert man bestehende Methoden über den Parent-Aufruf
public function init(){
parent::init();
pushOrderToTheDing();
}
Ansonsten heißt es testen, testen und testen ob alles wie gewünscht funktioniert + korrekten Werte übermittelt werden.
Viele Grüße
indianer3c
Hallo indianer3c
Danke für Deine Nachricht und die Erklärung. Natürlich hast Du recht mit dem parent::init(); So werde ich es probieren!
Anscheinend möchte mein Modul nun alles richtig machen. Allerdings findet die init-Methode meine pushOrderToTheDing-Methode nicht? Stehen doch beide in der Klasse drin?!
Johannes
EDIT:
<?php
/**
* Adding a curl-Request to "theDING"-Software
*/
class enzThank extends enzThank_parent{
public function pushOrderToTheDing(){
$url = 'http://irgendwo-im-nirgendwo.com';
$fields = array('orderid' => $this->_oOrder->getOrderId(),
'orderdate' => $this->_oOrder->getOrderDate(),
); //geht so noch nicht...
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}
curl_close($ch);
}
/**
*
* @return null
*/
public function init() {
parent::init();
self::pushOrderToTheDing();
}
}
?>
so funktioniert erstmal der Aufruf der Methode.
Jetzt fehlen mir nur noch OrderId und OrderDate in der Methode…
Hallo
ich bin ein wenig weitergekommen, doch leider noch nicht am Ende.
Vorranging lag das Problem darin, daß der Warenkorb von thankyou::init() zerstört wird. Also muß meine eigene Methode VOR der originalen init-Methode aufgerufen erden.
<?php
class enzThank extends enzThank_parent{
public function pushOrderToTheDing(){
$url = 'subdomain.domain.tld:port';
$orderID = $this->getSession()->getBasket()->getOrderId();
$fields = json_encode(array('orderid' => $orderID ));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json","Content-Length: ".strlen($fields)));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
$result = curl_exec($ch);
if ($result === FALSE) {
die('Curl failed: ' . curl_error($ch));
}else{
var_dump($result);
}
curl_close($ch);
}
/**
*
* @return null
*/
public function init() {
self::pushOrderToTheDing();
parent::init();
}
}
?>
Problem1: obwohl die Variable $oderID den richtigen Wert hat, ist der gesendete Content leer.
Problem2: es wäre schöner die OXORDERNR anstelle der OXID ausgeben zu können.

