www.hillschmidt.de - Familienhomepage aus Bubenheim/Rheinhessen/Deutschland

Schlecki Ade - mehr Tips zum Strato Shop cgi

Beim Ausmisten / Aufräumen meiner alten Seiten stieß ich diese Seite ... darin beschreibe ich ausführlich, was ich an dem c't Script geändert habe. Weiterhin ohne Gewähr - Rückfragen und Feedback bitte an mich - Danke!

Update 2012:

Mittlerweile gibt es auch Versionen mit Eingabe der Bankverbindung sowie andere Möglichkeiten (SSL, MWSt, Versandkosten, ...), was hier nicht abgehandelt wird - bei Interesse einfach melden!

SCHLECKI - ade!

Das Strato-Shop-cgi: So geht's noch besser!


Wer ein PowerWeb-Paket A oder S bei Strato hat, kann seit Oktober 2004 nun auch eigene Perl-Skripte nutzen (und PHP und SSI und ab PowerWeb S auch SSL und eine MySQL Datenbank). Was also liegt nun näher, als sich das Original-Shopping-Skript zu besorgen, zu verbessern und zu nutzen, völlig unabhängig von Strato?

Gesagt, getan, und hier die Vorgehensweise dazu, mit der Sie Ihre bereits vorhandenen Shop-Dateien auf die neue (und bessere) Situation anpassen können. Vielleicht aber finden Sie das hier Beschriebene so gut, daß Sie dieses Shop-Skript nun doch für Ihre (Strato-)Domain einsetzen wollen? Wer weiß - das müssen Sie entscheiden!

Im Folgenden wird beschrieben:
  • wie das Original-Skript angepasst werden muss, um die minimale Basisfunktionalität auf einem Strato PowerWeb A oder S zu leisten,
  • wie der Euro eingeführt wird,
  • wie ein gescheiter Absender und ein Betreff eingeführt werden,
  • wie das Zahlenformat auf normale Dezimaldarstellung angepasst wird,
  • wie auch der Besteller eine Kopie der Bestellung erhält,
  • wie ein Zusatztext am Ende eingeführt wird,
  • wie die Bestellung komplett über eine sichere Verbindung (SSL) abgewickelt werden kann,

Das Original-Skript wurde in der c't Heft 15 im Jahre 1997, S.290, vorgestellt.
Download s.u..
Link zum dazugehörenden Artikel:  http://www.heise.de/ct/97/15/290 - mittlerweile kostenpflichtig (2,50 €; Stand: Nov. 2012).
Bitte bei Bedarf melden!

Nun denn, wohlgemut ans Werk.

Vorbemerkungen

