Warenkorbfunktionen — Masken aufteilen

Silke Schümann wrote this 13:55:

Warenkorbprozedere

Keep it simple! Wenn man Warenkorbdaten und Adressdaten nicht in einem langen Formular sammeln will, kann man dies auch trennen. Da Versanddaten und Versandkostenberechnung eng verknüpft sind, macht es Sinn die Versandkosten ein Stückweit vom Warenkorb zu separieren. Nun verlangt der Gesetzgeber transparenz bei den Angaben der Kosten. Es genügt also nicht, irgendwo darauf hinzuweisen, dass noch Versandkosten mit dem Betrag XY hinzukommen. Teure komplex geschriebene Shops haben hier mit Datenbanken und Schnickschnack meist auch keine besseren Lösungen als das was im letzten Post dargestellt ist. Das einfachste ist also nach dem Warenkorb Liefer- / Rechnugnsanschrift und Zahlungsbedingungen zu erfassen und im Anschluß noch einmal alle Daten in einer Seite darzustellen, die z.B. wie eine Rechung (Lieferschein) gestaltet sein kann, bei der der Kunde nun nur noch bestätigt, dass die Angaben stimmen und die AGB akzeptiert werden und der letzte Knopf ist dann die Bestellung. An dieser Stelle kann sich der Kunde die Daten auch noch einmal ausdrucken, sollte er probleme mit seinem E-Mailfach haben, wird er für diese Option dankbar sein.

Mit dieser getrennten Lösung sollte auch die Verwaltung der Daten im Zusammenhang mit der Ausgabe einfacher sein, denn man kann so leichter die Module der Zwischenspeicherung, Berechnung und Auswertung sowie der Ausgabe in einzelne fast eigenständige Programmteile unterteilen.

Programmierung für Versandkosten planen

Silke Schümann wrote this 03:44:

Transportbedingungen

  1. Maße und Gewichte
    Unser Shop sammelt diese Informationen nicht, doch er kann einzelnen Artikeln einen Versandkostenaufschlag zuweisen.
  2. Artikel die keine Versandkosten produzieren
  3. Versandwege
  4. Versandmenge (Anzahl der Artikel)
  5. Aufrtagsvolumen

Wo und wann werden diese Versandkosten gesammelt?

  1. Direkt beim Artikel (Punkt 1 und 2 s.o.)
  2. Am Ende der Bestellliste (Restlichen Punkte)

Wie wirken sich die Faktoren auf die Versandkosten aus?
Welche Fälle gilt es zu unterscheiden?

Zunächst einmal betrachten wir die Fallunterscheidungen:
Fallunterscheidungen Versandkosten

Unterschieden werden muss auch noch ob bei Aufschlag noch weitere Informationen eingeholt werden müssen.

Anschließend heißt es die Fallunterscheidungen abzuarbeiten. Das einfachste ist es mit dem Sonderfall keine Versandkosten anzufangen, denn dann kann man sich alles Rechnen sparen. Anschließend prüft man ob die Bedingungen für die Basiskosten gegeben sind und wenn hier keine Sonderfälle also Aufschläge vorliegen, kann man die Basiskosten ausgeben und dem Bestellwert addieren und schließlich gilt es die Sonderfälle mit den Aufschlägen abzuarbeiten:
Programmplanung Versankosten

Bei den Aufschläge gilt es zu unterscheiden zwischen einem Aufpreis, der den bisherigen Kosten zugeschlagen also addiert wird, einem Faktor, über den die bisher ermittelten Versandkosten sich erhöhen und einem Versandkostenbetrag, der den ermittelten Betrag ersetzt.

Den Versandradius könnte mit einem Faktor vernünftig abgedeckt werden. Artikelmengen hingegen dürften Addition oder Ersetzen sinnvoll erscheinen lassen. Eine Möglichkeit hier dem Shopbetreiber die Entscheidung zu überlassen ist es, lediglich den Rahmen vorzugeben und die Bezeichungen der Umgang mit den ermittelten Versandkosten dem Shopbetreiber zu überlassen, so wie das z.B. beim cpFormhandler in Bezug auf Formulare gelöst ist. Damit hat man die größtmögliche Flexibilität und die zig verschiedenen Sonderfälle mit denen unterschiedliche Händler mit unterschiedlichen Warensortimenten mit einem Schlag abgedeckt.

