TWebShop2: Unterschied zwischen den Versionen
Root (Diskussion | Beiträge) |
|||
(51 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 55: | Zeile 55: | ||
* Modul: php5 mcrypt (Linux: kann man über yast hinzuinstallieren) | * Modul: php5 mcrypt (Linux: kann man über yast hinzuinstallieren) | ||
* Modul: php5 interbase (Linux: mehr infos dazu in [[PHP]]) | * Modul: php5 interbase (Linux: mehr infos dazu in [[PHP]]) | ||
* Modul: php5 | * Modul: php5 memcached (Linux: mehr Infos dazu in [[Linux.memcached]] | ||
=== OrgaMon XML-RPC Server (Konsolenanwendung) === | === OrgaMon XML-RPC Server (Konsolenanwendung) === | ||
Zeile 79: | Zeile 79: | ||
Dort setzten Sie den haken "Cookies akzeptieren"<br> | Dort setzten Sie den haken "Cookies akzeptieren"<br> | ||
'''Kontrolle, ob der Mozilla die Cookies akzeptiert:''' Extras->Einstellungen->Reiter "Datenschutz"->Cookies anzeigen->Als Suchbegriff " | '''Kontrolle, ob der Mozilla die Cookies akzeptiert:''' Extras->Einstellungen->Reiter "Datenschutz"->Cookies anzeigen->Als Suchbegriff "index" eintragen->Es müssen 2 Cookies angezeigt werden->"c_user" und "PHPSESID" mit der Gültigkeit "c_user"=24 h und "PHPSESSID"=Bis zum Ende der Sitzung.<br> | ||
=== i_config.inc.php5 === | === i_config.inc.php5 === | ||
Zeile 129: | Zeile 128: | ||
=== Datenbank-Restore, Mandantverzeichnis === | === Datenbank-Restore, Mandantverzeichnis === | ||
=== Netbeans | === Netbeans === | ||
Ich empfehle Netbeans als PHP5-IDE zu verwenden. Die Software ist ausgereift und kostenlos. Das Debugging ist auf der Höhe der Zeit. Der TWebShop hat eine FirePHP Anbindung, mit dem Gespann Firefox sind somit Consolenausgaben möglich. Die TWebShop-Session ist noch nicht ganz geklärt, das ist noch eine offene Baustelle, hier kann ev. viel Information eingespart werden. | |||
* Voraussetzung: Java-Installationen | * Voraussetzung: Java-Installationen | ||
Zeile 141: | Zeile 142: | ||
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk | http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk | ||
* Netbeans PHP Bundle | * Netbeans 8.0.1 HTML5 & PHP Bundle | ||
http://netbeans.org/ | http://netbeans.org/ | ||
Zeile 156: | Zeile 157: | ||
Das PHP-Projekt liegt im Unterverzeichnis TWebShop. | Das PHP-Projekt liegt im Unterverzeichnis TWebShop. | ||
=== config.php edtieren === | |||
Versuche mit der Netbeans IDE gleich mal das Verzeichnis ./TWebShop als Projekt zu öffnen. Die config.php muss auf Deine Wünsche angepasst werden. | |||
=== Firefox === | === Firefox === | ||
Zeile 183: | Zeile 188: | ||
der webshop kann danach mit http://localhost/twebshop/ angesteuert werden | der webshop kann danach mit http://localhost/twebshop/ angesteuert werden | ||
==== PHP Modul Interbase ==== | ==== PHP Modul Interbase ==== | ||
Zeile 235: | Zeile 225: | ||
=== memcache Server starten === | === memcache Server starten === | ||
wer einen Linux Server am laufen hat: [[Linux. | # wer einen Linux Server am laufen hat: [[Linux.memcached]] | ||
# wer unter Windows entwickelt, startet einfach das Windows Binary http://orgamon.net/OrgaMon-Umgebung/PHP-Developer/memcached-1.2.6win32-bin.zip .Es erscheint eine schwarze DOS Box (zuvor noch der Warnhinweis dass Port 11211 nun geöffnet wird, das ist OK!). Die DOS Box bleibt solange der Server läuft. | |||
=== XMLRPC Server starten (cOrgaMon.exe im OrgaMon-Programmverzeichnis) === | === XMLRPC Server starten (cOrgaMon.exe im OrgaMon-Programmverzeichnis) === | ||
== Services == | == Services == | ||
Zeile 253: | Zeile 242: | ||
ermöglicht das Erstellen von .eml Dateien für [[Newsletter]]. | ermöglicht das Erstellen von .eml Dateien für [[Newsletter]]. | ||
== Shop | == Die Philosophie des TWebShop == | ||
um Erweiterungen ohne grösseres Kopfzerbrechen bewerkstelligen zu können finden sich hier Infos zu den verwendeten Software-Technologien des Shops. Auch die innerhalb der Programmierung verwendete Terminologie wird festgelegt. | |||
=== Shop - Templates === | |||
der WebShop kann durch benutzerspeziefische Templates (Umstellung in der config.php "TWEBSHOP_TEMPLATE") in seiner Erscheinung und Funktion angepasst werden. In der Standard-Konfiguration läuft der shop mit dem Template "twebshop". Alle Templates werden zusammen mit der normalen TWebShop-Installation mitgeliefert. Pro Installations-Verzeichnis lässt sich immer nur ein Template aktiv nutzen, alle Templates befinden sich im Unterverzeichnis "./templates". | |||
=== HTML - Templates === | |||
Hat der Admin ein Shop-Template festgelegt nutzt der Shop ab diesem Moment ./templates/~TWEBSHOP_TEMPLATE~/ als Arbeitsverzeichnis. Dort befindet sich ein zentrales style.css. | |||
==== passiver Anteil ==== | |||
Dort befinden sich s_*.html - Dateien als Vorlage für die html-Ausgabe. Darin sind Platzhalter (eingeschlossen durch "~") die das monolitische Skript durch ermitteltes Wissen ersetzt. | |||
==== aktiver Anteil ==== | |||
sind noch Definitionen oder Berechnungen nötig, so kann die Datei i_template_*.inc.php5 dazugestellt werden. | |||
=== Lazy Singelton Klassen === | |||
Der Webshop ist eigentlich ein monolitisches Skript das sich an der aktuellen Session und der aktuellen URL orientiert. Dieses eins Skript wird immer komplett durchlaufen und füllt HTML-Templates dabei mit Leben. Die Wissensermittlung läuft nach dem "Lazy" Konzept ab: Eine PHP-Klasse (z.B. $user, $cart, $shop, $orgamon) wird als Singelton Klasse Instanziert, sie macht aber im Moment noch nichts, da nicht klar ist was heute überhaupt ansteht. So kontaktiert die Klasse $ibase nicht den Datenbankserver solange kein SQL Statement angefragt wird. Diese Klassen sollte also im create() Fall einfach nichts tun! | |||
=== Caching Methods === | |||
* Solange das Objekt lebt soll nicht mehrfach die Datenbank nach Eingenschaftswerten gefragt werden. (nur EIN-Mal) | |||
* Will jemand ein Objekt, aber die Eigentschaft ist uninteressant soll nicht die Datenbank gefragt werden (lazy Konzept) | |||
* Ist die Eigentschaft "leer" (=false) ist die Eigenschaft bestimmt, unbestimmt ist ===NULL | |||
class tarticle { | |||
# Ein Caching Element, das eine Eigenschaft zwischen | |||
# speichern soll. Sie ist mit NULL initialisert nimmt | |||
# aber später den Typ des Elements an. | |||
# | |||
protected $image_r = NULL; | |||
public function getImage_R() { | |||
global $ibase; | |||
# es muss mit "===" Initialisiert werden, da | |||
# image_r auch ein array() sein kann, das ist ein | |||
# Array mit Null elementen und bei PHP ist "array()==NULL" | |||
if ($this->image_r===NULL) { | |||
$ibase->query( | |||
"select RID from DOKUMENT where (MEDIUM_R=" | |||
. TWEBSHOP_ARTICLE_MEDIUM_R_IMAGE . ") and (ARTIKEL_R=$this->rid)"); | |||
$data=$ibase->fetch_object(); | |||
if ($data) { | |||
$this->image_r = $data->RID; | |||
} else { | |||
$this->image_r = false; | |||
} | |||
$ibase->free_result(); | |||
} | |||
return $this->image_r; | |||
} | |||
} | |||
=== Debugmethoden === | |||
* http://www.firephp.org/ ist Teil des Shops, nutze also firefox und firebug. Ausgaben in die Console sind goldwert! | |||
* Nutze die xdebug von Netbeans, Setzen von Breakpoint sind goldwert! | |||
=== Datei Nameskonventionen === | === Datei Nameskonventionen === | ||
Zeile 289: | Zeile 345: | ||
1) Das HTML-Template für alle Bestellschritte: | 1) Das HTML-Template für alle Bestellschritte: | ||
./templates/ | ./templates/prod2008*/s_order.html | ||
Dieses enthält wiederum Platzhalter für ganze Objekte (~OBJ_*~), wie z.B. die Warenkorbtabelle in der Bestellübersicht | Dieses enthält wiederum Platzhalter für ganze Objekte (~OBJ_*~), wie z.B. die Warenkorbtabelle in der Bestellübersicht | ||
Zeile 295: | Zeile 351: | ||
Diese Platzhalter werden aus den jeweiligen Klassen-Templates | Diese Platzhalter werden aus den jeweiligen Klassen-Templates | ||
./templates/ | ./templates/prod2008*/i_template_*.inc.php5 | ||
befüllt. | befüllt. | ||
Zeile 324: | Zeile 380: | ||
also ein Zusammenspiel der Dateien 1) bis 4). | also ein Zusammenspiel der Dateien 1) bis 4). | ||
=== | === Namespace - System === | ||
man kann mehrere WebShops an einem einzelnen OrgaMon-Mandanten betreiben. Im OrgaMon werden dabei alle Artikel verwaltet. Der einzelne WebShop "sieht" jedoch nur eine gewisse Auswahl an Artikeln. Für die Suche im Webshop sind dann nur die passenden Teilmengen sichtbar. So kann in einem WebShop ein gewisses Sortiment ausgeblendet werden. | |||
==== | ==== rote Liste ==== | ||
Für alle Namespaces (ausser "intern") gilt ein Ausschluss folgender Artikel: | |||
== | select | ||
ARTIKEL.RID | |||
from | |||
ARTIKEL | |||
where | |||
(ARTIKEL.WEBSHOP='N') or | |||
(ARTIKEL.SORTIMENT_R in (select RID from SORTIMENT where WEBSHOP='N')) | |||
==== Namespace "intern" ==== | |||
* Er ist für die globale Artikel-Suche in OrgaMon->Beleg und in OrgaMon->Artikel | |||
* dies ist der fest eingestellte vollumfängliche Namespace, er kann nicht über "System.WebShop.intern.OLAP.txt" definiert werden | |||
* hier sind 100 % der Artikel ohne Einschränkungen auffindbar | |||
==== Namespace "abu" ==== | |||
* Ist kein "System.WebShop.abu.OLAP.txt" vorhanden werden alle Artikell in diesen Namespace aufgenommen | |||
* der Umfang ist dann 100 % der Artikel jedoch ohne die "rote Liste" - Artikel | |||
==== weitere, frei definierbare Namespaces ==== | |||
Der Artikelumfang der Shops wird dabei über verschiedene System-OLAPs gesteuert: | |||
Im System-OLAP-Verzeichnis werden mit folgender Maske alle Namespaces gesucht | |||
System.WebShop.*.OLAP.txt | |||
die | * für jeden weiteren Suchindex wird ein OLAP benötigt, das die beteiligten Artikel RID als Ergebnis liefert | ||
System.WebShop.~Namespace~.OLAP.txt | |||
* ~Namespace~ ist auch ein System-Parameter des WebShops | |||
* bei der Ziffer "2" im Namespace (für "sekundär") wird ein eingeschränkter Wortraum (nur mit LAUFNUMMER) bei der Erzeugung benutzt | |||
** Dabei wird auf die Felder CODE, NUMERO, VERLAGNO, SORTIMENT_R, SERIE, BEM, GATTUNG verzichtet, dafür ist "LAUFNUMMER" im Suchindex | |||
=== Logik Bedingtes HTML === | === Logik Bedingtes HTML === | ||
Zeile 468: | Zeile 516: | ||
bei mehreren Namespaces MÜSSEN wir meiner Meinung nach eine externe Artikel-Image url anbieten (die ggf. lokal liegen kann), da sonst alle ./images/upload-Verzeichnisse gedoppelt werden müssten. Oder mit einem Symbolischen Link unter linux versehen werden müssen. Im Moment wäre mir so ein H:\delphi\Bilder\ irgendwie sympatisch ... | bei mehreren Namespaces MÜSSEN wir meiner Meinung nach eine externe Artikel-Image url anbieten (die ggf. lokal liegen kann), da sonst alle ./images/upload-Verzeichnisse gedoppelt werden müssten. Oder mit einem Symbolischen Link unter linux versehen werden müssen. Im Moment wäre mir so ein H:\delphi\Bilder\ irgendwie sympatisch ... | ||
==== Systemparameter ==== | |||
=== Remote Shop === | |||
* der Remote-Shop wird mit Hilfe einer MySql Datenbank betrieben (Datenbasis) | |||
* <i>Artikelbilder ist unklar / bitte dokumentieren</i> | |||
* Demoaufnahmen (*.mp3) werden via FTP in ein spezielles Verzeichnis hochgeladen | |||
Dieser Datenabgleich ist automatisiert und hier: [https://github.com/Andreas-Filsinger/OrgaMon/blob/master/OrgaMon/WebShopConnector.pas] im Quelltext offengelegt. | |||
==== Datenbasis ==== | |||
* Voraussetzungen: | |||
** Es muss der Systemparameter "ShopKey=" gesetzt sein | |||
** Es muss ein OLAP "Artikel.des.Webshop" geben | |||
* OrgaMon->WebShop->Reiter "WebShop MySQL" | |||
** Button "Einzeltest" bei "Laufnummer setzen" (dies stellt sicher dass alle Artikel eine Laufnummer haben) | |||
** Button "Einzeltest" bei "MySQL Dump erzeugen" | |||
** FTP-Schritt manuell: | |||
*** Alle "mysql.dump-*.txt" -Dateien von ./Diagnose/ in den Shop ins Verzeichnis /db/ hochladen | |||
** Button "Einzeltest" bei "DB umschalten" | |||
==== Demo-Aufnahmen ==== | |||
* Voraussetzungen: | |||
** Es muss der Systemparameter "ShopKonto=" gesetzt sein | |||
** Es muss ein OLAP "Artikel.des.Webshop" geben | |||
** Es muss ein OLAP "Musik aus externen Links" geben | |||
* OrgaMon->WebShop->Reiter "WebShop Medien" | |||
** Manuelles FTP: | |||
*** Abwahl der beiden Haken "FTP Upload", "FTP Delete" | |||
*** Starten mit "hochladen & verlinken" | |||
*** anhand der Datei .\Diagnose\Remote-WebShop-FTP.csv den Verzeichnisabgleich durchführen | |||
*** FTP seitig ist das Medien-Verzeichnis im Systemparameter ShopKonto= der 4. Parameter [[Systemeinstellungen#ShopKonto]] | |||
=== Apache konfigurieren === | === Apache konfigurieren === | ||
Zeile 517: | Zeile 601: | ||
* Über Windows das Setup-TWebShop_Dev-1.027.exe (aktueller Entwicklungsstand [[http://cargobay.orgamon.de/TWebShop_Dev.html hier]]) ausführen, z.B. in das Verzeichnis "neu" | * Über Windows das Setup-TWebShop_Dev-1.027.exe (aktueller Entwicklungsstand [[http://cargobay.orgamon.de/TWebShop_Dev.html hier]]) ausführen, z.B. in das Verzeichnis "neu" | ||
* Nun die Konfigurationsdatei editieren. | * Nun die Konfigurationsdatei editieren. | ||
== Design Überblick == | == Design Überblick == |
Aktuelle Version vom 27. März 2019, 15:51 Uhr
TWebShop2 ist die zentrale Webserver-Logik des OrgaMon. Clients können so mit Hilfe eines Browsers Dienste des OrgaMon nutzen. TWebShop2 ist in PHP 5 geschrieben und konnektiert direkt auf die Datenbank des jeweiligen OrgaMon-Mandanten. Des weiteren ist der Webshop über ein XMLRPC - Interface an einen ständig laufenden OrgaMon-Server-Prozess angebunden um eCommerce-Funktionen im OrgaMon anzustossen. Der Webshop hat Zugriff auf Artikel-Bilder über Verzeichnisse, die zentral im OrgaMon verwaltet werden. Logik-Redundanzen sind weitgehend ausgeschlossen, da der Webshop direkt an den XMLRPC Serverprozess gebunden ist: Somit bestehten keine Buchungsunterschiede ob Transaktionen direkt im OrgaMon oder über den Webshop durchgeführt werden.
Installation für Shop-Betreiber
es wird PHP5 und Apache2 vorausgesetzt. Die Datenbankverbindung muss möglich sein, ein XMLRPC Prozess muss auf einem Windows System dauerhaft laufen. cOrgaMon.exe kann auch unter http://www.winehq.com betrieben werden.
Apache Webserver
- aktuellste Version des Apache von http://www.apache.org downloaden.
- http://httpd.apache.org/download.cgi ->Download Adresse Stand:18.02.06
Verwendete diesen Link vom apache 2.0 , da von 2.2 anscheinend noch keine Version für Windows vorliegt: http://apache.easy-webs.de/httpd/binaries/win32/apache_2.0.55-win32-x86-no_ssl.msi
- Download auf dem Desktop speichern und ausführen.
- bei Installation Standardeinstellungen verwenden
- Hintergrund: der Apache-Webserver stellt die Anfrage an den Computer, dass andere Rechner auf diesen zugreifen können. Dies wird von der Windows-Firewall möglicherweise verhindert, worüber man auch informiert wird. Diese Nachricht beantworte man mit "nicht blocken", damit der Apache-Webserver voll funktionsfähig ist.
- der Apache-Webserver sollte jetzt funktionsfähig sein (testen im Web-Browser mit eingabe von http://localhost)
- zum Test ob der Apache-Webserver funktioniert, einfach im Internetexplorer "localhost" ein geben. Wenn der Server funktioniert, erscheint der Schriftzug:"Es klappt! (It Works!) Der Apache-Webserver ist auf dieser Website installiert.
- Wird auf dem Rechner auch Skype regelmäßig benutzt, so müßen die Einstellungen von Skype derart geändert werden, dass dieses nicht mehr Port 80 verwendet, sonst kann es zwischen Apache und Skype zu Kollisionen kommen. Hierzu müssen beim Skype folgende Einstellungen durchgeführt werden: Aktionen -> Optionen -> Erweitert -> Verbindung -> Ports 80 und 443 als Alternative für eingehende Verbindungen verwenden; beim letzten Menüpunkt muss der Hacken entfernt werden.
- Nach der Installation der Apache Software ist das Startmenü um einen Eintrag reicher.
->Dort kann man unter anderem die Apache-Konfigurations Datei "httpd.conf" editieren. ->die "httpd.conf"-Datei ist unter "Startmenü\Alle Programme\Apache HTTP Server(z.B.)2.0.55 \Configure Apache Server" zu finden.
- den Eintrag "DocumentRoot=" sollte man auf das Verzeichnis setzen in dem die "index.html"
oder eine andere Index-Datei der Homepage liegt, die geservt werden soll.
->den Eintrag <Directory= > sollte man auf das gleiche Verzeichnis setzen.
- Wir nehmen an, dass PHP auf dem Rechner im Verzeichnis "C:\Programme\PHP" installiert ist (siehe vorheriges Kapitel).
- Jetzt wird die Apache-Konfigurations-Datei "httpd.conf" im Editor (Notepad) geöffet und
ans Ende werden(für PHP5) diese drei Zeilen eingefügt:
LoadModule php5_module "c:/programme/PHP/php5apache2.dll" AddType application/x-httpd-php .php PHPIniDir "C:/Programme/PHP"
Nach diesen Änderungen sollte PHP unter Apache laufen. Ob PHP funktioniert, sieht man, wenn man das im Anhang vorhandene Skript "phpinfo.php" aus dem Browser (nicht per Doppelklick) aufruft, während der Apache Server läuft. Dann wird eine Seite mit allen PHP-Informationen angezeigt. Auch der Pfad in dem PHP die "php.ini" erwartet.
- Weitere Informationen zur Installation von PHP stehen in der Datei "C:\Programme\PHP\install.txt".
mod_rewrite
wird benötigt für sprechende Artikel-Links.
PHP
PHP-Systemvoraussetzungen:
- >=PHP 5.3.x, im Moment PHP 5.5.x empfohlen
Zusatzmodule, die nicht in der Standard-Installation aktiv sind
- Modul: php5 mcrypt (Linux: kann man über yast hinzuinstallieren)
- Modul: php5 interbase (Linux: mehr infos dazu in PHP)
- Modul: php5 memcached (Linux: mehr Infos dazu in Linux.memcached
OrgaMon XML-RPC Server (Konsolenanwendung)
Diese Non-GUI-Server Anwendung ist Teil jeder OrgaMon Installation. Die Anwendungsdatei befindet sich in normalen OrgaMon-Programm Verzeichnis und trägt den Dateinamen cOrgaMon.exe. cOrgaMon.exe ist aus dem selben Code-Respository erstellt wie OrgaMon.exe. Beide Programme teilen sich die gleich Quellcode-Basis. Im Moment ist lOrgaMon.exe in Arbeit, der XMLRPC Server für linux, compiliert mit FreePascal. Als 3. Option startet man den normalen GUI-OrgaMon und darin den XMLRPC-Server (WebShop->Reiter "XMLRPC Server" -> Start)
erster Login
Systemanforderungen beim Benutzer/Client
Der benutzte Browser muss Cookies annehmen und speichern. Das heisst es wird dem Browser im Moment des Login eine eindeutige Zeichenfolge übermittelt die Sie während einer Anmeldung immer als den gleichen Benutzer ausweist. Diese Cookies sind keine schädlichen Viren oder ähnliches und können problemlos aktiviert werden.
- Internet Explorer
Extras->Internetoptionen->Datenschutz: Hier sollte die Stufe "Mittel" eingestellt sein.
- Mozilla Firefox
Starten Sie den Firefox
Wählen Sie das Menü - Extras - Einstellungen
Dann den Reiter "Datenschutz" - Cookies
Dort setzten Sie den haken "Cookies akzeptieren"
Kontrolle, ob der Mozilla die Cookies akzeptiert: Extras->Einstellungen->Reiter "Datenschutz"->Cookies anzeigen->Als Suchbegriff "index" eintragen->Es müssen 2 Cookies angezeigt werden->"c_user" und "PHPSESID" mit der Gültigkeit "c_user"=24 h und "PHPSESSID"=Bis zum Ende der Sitzung.
i_config.inc.php5
<?php
define("TWEBSHOP_ID","01");
define("TWEBSHOP_TITLE","Neu WebShop");
define("XMLRPC_HOST","OrgaMonPC");
define("XMLRPC_PORT","3049");
define("XMLRPC_NAMESPACE","abu");
define("EMAIL_ADMIN","ich@schopbetreiber.de");
include_once("i_default_config.inc.php5");
?>
- Es reicht also die folgenden 5 Einstellungen vorzunehmen. Alle weiteren Einstellungen werden vom OrgaMon über die Funktion "BasePlug" übermittelt.
connections.php.inc
# # define ("eMailDevelopment","phpfreak@domain.tld"); define ("eMailWebmaster","phpfreak@domain.tld"); define ("eMailShop","phpfreak@domain.tld"); define ("eMailMiniScore","phpfreak@domain.tld");
der Webshop sucht die Person, die im Feld EMAIL die angegebene eMailAdresse eingetragen hat.
in der Regel benutzt der WebShop das Mail-Out System des OrgaMon. Falls es irgendwann wieder Probleme mit dem Maildienst geben sollte, der WebShop kann per Konstante (true/false) auf SMTP Mail aus eigener Kraft umgestellt werden, sofern die Zugangsdaten in der connections.inc.php korrekt sind.
Installation für Shop-Entwickler
OrgaMon Installation
installieren Sie auch das neueste Update.
Firebird 32bit DB-Super-Server
die Standard-Installation verwendet den firebird-embedded-Server. Für die Web-Entwicklung ist jedoch ein "ordentlicher" Server notwendig, da mehrere Programme auf den Server zugreifen (Multiuser-Betrieb). Also cOrgaMon und Apache->php_interbase->fbclient. Die OrgaMon ini muss auch so umgebaut werden dass auch der "Hostname" mit im DataBaseName vorkommt, dadurch schaltet die Client-Bibliothek von embedded auf remote-BEtrieb.
Datenbank-Restore, Mandantverzeichnis
Netbeans
Ich empfehle Netbeans als PHP5-IDE zu verwenden. Die Software ist ausgereift und kostenlos. Das Debugging ist auf der Höhe der Zeit. Der TWebShop hat eine FirePHP Anbindung, mit dem Gespann Firefox sind somit Consolenausgaben möglich. Die TWebShop-Session ist noch nicht ganz geklärt, das ist noch eine offene Baustelle, hier kann ev. viel Information eingespart werden.
- Voraussetzung: Java-Installationen
1) Java Runtime: jre-7u25-Installation:
http://java.com/en/download/manual.jsp
2) Java Software Developement Kit: jdk-7u25-Installation:
http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html#javasejdk
- Netbeans 8.0.1 HTML5 & PHP Bundle
svn - Checkout
Installieren Sie zunächst Tortoise SVN.
Erstellen Sie auf Ihrem üblichen Dokumentverzeichnis ein Verzeichnis "OrgaMon-Dev" (Beliebig anderer Name) möglich. Rechter Mausklick auf dieses Verzeichnis und SVN-Checkout. Die Adresse ist
svn://orgamon.net/orgamon-7/
Das PHP-Projekt liegt im Unterverzeichnis TWebShop.
config.php edtieren
Versuche mit der Netbeans IDE gleich mal das Verzeichnis ./TWebShop als Projekt zu öffnen. Die config.php muss auf Deine Wünsche angepasst werden.
Firefox
- mache Firefox zu deinem Standard-Browser
- installiere das Plugin FireBug
xampp 1.8.3
Alias twebshop einrichten
- Im XAMPP COntrol Panel bei "Apache" den "Config" Button -> Apache (httpd-xampp.conf)
# # Suche den Abschnitt in dem verschiedene Aliase definiert werden # Hinzu kommt. Ersetze den Pfad korrekt, verwende Linux-Slashes ansteller der BAckslashes # ### twebshop ### Alias /twebshop "C:/Users/Thorsten/Documents/RAD Studio/Projekte/OrgaMon/TWebShop/" <Directory "C:/Users/Thorsten/Documents/RAD Studio/Projekte/OrgaMon/TWebShop"> AllowOverride AuthConfig Require all granted </Directory> ### twebshop ###
der webshop kann danach mit http://localhost/twebshop/ angesteuert werden
PHP Modul Interbase
das Modul liegt im WAMP comiliert bei, ist aber nicht aktiv (1.8.3 ist aktiv!). ACHTUNG: Die Extension startet nicht, wenn der Loadup von php_interbase.dll keine fbclient.dll findet. Es wird scheinbar im Suchpfad gesucht, am besten eine fbclient.dll nach C:\Windows\System32 kopieren ...
Bei einem 64Bit Windows und eine 32Bit fbclient.dll muss die fbclient.dll nach C:\Windows\SysWOW64 kopiert werden, da das Verzeichnis C:\Windows\System32 für 64Bit dlls reserviert ist, S. hierzu auch: http://msdn.microsoft.com/en-us/library/windows/desktop/aa384187%28v=vs.85%29.aspx
Alternativ bittet sich ein eigenes Verzeichnis für die benötigten dlls an - die Umgebungsvariable Path muss dann um dieses Verzeichnis erweitert werden.
- Im XAMPP Control Panel bei "Apache" den "Config" Button -> PHP (php.ini)
# # den Kommentar (;) vor Extension=php_interbase.dll entfernen #
xdebug aktivieren
- Im XAMPP Control-Panel bei "Apache" den "Config" Button -> PHP (php.ini)
# # Entferne 2 Kommentare (1. bei der DLL, 2. bei xdebug) # [XDebug] zend_extension = "C:\xampp\php\ext\php_xdebug.dll" ;xdebug.profiler_append = 0 ;xdebug.profiler_enable = 1 ;xdebug.profiler_enable_trigger = 0 ;xdebug.profiler_output_dir = "C:\xampp\tmp" ;xdebug.profiler_output_name = "cachegrind.out.%t-%s" xdebug.remote_enable = 1 ;xdebug.remote_handler = "dbgp" ;xdebug.remote_host = "127.0.0.1" ;xdebug.trace_output_dir = "C:\xampp\tmp"
memcache Server starten
- wer einen Linux Server am laufen hat: Linux.memcached
- wer unter Windows entwickelt, startet einfach das Windows Binary http://orgamon.net/OrgaMon-Umgebung/PHP-Developer/memcached-1.2.6win32-bin.zip .Es erscheint eine schwarze DOS Box (zuvor noch der Warnhinweis dass Port 11211 nun geöffnet wird, das ist OK!). Die DOS Box bleibt solange der Server läuft.
XMLRPC Server starten (cOrgaMon.exe im OrgaMon-Programmverzeichnis)
Services
Personen individuell aktivierbar sind einzelne Services. Diese erscheinen dann beim Kunden in "myShop". Ein Service wird bei ->Person im Reiter "Internet Dienste" im Feld "Dienste und Parameter" durch folgende Texteintragungen aktiviert.
TPicUpload=JA
ermöglicht das Uploaden von Artikel-Bildern. siehe TPicUpload
Newsletter=JA
ermöglicht das Erstellen von .eml Dateien für Newsletter.
Die Philosophie des TWebShop
um Erweiterungen ohne grösseres Kopfzerbrechen bewerkstelligen zu können finden sich hier Infos zu den verwendeten Software-Technologien des Shops. Auch die innerhalb der Programmierung verwendete Terminologie wird festgelegt.
Shop - Templates
der WebShop kann durch benutzerspeziefische Templates (Umstellung in der config.php "TWEBSHOP_TEMPLATE") in seiner Erscheinung und Funktion angepasst werden. In der Standard-Konfiguration läuft der shop mit dem Template "twebshop". Alle Templates werden zusammen mit der normalen TWebShop-Installation mitgeliefert. Pro Installations-Verzeichnis lässt sich immer nur ein Template aktiv nutzen, alle Templates befinden sich im Unterverzeichnis "./templates".
HTML - Templates
Hat der Admin ein Shop-Template festgelegt nutzt der Shop ab diesem Moment ./templates/~TWEBSHOP_TEMPLATE~/ als Arbeitsverzeichnis. Dort befindet sich ein zentrales style.css.
passiver Anteil
Dort befinden sich s_*.html - Dateien als Vorlage für die html-Ausgabe. Darin sind Platzhalter (eingeschlossen durch "~") die das monolitische Skript durch ermitteltes Wissen ersetzt.
aktiver Anteil
sind noch Definitionen oder Berechnungen nötig, so kann die Datei i_template_*.inc.php5 dazugestellt werden.
Lazy Singelton Klassen
Der Webshop ist eigentlich ein monolitisches Skript das sich an der aktuellen Session und der aktuellen URL orientiert. Dieses eins Skript wird immer komplett durchlaufen und füllt HTML-Templates dabei mit Leben. Die Wissensermittlung läuft nach dem "Lazy" Konzept ab: Eine PHP-Klasse (z.B. $user, $cart, $shop, $orgamon) wird als Singelton Klasse Instanziert, sie macht aber im Moment noch nichts, da nicht klar ist was heute überhaupt ansteht. So kontaktiert die Klasse $ibase nicht den Datenbankserver solange kein SQL Statement angefragt wird. Diese Klassen sollte also im create() Fall einfach nichts tun!
Caching Methods
- Solange das Objekt lebt soll nicht mehrfach die Datenbank nach Eingenschaftswerten gefragt werden. (nur EIN-Mal)
- Will jemand ein Objekt, aber die Eigentschaft ist uninteressant soll nicht die Datenbank gefragt werden (lazy Konzept)
- Ist die Eigentschaft "leer" (=false) ist die Eigenschaft bestimmt, unbestimmt ist ===NULL
class tarticle { # Ein Caching Element, das eine Eigenschaft zwischen # speichern soll. Sie ist mit NULL initialisert nimmt # aber später den Typ des Elements an. # protected $image_r = NULL; public function getImage_R() { global $ibase; # es muss mit "===" Initialisiert werden, da # image_r auch ein array() sein kann, das ist ein # Array mit Null elementen und bei PHP ist "array()==NULL" if ($this->image_r===NULL) { $ibase->query( "select RID from DOKUMENT where (MEDIUM_R=" . TWEBSHOP_ARTICLE_MEDIUM_R_IMAGE . ") and (ARTIKEL_R=$this->rid)"); $data=$ibase->fetch_object(); if ($data) { $this->image_r = $data->RID; } else { $this->image_r = false; } $ibase->free_result(); } return $this->image_r; } }
Debugmethoden
- http://www.firephp.org/ ist Teil des Shops, nutze also firefox und firebug. Ausgaben in die Console sind goldwert!
- Nutze die xdebug von Netbeans, Setzen von Breakpoint sind goldwert!
Datei Nameskonventionen
- index.php5: Zentrales und einziges PHP-Skript das Apache direkt anspricht
- viewer.php5: Zeigt HTML Dokumente
- s_*.inc.php5 : s für SITE, enthält den auszuführenden Code für die Seite *, dabei wird * nur bis zum ersten "_" ausgewertet. Die weitere Bezeichnung enthält die *
Beispiel: http://host/index.php5?site=myshop&subsite=order_state würde das PHP-Skriptp
s_myshop_order_state.inc.php5
includen.
- a_*.inc.php5 : a für ACTION, die vom User angestoßen wird (z.B. Artikel in den Einkaufswagen legen, Bestellung abschicken,...)
- i_*.inc.php5 : i für INCLUDE: eine Datei, die keinen Code ausführt, sondern nur (Funktions- oder Konstanten-) Definitionen enthält
- p_*.inc.php5 : p für PHP: eine Datei, die einen Code für einen bestimmten Zweck (*) ausführt
- l_*.inc.php5 : l für LANGUAGE: eine Datei, die Sprachbausteine für die Sprache * enthält
subsite:
- t_*.inc.php5 : t für THORSTEN (in Anlehnung an TVISION von Borland Pascal 7.0): eine Datei, die eine oder mehrere Klassendefinition(en) enthält
In einem Unterverzeichnis von Template:
- i_template.inc.php5 : enthält den Namen des Templates
- i_template_*.inc.php5 : eine i_*.inc.php5, die Templates für die jeweilige Klasse * enthält
- s_*.html : Template für s_*.inc.php5, also das Template der Seite *
- h_*.html : ein Header-Template
- f_*.html : ein Footer-Template
Am Beispiel der Bestellschritte
1) Das HTML-Template für alle Bestellschritte:
./templates/prod2008*/s_order.html Dieses enthält wiederum Platzhalter für ganze Objekte (~OBJ_*~), wie z.B. die Warenkorbtabelle in der Bestellübersicht im letzten Bestellschritt. Diese Platzhalter werden aus den jeweiligen Klassen-Templates
./templates/prod2008*/i_template_*.inc.php5
befüllt.
2) Skript zur Anzeige (Befüllen der Templates und darin enthaltenen, bereits bekannten Platzhalter) aller Bestellschritte:
./s_order.inc.php5
Diese Datei untersucht 1) und bindet dann die jeweiligen - im folgenden aufgelisteten - Einzelschritt-Skripte ein.
3) Skripte zur Anzeige der Einzelschritte:
./s_order_*.inc.php5
Befüllen des jeweiligen Einzelschritt-Templates, das aus 1) gewonnen/extrahiert wird. Füllt die Platzhalter, die von 2) noch nicht befüllt werden konnten / in 2) noch nicht lebendig waren.
4) Aktionen, die von einem zum nächsten Schritt ausgeführt werden:
./a_order_*.inc.php5
Hier geschieht wirklich etwas. Hier spielt sich die ganze Verarbeitung der User-Eingaben und die eigentliche Logik ab.
Generell: PHP-Skripte, die mit s_* (steht für "site") beginnen, enthalten nur soviel Logik, wie zur Darstellung der Seite notwendig ist.
Skripte, die mit a_* ("action") beginnen, enthalten die ganze Verarbeitung und Logik.
Das Ergebnis und die daraus resultierende Darstellung des letzten Bestellschritts (wie auch aller Bestellschritte) ist also ein Zusammenspiel der Dateien 1) bis 4).
Namespace - System
man kann mehrere WebShops an einem einzelnen OrgaMon-Mandanten betreiben. Im OrgaMon werden dabei alle Artikel verwaltet. Der einzelne WebShop "sieht" jedoch nur eine gewisse Auswahl an Artikeln. Für die Suche im Webshop sind dann nur die passenden Teilmengen sichtbar. So kann in einem WebShop ein gewisses Sortiment ausgeblendet werden.
rote Liste
Für alle Namespaces (ausser "intern") gilt ein Ausschluss folgender Artikel:
select ARTIKEL.RID from ARTIKEL where (ARTIKEL.WEBSHOP='N') or (ARTIKEL.SORTIMENT_R in (select RID from SORTIMENT where WEBSHOP='N'))
Namespace "intern"
- Er ist für die globale Artikel-Suche in OrgaMon->Beleg und in OrgaMon->Artikel
- dies ist der fest eingestellte vollumfängliche Namespace, er kann nicht über "System.WebShop.intern.OLAP.txt" definiert werden
- hier sind 100 % der Artikel ohne Einschränkungen auffindbar
Namespace "abu"
- Ist kein "System.WebShop.abu.OLAP.txt" vorhanden werden alle Artikell in diesen Namespace aufgenommen
- der Umfang ist dann 100 % der Artikel jedoch ohne die "rote Liste" - Artikel
weitere, frei definierbare Namespaces
Der Artikelumfang der Shops wird dabei über verschiedene System-OLAPs gesteuert:
Im System-OLAP-Verzeichnis werden mit folgender Maske alle Namespaces gesucht
System.WebShop.*.OLAP.txt
- für jeden weiteren Suchindex wird ein OLAP benötigt, das die beteiligten Artikel RID als Ergebnis liefert
System.WebShop.~Namespace~.OLAP.txt
- ~Namespace~ ist auch ein System-Parameter des WebShops
- bei der Ziffer "2" im Namespace (für "sekundär") wird ein eingeschränkter Wortraum (nur mit LAUFNUMMER) bei der Erzeugung benutzt
- Dabei wird auf die Felder CODE, NUMERO, VERLAGNO, SORTIMENT_R, SERIE, BEM, GATTUNG verzichtet, dafür ist "LAUFNUMMER" im Suchindex
Logik Bedingtes HTML
Beispiel in die Datei s_arcticle.inc.php5. Da werden dem Objekt die Optionen mit ->addOption hinzugefügt. Bei logikabhängigen Optionen weise ich hier das entsprechende Template (bei Dir z.B. mit oder ohne "<a href></a>" zu). z.B.:
$article->addOption("OPTIONSNAME",(file_exists()) ? _TEMPLATE_KLASSENNAME_SEITENNAME_OPTION_OPTIONSNAME_AHREF : _TEMPLATE_KLASSENNAME_SEITENNAME_OPTION_OPTIONSNAME_NOAHREF); OPTIONSNAME ist freiwählbar und bei mir in englisch. Im Klassen-Template _TEMPLATE_KLASSENNAME_SEITENNAME steht an der Stelle, an der die Option erscheinen (oder eben nicht erscheinen) soll der Platzhalter ~OPTION_OPTIONSNAME~, also der Name aus der Zuweisung ->addOption("OPTIONSNAME",....) mit vorangestelltem ~OPTION_ und abschließendem ~. Die Option wird dann bei Aufruf von ->getFromHTMLTemplate() automatisch belichtet. Das geht mit jeder Klasse die ein Nachkomme der Klasse TVISUAL ist.
Statischer Funktionsaufruf
- ZIEL
- Der Link "site=myshop&subsite=account" soll die Arbeitszeit neu berechnen!
- WEG zum Ziel
- Zeile
$orgamon->execAccounting(0, $user->getID());
in s_myshop_account hinzugefügt!
Änderungen / Erweiterungen programmieren
- schaue oben in der Internet-Adresse was bei "Site=" und "SubSite=" angegeben ist, dann suche ...
- ... die Datei s_~Site~_~SubSite~.php5
- ... suche den Abschnitt, um den es geht, bei mir war das $user->getBills();
- hm, getBills mach einen grep
- ... ich fand es in ./classes/t_webshoP-user.inc.php
- ... ich fand twebshop_bill, machte einen grep
- ... ich fand es in t_webshop_bill.inc.php5 ...
- ich merkte, dass im Kontruktor die Teillieferung fehlt
- ich wollte RECHNUNGSNUMMER zu den Properties hinzufügen, doch dies ist keine 1:1 Beziehung zwischen Feldname im select und die Art wie ich da dran kommen. Also das Feld heisst RECHNUNGSNUMMER ich komme aber mit Hilfe eines (select ...) as RECHUNGSNUMMER dran. Deshalb ...
- ... muss es ein properties1 hinzugeben
- obwohl es die Infrastruktur für die properties gibt werden diese nicht automatisch in die templates gepustet -> kann man da was tun
- Das .\Template für die "bill" musste ich nun ändern (Ergänzen um "RECHNUNGSNUMMER")
Betrieb und Wartung
Kontext-Links des Shops
Kontext-Links von aussen : der OrgaMon/ein Mailung ruft den WebShop, dafür gab es bisher folgende Standards, die gehen alle nicht mehr:
BEDEUTUNG BISHER NEU Such-Anfrage web_search.php?expression=~SuchStr~ ?site=search&action=search_user_expression&f_search_expression=henn Login login.php?email=~eMail~&key=~Password~&login= ?site=login&action=login&f_user=thorsten.schroff@orgamon.org&f_pass=nase Pwd-Anforderung new_user_password.php?email=®=+++Ok+++ ?action=send_password&f_user=thorsten.schroff@orgamon.org Artikel-Anzeige <war nicht möglich> ?site=article&id=192713 Verfügbarkeits-Check <war nicht möglich> ?site=test&info=
Artikel-Bilder des Shops
Bilder werden über die Funktion TPicUpload direkt in den Shop hochgeladen.
- Vor dem Upload müssen die Bilder folgender Namenes-Konvention entsprechen:
~ARTIKEL.NUMERO~.jpg
- Im Shop entsprechen Sie dann der Namenskonvention:
~ShopPfad~ + "upload/" + DOKUMENT_R + ( "th.jpg" | ".jpg" )
ist der Dateiname des Bildes, fall DOKUMENT.ARTIKEL_R passt.
Fragen & Antworten:
- Q wer erzeugt bei Bildneuanlage eigentlich einen neuen Eintrag in der Tabelle "DOKUMENT" ?
- A tpicupload.php5 des Shops
- Q wer schiebt das Bild in den Shop?
- A die Taste TpicUpload des OrgaMon
- Q wie prüft der Shop ob ein img-Tag erzeugt werden kann oder nicht?
- A keine Prüfung, es wird darauf vertraut dass es klappt
- Q erfolgt ein Abgleich / Problembericht für "verwaiste" oder "fehlende" Bilder?
- A JA, mit FileZilla: ich habe mit dem Open-Source FileZillaClient (installiert auf Gates) das ganze W:\twebshop\images hoch geladen nach "http://hebu-music.de/twebshop/images/" FileZilla ermöglicht es bereits vorhandene Dateien zu überspringen, es lässt sich also eine primitive Variante eines Verzeichnisabgleichs programmieren. So ab und an sollte man die Aktion nun ausführen.
- Q können wir schon auf einen externen image-url verweisen?
- A JA, der Pfad entspricht schon jetzt dem Baseplug-Parameter 12. Aus der Sicht des OrgaMon ist das der Parameter
ShopArtikelBilderURL=http://hebu-music.de/twebshop/images/upload/
, der wie man an diesem Beispiel sieht bis hin zu den Bildern an sich formuliert werden muss. - Q können wir Shop-Eigene Bilder auf eine externe URL umlenken?
- A NEIN, Der PNG-Pfad wird in der Datei i_global_const.inc.php5 als Konstante definiert.
Hierzu sollte ich erwähnen, dass bei TWebShop-eigenen Grafiken immer die Existenz der Datei überprüft wird. Mein (möglicherweise nicht hochaktuelles) Halbwissen sagt mir, dass dies bei externen URLs durch einen php.ini-Eintrag ermöglicht werden muss. Da hab ich jetz mal nicht weiter nachgehakt, denn ich habe 2 weitere Gründe für das Belassen der TWebShop-eigenen Grafiken beim Shop:
bei mehreren Namespaces MÜSSEN wir meiner Meinung nach eine externe Artikel-Image url anbieten (die ggf. lokal liegen kann), da sonst alle ./images/upload-Verzeichnisse gedoppelt werden müssten. Oder mit einem Symbolischen Link unter linux versehen werden müssen. Im Moment wäre mir so ein H:\delphi\Bilder\ irgendwie sympatisch ...
Remote Shop
- der Remote-Shop wird mit Hilfe einer MySql Datenbank betrieben (Datenbasis)
- Artikelbilder ist unklar / bitte dokumentieren
- Demoaufnahmen (*.mp3) werden via FTP in ein spezielles Verzeichnis hochgeladen
Dieser Datenabgleich ist automatisiert und hier: [1] im Quelltext offengelegt.
Datenbasis
- Voraussetzungen:
- Es muss der Systemparameter "ShopKey=" gesetzt sein
- Es muss ein OLAP "Artikel.des.Webshop" geben
- OrgaMon->WebShop->Reiter "WebShop MySQL"
- Button "Einzeltest" bei "Laufnummer setzen" (dies stellt sicher dass alle Artikel eine Laufnummer haben)
- Button "Einzeltest" bei "MySQL Dump erzeugen"
- FTP-Schritt manuell:
- Alle "mysql.dump-*.txt" -Dateien von ./Diagnose/ in den Shop ins Verzeichnis /db/ hochladen
- Button "Einzeltest" bei "DB umschalten"
Demo-Aufnahmen
- Voraussetzungen:
- Es muss der Systemparameter "ShopKonto=" gesetzt sein
- Es muss ein OLAP "Artikel.des.Webshop" geben
- Es muss ein OLAP "Musik aus externen Links" geben
- OrgaMon->WebShop->Reiter "WebShop Medien"
- Manuelles FTP:
- Abwahl der beiden Haken "FTP Upload", "FTP Delete"
- Starten mit "hochladen & verlinken"
- anhand der Datei .\Diagnose\Remote-WebShop-FTP.csv den Verzeichnisabgleich durchführen
- FTP seitig ist das Medien-Verzeichnis im Systemparameter ShopKonto= der 4. Parameter Systemeinstellungen#ShopKonto
- Manuelles FTP:
Apache konfigurieren
Icon des Shops
Ausführliche Infos gibts dazu in "http://www.favicons.de/"
Virtual Hosts unter Confixx Webserver
joe /etc/httpd/confixx_vhosts.conf
die entsprechende php direktive open_basedir muss auskommentiert werden.
#php_admin_value open_basedir ...
NeueSubDomain.host.tld
wir gehen so vor, dass der Webshop auf einer Subdomain erreichbar ist. In diesem Fall "neu". Bei Subdomain treffer.de, ist der Shop-Einstieg also über http://neu.treffer.de
erreichbar.
Auf dem Linux-Apache2-Server
- Einen smb-Share auf \srv\www\ legen
- Einen subdomain auf das Shopverzeichnis lenken:
Datei /etc/apache2/vhosts.d/neu.hebu-music.com.conf anlegen
<VirtualHost *:80>
ServerName neu.hebu-music.com
ServerAlias neu.hebu-music.com
ServerAlias neu.raib181
DocumentRoot /srv/www/htdocs/neu
HostnameLookups Off
UseCanonicalName Off
</VirtualHost>
"neu" kann natürlich durch jeden anderen subdomain ersetzt werden.
Auf einem Windows-Arbeitsplatz
- Über Windows das Setup-TWebShop_Dev-1.027.exe (aktueller Entwicklungsstand [hier]) ausführen, z.B. in das Verzeichnis "neu"
- Nun die Konfigurationsdatei editieren.
Design Überblick
der folgende Abschnitt soll helfen in die Entwicklung möglichst schnell einsteigen zu können. Im Moment ist es einfach eine lose Faktenauflistung. Jeder der Entwickelt und bei einigen Punkten Schwierigkeiten hatte ist hier aufgerufen, einige klärende Worte einzufügen.
- "core" Skripte sind über diesen Webshop hinausreichende Grundklasse, die sich anbieten auch über die aktuelle GEschäfts-Logik Webshop-Logik gültig und hilfreich zu sein.
- "site" Skripte stehen für einzelne Seitengruppen des Shops. z.B. der Bestellvorgang "order" ist die site. Aus Benutzersicht gibt es für die 4 Bestellschritte 4 verschiedene seiten, es ist aber immer site mit dem Namen "order", aber mit den "steps" 1 bis 4.
- "templates" sind design und Ablauf Grundlagen für den Shop
to do
todo: die "single instance" Klasse: Muss das so sein? Kann man mehrfache Instanzen nicht einfach zulassen? Wäre das nicht übersichtlicher? Jetzt ist es so, dass die Kapselung der
Properties nicht gegeben ist. Jemand instanziert sich eine Klasse und bekommt die Properties geändert -> unschön ...
todo: Komplette Session überwachung und Debugging: Es muss durch ein Verfahren klar werden wie die Session "vor" und "nach" dem Code aussieht. Gibt es nicht einen Session Debugger? todo: Klärung der Begriffe "action", "site", "subsite", "step"