Die folgenden Ausführungen basieren auf der Annahme, daß Sie die Datei shopping.cgi aus der oben angegebenen .zip-Datei in ein Verzeichnis /cgi-bin/ auf Ihrem PC entpackt haben, und alle anderen Dateien bereits auf Ihrem PC in einem Verzeichnis /shop/ haben (als Bestandsnutzer des Strato-Skriptes). Besser allerdings ist es, die anderen Dateien der .zip-Datei in ein neues Verzeichnis /testshop/ zu entpacken.
Im Folgenden gehe ich nicht auf Veränderungen der Shop-Dateien ein, die Sie gemacht haben, um den Euro-Workaround einzubauen, den ich in dieser Beschreibung empfohlen habe; der Ausgangspunkt sind die Originaldateien, wie sie von der c't und (fast identisch) von Strato geliefert werden.
Als Editor empfehle ich den Freeware HTML-Editor Phase 5.3 von Hans-Dieter Berretz, der unter www.ftp-uploader.de heruntergeladen werden kann. Besonders geeignet für die im Folgenden beschriebenen Aufgaben am HTML- und Perl-Code ist die Funktion "Dateiübergreifend Suchen und Ersetzen (F11)" unter Tools.

  • 1. Kapitel: Die Basisarbeiten

    1. Als erstes nennen Sie im Verzeichnis cgi-bin die Originaldatei shopping.cgi in shopping.pl um.

    2. Der Aufruf shopping.cgi wird anschließend in folgenden Dateien zu shopping.pl geändert:
    • hopper_tpl.html
    • katalogseite01.html und allen anderen Katalogseiten
    • order_tpl.html
    • persdat.html
    Falls Sie mit den Originaldateien der c't arbeiten, müssen Sie gleichzeitig vor den Aufruf des Skriptes /cgi-bin/ einfügen, da Perl-Scripte auf Strato-Domainen nur hier gespeichert werden dürfen. Arbeiten Sie mit den Strato-Dateien, steht /cgi-bin/ bereits vor shopping.cgi bzw. nun vor shopping.pl.

    3. Der Aufruf showHopper wird in den Katalogseiten katalogseite01.html usw. zu showHopper=all geändert.

    4. Der Aufruf showOrder wird in der Datei persdat.html zu showOrder=all geändert.

    5. Der Aufruf sendOrder wird in der Datei order_tpl.html.html zu sendOrder=all geändert.
    Die Änderungen 3.,4.,5. sind notwendig, damit der Parser für Perl als CGI korrekt arbeiten kann (evtl. Strato-spezifisch).

    6. Der String SCHLECKI_ wird in den folgenden Dateien zu SHOP_ oder ähnlichem geändert. Die Cookies heissen dann SHOP_BESUCHER und SHOP_BESTELLUNG und nicht mehr SCHLECKI_BESUCHER und SCHLECKI_BESTELLUNG. BYE, BYE, SCHLECKI!
    • /cgi-bin/shopping.pl
    • danke.html
    • hopper_tpl.html
    • katalogseite01.html und allen anderen Katalogseiten
    • order_tpl.html
    • persdat.html


    7. Im Script shopping.pl wird nun $adressat = "a.schroeter\@hermes.de"; in $adressat = "empfaenger\@IhreStratoWebDomain.de"; geändert. empfaenger\@IhreStratoWebDomain.de kann z.B. sein
    webmaster\@mein_shop.de oder bestellung\@mein_shop.org oder business\@mein_shop.com
    - wie auch immer eine gütige eMail-Adresse auf Ihrer Domain heisst, an die die Bestellungen geschickt werden sollen.
    Wichtig: der Backslash \ nach dem Klammeraffen/at @!

    8. Ebenfalls im Script shopping.pl ändern Sie nun die Zeile $argumente = $ARGV[0]; in $argumente = $ENV{QUERY_STRING}; und ein paar Zeilen tiefer die Zeile
    @parameter = split(/:/,$argumente); in @parameter = split(/=/,$argumente); (ein Zeichen wird anders!).
    Dies ist notwendig, damit Perl die Übergabeparameter korrekt verarbeiten kann.

    9. Zuletzt werden die Verzeichnisse angepasst. Diese Anpassung sieht komplizierter aus als sie ist, aber verschafft zugleich einen immensen Vorteil: Sie können ab sofort mehrere Shops in einer Domain haben! Allerdings hat dann jede ihre eigene shopping.pl-Datei.
    Das ist z.B. handhabbar, indem Sie im Verzeichnis /cgi-bin/ für jeden Shop eine jeweils eigene shopping.pl anlegen, z.B. shop1.pl und shop2.pl, und jeweils auf das Shopverzeichnis mit den Dateien (die ebenfalls angepasst werden müssen!) verweisen.
    Folgende Zeilen werden geändert:

    $shop_location    = "/shop1";    #Verzeichnis des Shops,
     ausgehend von Root Verzeichnis,
                                     #z.B. /shop
    $datatab        = $ENV{DOCUMENT_ROOT} . $shop_location . "/items.csv";          #statt  $datatab = "items.csv";
    $hoptplfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/hopper_tpl.html";    #statt  $hoptplfile = "hopper_tpl.html";
    $hoprowfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/hopper_row.html";    #statt  $hoprowfile = "hopper_row.html";
    $ordtplfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/order_tpl.html";     #statt  $ordtplfile = "order_tpl.html";
    $ordrowfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/order_row.html";     #statt  $ordrowfile = "order_row.html";
    
    
    Nun müssen noch die Verzeichnisse für danke.html und persdat.html angepasst werden: Script und Dateien SUCHEN!!!! ... ... Nach diesen Änderungen sieht das Script an den geänderten Stellen in etwa so aus:
    $argumente      = $ENV{QUERY_STRING};           #statt  $argumente      = $ARGV[0];
    $adressat       = "test\@hillschmidt.de";       #statt  $adressat       = "a.schroeter\@hermes.de";
    $ordrcookie     = "SHOP_BESTELLUNG";            #statt  $ordrcookie     = "SCHLECKI_BESTELLUNG";
    $usercookie     = "SHOP_BESUCHER";              #statt  $usercookie     = "SCHLECKI_BESUCHER";
    $shop_location  = "/shop1";                     #Verzeichnis des Shops,
     ausgehend von Root Verzeichnis,
                                                    #z.B. /shop
    $datatab        = $ENV{DOCUMENT_ROOT} . $shop_location . "/items.csv";          #statt  $datatab = "items.csv";
    $hoptplfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/hopper_tpl.html";    #statt  $hoptplfile = "hopper_tpl.html";
    $hoprowfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/hopper_row.html";    #statt  $hoprowfile = "hopper_row.html";
    $ordtplfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/order_tpl.html";     #statt  $ordtplfile = "order_tpl.html";
    $ordrowfile     = $ENV{DOCUMENT_ROOT} . $shop_location . "/order_row.html";     #statt  $ordrowfile = "order_row.html";
    

    ...

    @parameter = split(/=/,$argumente); #statt @parameter = split(/:/,$argumente);

    Ab sofort ist Ihr Shop funktionsfähig. Allerdings wird immer noch mit DM fakturiert, es fehlen noch ein vernünftiger eMail-Absender der Bestellung und ein vernünftiges "Betreff:", aber auch das kriegen wir schnell hin:
     

  • 2. Kapitel: Unverzichtbare Folgearbeiten

    10. Der Euro (€) wird im Script in zwei Zeilen eingeführt:
    in der Funktion sendOrder etwa in Zeilen 158 und 163 finden sich:
    $insstr .= $namarr[1] . " Stueck " . $tempvalue[1] . " zu je DM ". $tempvalue[2] . " (Summe: DM " . $tmpsum . ")\n"; und
    $insstr .= "\nGesamtsumme: DM $ordsum";
    Daraus wird nun ganz einfach
    $insstr .= $namarr[1] . " Stueck " . $tempvalue[1] . " zu je EUR ". $tempvalue[2] . " (Summe: EUR " . $tmpsum . ")\n"; und
    $insstr .= "\nGesamtsumme: EUR $ordsum";
    Tja, so einfach wäre das auch für Strato gewesen!

    11. Nun fügen Sie im Bereich Glob.Variable: des Scriptes die Variable
    $versender = "webmaster\@hillschmidt.de"; #verschickt die Bestellung
    ein. Genutzt wird die in der Funktion sendOrder, die wir aber etwa in den Zeilen ab 170 fast komplett umbauen. Im Original steht
            open(MAIL,"|mail $email,$adressat");
            print MAIL "BESTELLUNG\n\n";
            print MAIL $name1 . "\n";
            print MAIL $addr1 . "\n";
            print MAIL $addr2 . "\n";
            print MAIL $email . "\n";
            print MAIL "bestellt\n\n";
            print MAIL $mailstring;
            close(MAIL);
    Daraus machen wir
            open(MAIL,"|/usr/lib/sendmail -t ") or die "Cannot open mail: $!";;
            print MAIL "To: " . $adressat . "\n";
            print MAIL "From: " . $versender . "\n";
            print MAIL "Subject: Bestellung von " . $name1 . "\n";
            print MAIL "BESTELLUNG\n\n";
            print MAIL $name1 . "\n";
            print MAIL $addr1 . "\n";
            print MAIL $addr2 . "\n";
            print MAIL $email . "\n\n";
            print MAIL "bestellt\n\n";
            print MAIL $mailstring . "\n\n";
            close(MAIL);
    Mit einer Zeile mehr Bestellung an den Besteller:
            open(MAIL,"|/usr/lib/sendmail -t ") or die "Cannot open mail: $!";;
            print MAIL "To: " . $adressat . "\n";
            print MAIL "Cc: " . $email . "\n";
            print MAIL "From: " . $versender . "\n";
            print MAIL "Subject: Bestellung von " . $name1 . "\n";
            print MAIL "BESTELLUNG\n\n";
            print MAIL $name1 . "\n";
            print MAIL $addr1 . "\n";
            print MAIL $addr2 . "\n";
            print MAIL $email . "\n\n";
            print MAIL "bestellt\n\n";
            print MAIL $mailstring . "\n\n";
            close(MAIL); 