Zu Unterscheiden ist auch, ob noch Informationen eingeholt werden müssen. Glücklicher Weise kommen hier nur drei Formular-Varainten in Frage: Selektfelder, Radiobutton oder Checkboxen und man kann sich überlegen hier die Auswahl gurndsätzlich noch einzuschränken.

Linktipp Javascript: Event-Listener

Silke Schümann wrote this 17:31:

Das scheint auch noch merkenswert zu sein, auch wenn ich im Moment keinen Nerv dafür habe:

  1. Digg-Style Animated Sliding Comment Box
  2. OOP in JS, Part 1 : Public/Private Variables and Methods
  3. Video: Douglas Crockford on Advanced JavaScript
    Besser noch ist diese Quelle, da hier auch die Powerpoint-Präsentationen dabei sind: The JavaScript Programming Language

Nachtrag: nachdem ich Zweidrittel des ersten Videos des dritten Links dieses Posts gesehen hatte, fand ich es Wert nach Douglas Crockford im Netz zu suchen. Und seine Seite ist fantastisch. Nicht nur von der Art wie er sich darauf darstellt, auch vom Informationsgehalt der Seite. Das ist hier also nun der ultimative Linktipp: Douglas Crockford

Thematisch hierzu noch die Javascript-Sektion der Site: Douglas Crockford on Javascript

… und die Objektfunktion aus dem Video noch einmal zum nachlesen: Prototypal Inheritance in JavaScript

PPS: Hihihi: Naaaaiiiiice! :D
Douglas Crockford on DOM, heute schon Mosaik-Browser und Netscape 1 bedient?
<-- //--> Das war vor 10 Jahren relevant. language="Javascript x.x" sollte man ebenfalls nicht verwenden [!] und bei externen Scripts ist auch type=text/javascript überflüssig, weil sowieso vom Browser ignoriert. :-)

Gut zu wissen.

Javascript DOM Linktipp: Slideshow-Tutorial

Silke Schümann wrote this 19:40:

Barierrarmes Javascript verwendet einen einfachen Trick um Dinge ein- und auszublenden. Wenn im Stylesheet eine Klasse definiert ist, die in der HTML-Seite nicht existiert stört das nicht weiter. Also formatiert man zunächst eine Liste so wie diese ohne Javascript erscheinen soll. Dann ergänzt man diesen Elementen via Javascript eine eigene Klasse und definiert mit dieser erweiterten Klasse die Elemente in der Seite im selben Stylesheet schlicht nocheinmal neu, positioniert diese neu, blendet sie aus und andere ein und kann diese Elemente per Eventhandler bewegen oder anzeigen, umfärben und anderes mehr.

Ein Tutorial wie das konkret aussieht anhand einer Galerie fand ich hier: A detailed explanation how to create a maintainable dynamic slide show in JavaScript

Sehr wertvoller Linktipp für alle, die wie ich Javascript noch nicht 100% beherrschen und diese wenn überhaupt barrierarm einbinden wollen, für alle, die dieses hohe Level von Javascript erreichen wollen und für alle die Scripts anbieten möchten für Personen, die dieses Script einsetzen sollen ohne sich wirklich mit Javascript auszukennen.

Danke schon an Christian Heilman. Sein Buch ist mit Sicherheit auch eine gute Anschaffung. Ich jedenfalls gönne mir diese Buch nun.

Nützliche Javascript-Links: DOM Eventhandler

Silke Schümann wrote this 18:54:

Je mehr ich mich in Programmierung einmische, desto stärker … öfter bin ich auf der Suche nach eine Lösung. Manche Dinge benötige ich dabei immer wieder, wie z.B. eine Funktion starten wenn die Seite geladen ist und zwar ohne in der HTML-Struktur mit onload und anderen Eventhandlern zu sauigeln.

Und wenn man das dann gelesen hat, kommt der mühsame Weg es selbst in eigene funktionen zu übertragen … *seufz*

Und dann sollte man diesen Link nicht verlegen … :-) : Object Literal – Warum neuere Skripte anders aussehen

Nachtrag: Scripts schreiben, die mit andern Scripts gut können durch Namespacing: Namespacing your JavaScript, sprich Namen wo es geht privat lassen und global schreiben, ihnen sozusagen einen eigenen Raum geben.

