Plugin Class mit Remote-Service

Das Beispiel zeigt, wie ein Remote-Service über eine Plugin-Class-Methode als Datenquelle für ein Format verwendet werden kann.

Anwendungsbeispiel

Im dem folgenden Beispiel wird über einen fiktiven Remote-Server eine Produktempfehlung für den aktuellen Shop-Kunden per CURL-Call abgefragt. Als Parameter werden das Geschlecht, Alter und die PLZ aus den Kundendaten an den Remote-Service übergeben.
Der Remote-Server liefert hier bpsw. eine Liste von empfohlenen Produkt-Codes zurück, die dann noch mit den lokalen Produkt-Shop-Daten angereichert werden und in einer Standard-Produktlisten-Struktur zurückgegeben werden, damit ein passendes Ausgabe-Formate (Slider, Kachel-List-Views, usw.) das HTML damit erzeugen kann.

 

IN Parameter

Als Parameter kann der Methode ein optionales Parameter-Array übergeben werden. In unserem Beispiel wird nur ein Parameter "quantity" für die Ergebnis Produktanzahl unterstützt.

Denkbar wären hier auch Parameter, mit denen sich die Produktempfehlung für eine Kategorie oder zu einem Produkt steuern lassen.

 

Result Daten

Als Ergebnis Daten liefert die Methode eine Liste von Shop-Produkten zurück. Durch die Verwendung der Standard-Array-Struktur zum Model "ecs_product" als Liste (eList) kann diese Methode mit allen Formaten die für Produktlisten vorhanden sind kombiniert werden! Dies spart Entwicklungszeit und steigert die Wiederverwendbarkeit.

 

Sourcecode

  1. class my_remote_recommendation_service extends ecs_eApplication{
  2. [...]
  3. /**
  4.  * Kunden Produktempfehlung über Remote-Service
  5.  *
  6.  * @param    Array $params optional.
  7.  * [quantity] - Integer, optional (default: 3).  Ergebnis Produktanzahl
  8.  *
  9.  * @return    Array.
  10.  * %r_status_msg%
  11.  * [data] - Array.  ecs_product eList
  12.  *         [<n>][<product-fields>] - Mixed.
  13.  */
  14. public function person_getRecommendedProducts($params=null)
  15. {
  16.     $P = array();
  17.     $R = array('status'=>true, 'msg'=>null, 'data'=>null);
  18.  
  19.     /** ********************************************************
  20.      *
  21.      *      SESSION / User-Data available?
  22.      *
  23.      * Über den "$this->eCS->_sessData" Pointer, der über die Class "ecs_eApplication"
  24.      * vererbt wird, haben wir Zugriff auf die Shop-Session.
  25.      * Unterhalb des "person" Array-Key sind die Kunden-Daten verfügbar, wenn der
  26.      * User als Shop-Kunde identifiziert wurde.
  27.      */
  28.     if (is_array($this->eCS->_sessData['person']['data'])==true){
  29.         /**
  30.          * In den Session-Daten sind die Kunden-Daten vorhanden. Aus den
  31.          * Kunden-Daten werden Geschlecht, Alter und PLZ als Parameter
  32.          * für den Remote-Produktempfehlung übernommen.
  33.          */
  34.         $P[] = 'gender='.urlencode($this->eCS->_sessData['person']['data']['gender']);
  35.         $P[] = 'age='.urlencode($this->eCS->_sessData['person']['data']['drvd_age']);
  36.         $P[] = 'zip='.urlencode($this->eCS->_sessData['person']['data']['zip']);
  37.  
  38.     } else {
  39.         /**
  40.          * Der aktuelle User wurde nicht als Shop-Kunde erkannt. Es fehlen die
  41.          * Parameter für die Produktempfehlung-Abfrage.
  42.          * Alternative zum leeren Result, könnte hier eine Produktempfehlung
  43.          * mit Default-Daten erfolgen.
  44.          */
  45.         return $R;
  46.     }
  47.  
  48.  
  49.     /** ********************************************************
  50.      *
  51.      *      ... use extra eCMS-Function-Parameter (if given).
  52.      *
  53.      * In dem "$params" Array können Parameter für die Datenabfrage übergeben
  54.      * werden. In unserem Beispiel kann die Ergebnis Produktanzahl
  55.      * aus dem Produktempfehlung-Service als Parameter übergeben werden.
  56.      * Wenn kein "quantity" Parameter gesetzt wurde, wird eine
  57.      * Default-Anzahl verwendet.
  58.      */
  59.     if ($params['quantity'] > 0){
  60.         $P[] = 'quantity='.intval($params['quantity']);
  61.     } else {
  62.         $P[] = 'quantity=3';
  63.     }
  64.  
  65.  
  66.     /** ********************************************************
  67.      *
  68.      *      execute remote CURL-CALL
  69.      *
  70.      * Im folgenden wird die Anfrage an den fiktiven Produktempfehlung-Remote-Service
  71.      * über die CRUL-Erweiterung gesendet.
  72.      */
  73.     $ch = curl_init();
  74.     curl_setopt($ch, CURLOPT_URL, 'http://www.example.com/api/recommendation/person?'.implode('&', $P));
  75.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  76.     $text = curl_exec($ch);
  77.     $info = curl_getinfo($ch);
  78.  
  79.     if ($info['http_code'] == 200 && strlen($text) > 0){
  80.  
  81.         /** ********************************************************
  82.          *
  83.          *      enrich ReCo-Result with local eCMS-Product-Data.
  84.          *
  85.          * Die Anfrage war erfolgreich und hat bspw. eine Liste von Produktcodes (durch
  86.          * Komma getrennt) zurückgeliefert.
  87.          * Mit den Produktcodes aus Produktempfehlung-Service wird nun aus dem
  88.          * Shopsystem die vollständige Produktliste abgefragt.
  89.          */
  90.         $prds =  $this->eCS->ecs_product_dsf->product_getListManually(
  91.             array(
  92.                 'pcode_list' => explode(',', $text)
  93.             )
  94.         );
  95.  
  96.         $R['data'] = $prds['data'];
  97.  
  98.     } else {
  99.         /**
  100.          * Die Anfrage an den Remote-Service ist fehlgeschlagen. Über die Methode
  101.          * "log_error" kann detaillierte Fehlermeldung ins Systemlog geschrieben werden.
  102.          * Mit der "msg_error_i18n" Methode wird eine Fehlermeldung mit i18n-Textbaustein
  103.          * erzeugt, die für die Shop-User verwendet wird und übersetzt werden kann.
  104.          * Mit dem "status = false" im Result, meldet die Methode an den Aufrufer zurück,
  105.          * dass ein technischer Fehler aufgetreten ist.
  106.          */
  107.         $this->log_error('Request failed ...');
  108.         $R['msg'][] = $this->msg_error_i18n('recommendation_service_request_failed');
  109.         $R['status'] = false;
  110.     }
  111.  
  112.     return $R;
  113. }
  114. [...]

 

Verwendung

Der folgende Screenshot zeigt Ihnen, wie die Plugin Class Methode als Datenquelle für ein Format in eine Platzhalter-Konfiguration verwendet wird. Als Ausgabeformat wurde in diesem Beispiel ein Produkt-Slider gewählt.

Für weitere Information zu Platzhalter-Konfiguration (PHC) lesen die die Artikel Platzhalterkonfiguration - die Grundlagen und Online Help: Seiten-Inhalt konfigurieren