Einen Vorteil jedoch darf man nie vergessen: ist Strato nicht verfügbar, sind es auch nicht die Skripte. Doch umgekehrt kann Frust entstehen: da ist Strato on-line, aber das verlinkte Skript einer anderen Site nicht. Beispiele hat man vielleicht schon selbst beim Surfen erlebt: Gästebücher, die nicht verfügbar sind oder on-line Shops, die temporär nicht erreichbar sind (das gilt auch für kostenlose Strato-Shops, oder ???)

Wenn Sie mit cgi-Skripten von Strato arbeiten, so sollten Sie zunächst die Anleitungen dazu genau lesen und befolgen. Die Links sind: http://www.strato.de/full/service/kundenservice.html bzw. direkt, ohne Login in Ihren Servicebereich, http://www.strato.de/service/allgemein/cgi/.
Wenn Sie Probleme haben, schauen Sie doch erst mal unter http://stratofaq.ig4.de/ nach. Auch ein Blick ins Forum unter http://www.strato-forum.de kann nie schaden.
Eine gute non-Strato-Unterstützung für viele Strato-Skripte bietet http://www.cgisupport.de/.
Und wenn das Problem immer noch nicht gelöst ist, oder Sie nicht suchen wollen, oder aus welchen Gründen auch immer: Sie können ja auch ein eMail an den Support aus Ihrem Kundenbereich schicken....