Das e mit dem Krönchen im IE6

Silke Schümann wrote this 13:16:

Der IE6 lässt die Tschechen im Stich. Nicht dass der IE6 nicht die Maskierung &#277; verstünde, das ein e mit Krönchen bzw. dem vertikal gespiegelten “Accent Dächle” ê darstellt wird vom IE6 genau einmal auf einer Seite dargestellt, ansonsten zeigt es ein olles leeres Schächtelchen. Ich bitte also die Tschechen um Verzeihung. Aber da ist ein einfaches e der Lesbarkeit doch dienlicher.
Kleines e mit Kroenchen
Update: Es scheint als sei der iE mit &#277; nicht einverstanden und hätte gerne stattdessen: &#283; sososo.

Die Reptilienbörse Ulm lädt also nun in fünf Sprachen ein, u.a. in Tschechisch.

Alles in allem ging selbst eine so sonderzeichenlastige Sprache wie Tschechisch recht problemlos umzusetzen. Es ist etwas umständlich zu schreiben da viele der Zeichen über Copy&Paste in die Seite gemogelt werden müssen. Es fehlt einfach der Ascii-Wert für die meisten Buchstaben mit Krönchen. Ansonsten aber ist das arbeiten mit dem Plugins cpSprache für Editland bequem und einfach.

Update: Wenn man den Zeichensatz ändert, klappts auch mit dem Nachbarn. Tschechisch erfordert im IE6 — Maskierung hin oder her — UTF8 oder Windows-1250. Da UTF-8 aller wahrscheinlichkeit noch weitreichendere Anderungen erfordert hätte, habe ich erst einmal Windows-1250 genommen, den Standard, den man auch auf tschechischen Seiten findet. Etwas umständlich gestaltet sich noch die Eingabe, wenn keine tschechische Tastatur verwendet wird. Die Sonderzeichen gibt man dann direkt in Editland via copy&paste ein. Das beste ist es also, dem tschechischen Übersetzer direkt Zugang zur Präsenz zu geben.

Nun muss noch in Editland bei den Formulareingaben der Doctype und Charset via Variable gesetzt werden und schon sollte man auch die Menübezeichnungen der Navigation korrekt widergeben können. Kommt mehr Zeit, kommt auch hier noch das letzte Quentchen Perfektion

Planen, testen und liefern — eine echte Freude

Silke Schümann wrote this 10:35:

Eben mache ich für einen Kunden eine weitere Spracherweiterung und öffne den Ordner der Sprachverwaltung und es prangt mir schon in knallegelb auf der ersten Seite ein dicker Hinweis entgegen, dass neue Sprachen hinzugekommen sind.

Hier hat jemand mitgedacht. Claudia Reiser zeichnet sich unteranderem dadurch aus, dass Sie mitdenkt und ihre Plugins gründlich alle Eventualitäten abklappern. Wenn Sie mir Dinge in Bata zusendet sind diesen selten so Beta sondern sehr oft schon ziemlich Alpha.

Ich arbeite verflucht gerne mit Claudia Reiser von creisi production zusammen. Das musste hier mal geschrieben werden.

Danke, Claudia!

PHP beginnt Spaß zu machen

Silke Schümann wrote this 19:39:

Peut a peut wird PHP selbstverständlich und erleichtert die Arbeit. Statt lange Listen mit mit Vorschauthumbs und Großansichten zu schreiben, kann man derlei Routinen bequem mit ein wenig PHP abkürzen. Auch beginnt eine Sammlung von kleine Skripten sich in die Arbeit einstellen, wie, z.B. die Funktion callError. Ist der Entwurf fertig, wird nun gemäß einer einfachen Konvention abgespreichert und eine Index samt der Designvorschläge in ein Verzeichnis geworfen.

Zunächst einmal werden die Seiten angelegt:

  1. $_GET['e'] = isset($_GET['e']) ? $_GET['e'] : '0' ;
  2. $e = preg_match("/^[0-9]+$/i", $_GET['e']) ? $_GET['e'] : callError('invalidCharacters','');