Wenn dann alles nichts hilft, bleibt dann nur noch die Selbsthilfe.

Äh ???

JA, Sie müssen unter Umständen tricksen!!!!

So ging es jedenfalls mir, als ich endlich vom Strato-Support die Bestätigung erhielt, daß das Shop-cgi derzeit (?) NICHT auf non-.de-Domains läft. Genauer gesagt: die eMail-Funktionalität ist gestört (!?) - es kommen keine Bestell-eMails an!
Danach wurde ich dann mehrere Monate um Geduld gebeten, daß das Problem in Arbeit ist und die Lösung noch ein wenig dauert - bla-bla-bla.

RATSCH ... - das war mein Geduldsfaden, der riß, zumal mein Auftraggeber eine Lösung bis Mai 2002 haben mußte!

Und da kam mir auf einer Autofahrt die Idee: wenn das Skript bis zum eMail-Versand läuft, dann muß es doch möglich sein, das eMail-Skript einzubauen, das ja klappt. Nach einigen Tests fand ich die Lösung! Hier der Trick:

  1. Sie erstellen die Shop-Seiten wie angegeben.
     
  2. Die Datei order_tpl.html ändern Sie wie folgt ab:
    HTML Source Code Anm.
    ...
    
    <!-- <form action="shopping.cgi?sendOrder" method="POST"> -->
    <form action="/cgi-bin/mailmanager.pl" method="POST">
    
    <input type=hidden name="redirect" value="http://Ihre_Strato_Domain/shop/danke.html"></input>
    <input type=hidden name="recipient" value="bestell_eMail_Adresse@Ihre_Strato_Domain"></input>
    <input type=hidden name="subject" value="on-line Bestellung"></input>
    <input type=hidden name="print_config" value="email,realname"></input>
    
    ...
    
    <code><b><input type="text" name="realname" value="<!--NAME1-->" readonly="readonly"></input></b></code><br>
    <code><b><input type="text" name="ADDR1" value="<!--ADDR1-->" readonly="readonly"></input></b></code><br>
    <code><b><input type="text" name="ADDR2" value="<!--ADDR2-->" readonly="readonly"></input></b></code><br>
    <code><b><input type="text" name="email" value="<!--EMAIL-->" readonly="readonly"></input></b></code>
    
    ...
    
    <code><b><input type="text" name="Summe" value="<!--P_SUM_ORD-->" readonly="readonly"></input></b></code>
    
    ...
    
    1
    
    2
    3
    
    4
    5
    6
    7
    
    8
    
    9
    
    
    
    
    10
    
    11
    
    12
    

    Was haben Sie gemacht ? Nun, Sie haben die Elemente wie <!--ADDR1-->, die vom Shop-cgi ersetzt werden, wenn diese Seite aufgerufen wird, als nicht-veränderbare Eingabe-Felder für das eMail-Skript umdefiniert.
    Zwar interpretiert Netscape 4.x das readonly="readonly" nicht, aber der im Cookie enthaltene Wert wird nicht verändert!

  3. Die Datei order_row.html ändern Sie wie folgt ab:
    HTML Source Code Anm.
    ...
    
    <input type="hidden" 
    name="<!--PRODUCT--> | Preis: <!--PRICEPU--> EURO | Anz.: <!--P_PCS_VAL--> | Summe: <!--P_SUM_P_U--> EURO" 
    value=" "></input>
    
    ...
    
    1
    
    

    Hier wird ein verborgenes Feld pro Bestellposition für das eMail-Skript eingefügt.
    WICHTIG: der Name name= muß eindeutig sein - sonst wird im eMail-Skript nur das erste Feld mit demselben Namen übertragen. Dazu können Sie den Feldnamen aus den Elementen <!--PRODUCT-->, <!--PRICEPU-->, <!--P_PCS_VAL-->, <!--P_SUM_P_U--> beliebig zusammensetzen.
    WICHTIG: der Wert value=" " muß angeben werden; mindestens mit einem Blank.

Das ist alles! Ein Bestellmail sieht dann wie folgt aus:

Formulareintraege von
andreas skript (andreas(at)hillschmidt(dot)de) am Freitag,
 12 April,
 2002 um 16:03:04
------------------------------------------------------------------------

email: andreas(at)hillschmidt(dot)de

realname: andreas skript

ADDR1: teststrasse 66

ADDR2: 12345 stratort

==Buchung== 81 Zauberkurs fuer Erwachsene | Preis: 50.00 EURO | Tln.: 1 | Summe: 50 EURO:

Summe: 50

------------------------------------------------------------------------


Diese Lösung lief längere Zeit als Kursbuchungsbestellsystem des VBW Klarenthal und der VBS Schierstein, beide unter Strato gehostet, bis eine Wiesbaden-weite Lösung für alle Bildungsstätten eingeführt wurde.

Übrigens: dieses Vorgehen löst auch das DM-Problem auf Shops unter .de-Domains ...

Und noch ein Trick:

Mit einem einfachen Kniff ist auch der Mini-Shop in der Lage, ein Bestaetigungs-eMail zu schicken:

1. Der Shop ist auf das mailmanager.pl Script umgestellt, wie auf dieser Seite und in den Strato-FAQ beschrieben (wo Strato den Trick wohl her hat).

2. Das order_tpl.html im Verzeichnis shop/ wird wie folgt geaendert:
im <head>-Bereich werden folgende Zeilen eingefuegt:

<script language="JavaScript">
<!--
var eMail="<!--EMAIL-->";
//-->
</script>

3. Im <body>-Bereich wird die Zeile mit dem recipient (<input type="hidden" name="recipient" value="webmaster(at)domain(dot)de"> oder aehnlich) komplett ersetzt mit den Zeilen

<script language="JavaScript">
<!--
document.write("<input type=hidden name=recipient value=webmaster(at)domain(dot)de,"+eMail+"></input>")
//-->
</script>

4. Ferner wird die Zeile <input type="text" name="email" value="<!--EMAIL-->" readonly="readonly"> ersetzt mit den Zeilen

<script language="JavaScript">
<!--
document.write("<code><b><input type=text name=email value=" + eMail + " readonly=readonly></input></b></code><br>")
//-->
</script>

Das wars!

Technischer Hintergrund:

  • das Ersetzen der Zeichenfolge <!--EMAIL--> durch das Strato-Script geschieht nur EINMAL!
  • Daher wird in meinem Workaround die konkrete Absenderadresse des Bestellers einer Variablen zugewiesen.
  • Diese Variable wird im Folgenden benutzt, um dem mailmanager-Script eine ZWEITE Adresse unterzuschieben. Diese Adresse wird mit Komma von der ersten Adresse, die auf einer Strato-Domain liegen muss, getrennt. Die zweite Adresse muss NICHT bei Strato liegen!
  • Von nun an schickt der mailmanager die Bestellung an den Lieferanten (erste Adresse) und an den Besteller (zweite Adresse).

Cool, oder ?

Falls Sie Fragen, Anmerkungen, ... haben: nutzen Sie bitte das Feedback-Formular!

Und: auch diese Seite ist bei Strato gehostet!

Letzte Aktualisierung / last modified: 08/01/2013 [Administrator]
© 1999-2016 Andreas Schmidt
webdesign by beesign / wien
 WebsiteBaker 2.8.3 - Design by beesign / wien
1 User online.
© 1999-2016 Andreas Schmidt

2 User online