Die Seite hat eine interne Kommunikations-Funktion zwischen mir und Kunden. Die Unterseiten werden per Mausklick auf Minivorschaubilder aufgerufen. D.h. ein ausgereiftes Urldesign ist nicht nötig. Mir genügt eine fortlaufende Nummer, und diese Nummer wird gleichgesetzt mit dem Key eines Arrays. Der Array wird erzeugt, in dem alle PNG-Bilder eingelesen werden und ohne deren Erweiterung in einen Array mit Namen ‘piclist’ geschubst werden:

  1. $piclist = array();
  2. foreach (glob("*.png") as $filename) {
  3. array_push($piclist, substr($filename,0,-4));
  4. }

Mit diesen beiden Zeilen ist schon die halbe Arbeit getan. Jetzt muss nur noch an geeigneter Stelle im HMTL ein wenig PHP fallen gelassen. Z.B. für die Navigation per Vorschaubildchen:

  1. <p class="links">
  2. <? foreach($piclist as $key => $picname){
  3. echo '<a href="index.php?e='.$key.'"><img src="thumb_'.$picname.'.jpg" alt="'.ucfirst($picname).'"><br />'.ucfirst($picname).'</a>';
  4. } ?>
  5. <br class="clear" /></p>

Nachdem ich nur den Kern des Bildnamens behalte, kann ich nun gemäß einer mit mir vereinbarten Konvention wieder in die Seite einführen, sei es als thumb_Bildname.jpg, über eine einfache PHP-Funktion, die den ersten Buchstaben groß schreibt, erhalte ich zum Thumb noch eine Dateibezeichnung, auf die man sich beziehen kann.

Fehlt nur noch die große Ansicht zum Thumb. Über die globale PHP-Variable via URL übergebe ich den Key in der eckigen Klammer. Den Link habe ich oben in der Schleife angelegt (?e=$key wird hier ausgegeben $arrayname[$key]):

  1. <p class="preview"><img src="
  2. <? echo $piclist[$e].'.png'; ?>" alt="<? echo ucfirst($piclist[$e]); ?>"><br /><strong><? echo ucfirst($piclist[$e]); ?>
  3. </strong></p>

Schlicht. Einfach und effektiv hat man in Minuten eine ganze Galerie erzeugt. Natürlich war das Ergebnis heute nicht in Minuten fertig, schließlich soll es auch gut aussehen und so verbringt man mit dem CSS und dem drumherum noch ein wenig Zeit. Nichts desto trotz. Einmal erstellt, wird diese Seite nun ein kleiner Dauerbrenner in der Auftragsbesprechung per Mail und Telefon. Sicherlich wird noch die eine oder andere Sache ergänzt. z.B. eine Shoutbox oder ein Mailformular, oder auch eine Kommentarfunktion zu den Bildern, so dass die Seite noch stärker ein Auftragsbesprechungsmodul wird. Für’s erste freue ich mich, dass ich für diese kleinen Skripte nicht mehr nachdenken muss.

PS: da über die Url Code in eine Seite eingeschleust werden könnte, wird $_GET['e'] nicht direkt in der Ausgabe verwendet.$piclist[$_GET['e']]. als erstes durchläuft daher die Variable $_GET[ ] eine Filter, der alles verhindert, das nicht eine Zahl von 0 bis 9 ist.

Neuen Titel erhalten: die Blogberaterin :harr:

Silke Schümann wrote this 22:46:

Ich habe also erstmals von Kundenseite den Titel Blogberaterin erhalten, doch würde ich sagen, hatte Herr Schoolmann von Abseits.de mehr Anteil am Werden von diesem Blog. Herzlich Willkommen in der Community.

Spät merkt sie’s, doch sie merkt es.

PHP-Arger mit Array_slice

Silke Schümann wrote this 05:21:

Fast angekommen … die folgende Funktion scheint zu funktionieren. Doch glücklicher oder trauriger Weise erwischte ich beim Test-Array eine Variation, bei der es eben nicht funktioniert. :-( Die verflixte 13 … siehe kleine Demo: Kapitelnummern

Ich habe in dem Programmcode darauf verzichtet, die in der Minidemo verwendete Ausgabe ebenfalls aufzuführen. Die Buchstaben A-C stehen für jeweils zuständige die If-Klausel, es folgt das aktuelle Array-Element, dann die daraus ermittelte Ebene und schließlich die erzeugte Kapitelnummer. (more…)