MarxCMS 2.0 Readme

Anforderungen
- .htaccess
- mod_rewrite
- PHP
Allgemeines
- Besonders geeignet für den Einsatz von Frontpage mit Verwendung von
verlinkten Unterseiten (schnelle Entwicklung).
- Sowohl Design-Entwicklung als auch Content-Entwicklung kann lokal
ablaufen und auf die lokalen Ressourcen zugreifen. Veröffentlichung durch
hochladen. Anschließend wird Content- und Design verknüpft und mit Metatags,
Interrupts, Autofiltern, Menüs verbunden.
- Design und Inhalte können getrennt voneinander entwickelt werden. Der
Inhalt kann mit trivialen Programmen erstellt werden, ohne dass die Codequalität
der Webseite darunter leitet.
- Filter (z.B. Anti-Spam) sind möglich und verändern den Inhalt nicht.
- Es ist keine Datenbank notwendig und PHP kann jederzeit eingesetzt
werden.
- Die Engine setzt diesen Inhalt (nur den body-Tag) in ein Design-Template ein
- Metatags sowie der Title/H1-Tag bestimmen, welches Design etc. verwendet werden
soll
- Interrupts erlauben einen einfach zu implementierenden Jugend- oder
Passwortschutz.
- Durch Rewriting verhält sich die endgültige Seite exakt wie in der Entwicklung
(alle Links und URL-Verweise bleiben erhalten)
- Alle Dateien (auch HTML) können sowohl magische Wörter als auch PHP Code
enthalten
- Design-, Metatag oder Conentdateien werden durch den Parser
automatisch herausgenommen. Kommentare werden bei dem Vorhandensein des
entsprechenden
Filtermoduls ebenfalls aus der Endausgabe herausgenommen.
(Ausnahme: Kommentare, die "// -->" enthalten z.B. für JavaScripts).
- Parameter, die an die Seite übermittelt werden, stehen der Design- und Contentpage
direkt zur Verfügung.
- Die einzigsten Variablen, die der Page-Controller hinterlässt sind $content
und $content_file (beide durch Interrupts änderbar).
- GET und POST Parameter werden berücksichtigt.
Einstellungen
Einstellungen sind in der config.inc.php zu finden.
Einstellungsname |
Empfohlen |
Beschreibung |
CFG_TITLE_ORDER_H1_BEFORE_TITLE |
true |
Soll für die Ermittlung des Webseitentitels zuerst <h1> und dann
<title> betrachtet werden oder umgekehrt? |
CFG_PLACE_METATAGS_ON_TOP |
true |
Sollen einzufügende Metatags nach <head> (TOP) or vor </head>
(BOTTOM) stattfinden? |
CFG_DATE_FORMAT |
Y-m-d H:i:s \G\M\TO |
Datumsformat. |
CFG_INTERRUPT_AT_BOTTOM_DEFAULT |
true |
Ausgaben von Interrupts werden hinter den Content gepackt. (Kann
durch Interrupts verändert werden) |
CFG_INTERRUPT_DO_CONTINUE |
true |
Darf standardgemäß nach einem Interrupt fortgesetzt werden? (Kann
durch Interrupts verändert werden) |
CFG_EXTENSION |
.html |
Dateinamenserweiterung für alle Dateien, die von MarxEngine
verarbeitet werden. (Achtung: Siehe auch Eintrag in der .htaccess) |
CFG_STRICT_ERROR_REPORTING |
true |
Soll Error-Reporting von PHP sehr strikt sein? (Gute Codequalität
wird erzwungen) |
CFG_UTF8_SITEMAP |
true |
Soll die Sitemap (*.txt) in UTF8 verfasst werden? |
CFG_ALLOW_DIRECTORY_LISTING |
true |
Soll Directory-Listing erlaubt werden oder nicht? |
LNG_UNKNOWN_TITLE |
Unknown |
Der Titel einer unbekannten Seite. |
PASS_CONTENT_STYLE_TAG_INTO_DESIGN |
true |
Derzeit keine Unterstützung für externe Stylesheets. |
$disallow_dirs |
array() |
Enthät Präfixes, die nicht im System zugelassen sind. |
Mitgelieferte Lösungen und Beispiele
- #autoincludes/isBot.inc.php
function checkBot($string)
- #autoincludes/mySetCookie.inc.php
function mySetCookie($name, $value) // Expires
at end of session
- #autoincludes/passwordProtection.inc.php
function check_password_protection($accepted_pwds
[array], $area_name, $show_areaname = false)
Für Passwortschutz legen Sie einen #interrupt_*.html an, der diese
Funktion aufruft. WICHTIG! Benennen Sie den Interrupt-Namen nach dem
Bereich, aber niemals nach dem Passwort! Der Interrupt-Name ist durch
system-vitaly.php öffentlich einsehbar. Anstelle einen Interrupt
#interrupt_password-xyz.html mit dem Passwort "xyz" zu erstellen sollten Sie
z.B. einen Interrupt #interrupt_password-kunden.html mit einem Passwort
ungleich "kunden" verwenden.
Anmerkung: Wird auch vom Vitality-Controller verwendet.
- #filters/strip_comments.inc.php entfernt Kommentare aus
der Endausgabe
- #filters/secure_mail_addresses.inc.php verschleiert
E-Mail-Adressen in der Endausgabe
- #filters/htmlentities.inc.php wandelt Sonderzeichen in
der Endausgabe in HTML-Entities um, sodass auch Umlaute trotz UTF8 korrekt
dargestellt werden.
- #filters/strip_metatags.inc.php - Enthält der Content
keine <head> Section, in der MarxEngine-Metatags unterkommen, würden die
Metatags in der Endausgabe erscheinen. strip_metatags.inc.php entfernt alle
Metatags innerhalb des Body-Tags.
- _goodies/readme/ - Dieses Dokument.
- _goodies/diag/ - Darstellung von Konstanten sowie ein
paar Selbsttests des Systems.
- _goodies/system-vitality/ zeigt den Status der Seite
und deckt Fehler (z.B. nicht existierende Referenzen zu Designs etc.) auf.
Es ist wichtig, dass hier keine Fehler gefunden werden, da der Benutzer
sonst HTTP 500 Seiten sehen könnte. Ein SEHR nützliches Tool!
Processing
Kurz: Der Content wird in das Designsheet eingebettet. Danach kommen alle
anderen Ressourcen (Metatags) hinzu. Interrupts werden ausgeführt. Zuerst
wird das Designsheet evaluiert Dann am ENDE wird der Rest evaluiert.
Genauer (allerdings trotzdem nicht absolut ausführlich):
- Inhalte des Auto-Include werden ausgeführt
- (Der Page-Controller wird aufgerufen)
- PHP-Variablen zu magischen Variablen werden erstellt
- Es wird geprüft, ob die Seite existiert. Eine Errorpage wird ausgegeben.
- Search for interrupt meta tags and execute them (backup content)
- In Backup: Remove all comments
- Evaluieren
- Design finden
- Menüs finden
- Metatags finden
- Title erhalten + Tags strippen
- Style auslesen (siehe PASS_CONTENT_STYLE_TAG_INTO_DESIGN)
- Body extrahieren
- Interrupt-Dinge appenden
- Designsheet laden und evaluieren
- Magic Constants
- PHP-Evaluierung
- Alle URLs (href, src, etc.) werden auf den neuen Pfad umgewandelt
- Insert Content into design
- Insert the specific styles
- Load and insert meta tags into design
- Load and insert menu into design
- Remove all comments from output
- Replace Magic consts
- Löschen des Backups (alle magic constants fertig)
- Remove all comments
- Evaluation and Output
- Call filters and modify contents
- Final output
Zusätzlich bereitgestellte Seiten
- sitemap.txt ist eine UTF8 Textdatei, die von Suchmaschinen als Sitemap
verwendet
werden kann. Alle Dateien in ./_data/content/ werden aufgelistet, auch wenn sie
bisher noch nicht verlinkt wurden. Es werden auch Unterverzeichnisse beachtet. Für jedes Verzeichnis in content/
gibt es auch eine sitemap.txt.
Dateien
_* |
Dateien oder Verzeichnisse, die mit "_" beginnen werden nicht in die
Sitemap übernommen. |
*.html |
Alle html-Dateien werden von der Marx-Engine geparsed und mit
Design, Menüs, Metatags usw. versehen. PHP Code ist erlaubt. Alle
anderen Dateien werden nicht durch die MarxEngine verarbeitet. |
#design_*.html |
Designdateien.
Standard: ./#design_default.html wird bei fehlender Metatag-Information
automatisch eingebunden. Ist keine solche Datei vorhanden, wird im
übergeordneten Verzeichnis gesucht. *empty* erzeugt ein leeres Dummy-Design
im HTML 4.01-Standard. Dies entspricht dem Zustand, wenn kein
Default-Design verfügbar ist. |
(Verzeichnisse) |
Erhalten von der MarxEngine ein Directory-Listing, sofern keine
index.html besteht. |
#error_notfound.html |
Die Seite, die angezeigt wird, wenn eine Seite nicht
gefunden wurde. Auch hier wird in übergeordneten Verzeichnissen gesucht.
Die Fehlerseiten werden in das Design eingearbeitet. |
#autoincludes/ |
Enthält *.inc.php Dateien, die alle automatisch
eingebunden
werden.
Das Verzeichnis sollte gesperrt werden. |
#filters/ |
Enthält wie bei den autoincludes ebenfalls .inc.php
Dateien mit dem
Unterschied dass diese hier vor der Ausgabe aufgerufen
werden und die Funktion haben, $content vor der Ausgabe
zu Modifizieren (Beispiel: Kommentare entfernen, Formatierungen
durchführen, E-Mail-Adressen erkennen und schützen etc.)
Die Filter sind ebenfalls gut dafür geeignet, eigene magische
Wörter im $content zu ersetzen.
Info: Die Filter werden NACH der PHP-Ausführung ausgeführt.
Das Verzeichnis sollte gesperrt werden. |
#interrupt_*.html |
Ein Interrupt ist in
der Lage,
den Zugang zu kontrollieren (z.B. Passwort- oder Jugendschutz)..
Soll der Zugang blockiert werden, kann die() verwendet werden.
Wird die() verwendet, werden magische Schlüsselwörter nicht übersetzt..
Die Interruptseiten werden NICHT in das Design eingebunden.
Soll ein Interrupt in das Design eingebunden werden, muss
$content überschrieben und das Script nicht beendet werden
(Kommentare werden ein weiteres Mal entfernt). Jedoch sollte
die Variable $interrupt_do_continue auf false gesetzt werden,
damit nur das aktuelle Interrupt ins Design eingefügt wird und
die nachfolgenden Interrupts nicht mehr ausgeführt werden.
Soll die Seite komplett überschrieben werden (inkl. Title,
Metatags, Design und Menu), muss auch $original_content und
der Dateiname $content_file (wegen $LASTMOD$) überschrieben
werden.
Tipp: Einlass mit Cookies realisieren. Das Cookie mit
JavaScript erstellen, um eine unnötige POST-Anfrage zu
verhindern.
Anmerkung: Gibt ein Interrupt etwas aus, wird die Ausgabe
am Ende des Contents-Teils ($CONTENT$) angefügt. Ausnahme: Die Ausgabe wird oben angefügt, wenn
$interrupt_output_at_bottom auf false gesetzt wird.
Es können $interrupt_outputs_top und $interrupt_outputs_bottom
verändert werden, um die Ausgaben individuell zu konfigurieren (nicht empfohlen!)
Standard: #interrupt_default.html wird bei fehlender Metatag-Information
automatisch eingebunden. Es wird in übergeordneten Verzeichnissen gesucht. Eine Metatag-Information überschreibt
den Default-Interrupt. *empty* gilt als leerer Interrupt. |
#metatags_*.html |
Standard: #metatags_default.html wird bei fehlender Metatag-Information
automatisch eingebunden. Es wird in übergeordneten Verzeichnissen gesucht. *empty*
ist möglich, um keine Metatags einzubinden.
Die Metatags, die durch die Contentdatei definiert wurden, werden nach <head>
des Designsheets eingefügt. (siehe CFG_PLACE_METATAGS_ON_TOP) |
#menu_*.html |
Es kann auf $reqfile zugegriffen werden, wenn festgestellt werden
soll, welche Seite gerade aufgerufen ist (auch mit ausgeschalteten
Register-Globals). Standard: #menu_default.html wird bei fehlender Metatag-Information
automatisch eingebunden. Es wird in übergeordneten Verzeichnissen gesucht. *empty*
ist möglich, um keine Metatags einzubinden.
Bei mehreren Menüs im Design ist auch #menu_default2.html etc. möglich.
|
Magic Constants
Magische Wörter in Content-, Menü- oder Designdateien sowie Metatags:
$SUBn$
n=1..n |
Relativ zu unserer System-URL können wir einzelne Teile der URL
anzeigen. Es wird ein Slash angehängt.
z.B.
www.example.com/marx/a/b/c/ . $SUB1$ wird zu a/ |
$SEGn$
n=0..n |
$SEGn$ := /$SYSTEM_REL_URI$$SUB1$..$SUBn$
Sehr gut geeignet für Logo-Grafiken, die auf die Hauptseite
zurückführen. |
$TITLE$ |
Titel der Seite. $TITLE$ wird bestimmt durch die Contentdatei. <h1> wird vor <title> ausgewertet.
(siehe CFG_TITLE_ORDER_H1_BEFORE_TITLE) |
$LASTMOD$ |
Änderungsdatum der jeweiligen Contentdatei (*) |
$CONTENT$ |
Einfügeposition für den Content (*) |
$MENU$ |
Einfügeposition des Menüs (definiert durch die Contentdatei) (*) |
$SOFTWARE$ |
Fügt den Namen und die Version von MarxEngine hinzu |
$CURYEAR$ |
Das aktuelle Jahr (vierstellig) |
$EML_DOMAIN$ |
The current domain for email addresses (example.com). |
$DOMAIN$ |
The current domain. |
$SYSTEM_URI$ |
The system's root URI. |
$SYSTEM_REL_URI$ |
The system's relative URI. (nothing instead of '/' at the beginning) |
$SYSTEM_URI$ |
Definiert als $DOMAIN$$SYSTEM_REL_URI$ |
$CUR_DIR_URI$ |
The current directory URI. |
$RELDIR$ |
The current directory RELATIVE to the engine-base.(nothing instead of '/' at the beginning) |
$CUR_DIR_URI$ |
Definiert als $SYSTEM_URI$$RELDIR$ |
(*) = nicht in Metatags erlaubt
Beispiel-Metatags in Content-Dateien (nicht in Designdateien):
- <meta name="interrupts" content="password123;adult;gore">
Zuerst wird das Interrupt ./_data/interrupts/password123.html eingebunden.
Danach wird das Interrupt ./_data/interrupts/adult.html eingebunden.
Danach wird das Interrupt ./_data/interrupts/gore.html eingebunden.
Wenn ein Interrupt den Einlass verweigert, ist kein Weiterkommen möglich.
- <meta name="design" content="blue">
Es wird das Designtemplate ./_data/design/blue.html verwendet.
- <meta name="menues" content="german">
Es wird das Menü ./_data/menues/german.html bei $MENU$ verwendet.
Es sind auch mehrere Angaben möglich (durch ";" zu trennen). Bei mehreren
Menüs wird zunächst $MENU2$, $MENU3$ usw. ersetzt.
Für zweite und dritte Menüs usw. sind auch default2.html und default3.html
definiert, die ebenfalls rekursiv nach oben gehend gesucht werden.
Beim Überschreiben der Default-Werte ist NUR bei den Menüs ein *empty* möglich.
Wird beispielsweise "*empty*;mymenu" angegeben, wird $MENU$ gelöscht und $MENU2$
mit "mymenu" geladen.
Enthält ein Design z.B. 3 Menüs, müssen die jeweiligen Seiten jeweils
3 Menüs einbinden. Ansonsten wird mit *empty* aufgefüllt.
- <meta name="metatags" content="german">
Es werden die Metatags ./_data/metatags/german.html bei $METATAGS$ verwendet.
Es sind auch mehrere Angaben möglich (durch ";" zu trennen)
Achtung! Existiert ein Metatag doppelt, so wird nur das erste Vorkommen
ausgewertet
und es erfolg keine Warnung. Ein Metatag, der mehrere Angaben erlaubt (z.B. menu,
interrupt oder metatags) erlaubt die Angabe mehrerer Dateien mit einem
Strichpunkt (";")
getrennt.
Ideen für die zukünftigen Versionen / TODOs
- $MENU_XX$ einführen, das $MENU$$MENU2$$MENU3$... entspricht
=> $MENU_XX$ soll auch im Auto-Generated Dummy-Design vorhanden sein!
=> $MENU_XX$ soll im Diagnose-Tool anstelle von $MENU$ dabei sein
- Dieses Handbuch besser ausarbeiten und besser erklären.
- Mehr Beispiele und Demos veröffentlichen.
- Vitaly Check: Prüfen, ob andere Dateien außer ".html" oder ".inc.php" etc.
in den Verzeichnissen liegen (Siehe "Gültige Dateien") sowie die vollständige
Verwendung der magischen Schlüsselwörter (z.B. Abzählen, ob genau so viele
Menüs definiert sind wie das Design bietet, nicht mehr und nicht weniger);
Alle Links innerhalb der Seiten prüfen, W3C-Kontrolle etc...
- Automatische PHP-Gleichstellungsscript wie bei WebBase
- Automatisches PNG-Fix für IE6
- Ggf. Frameunterstützung durch das System
- Pre-Eval-Filter
- In Metatags auch $LASTMOD$ (benötigt Dateinamen) ersetzen
- Interrupts, Designs etc.: Rekursives Suchen nicht nur bei DEFAULT.
- An alle includierten seiten (errors, menus, designs, interrupts) irgendwie
eine information über die aktuelle URI geben? (damit man keine relativen
angaben in SRC's oder HREF's machen muss)?
- überlebende variablen und funktionen prüfen
- Filter und Autoincludes in das Rootverzeichnis packen Es soll dann auch
möglich sein, dass ein filter/autoinclude nur für eine spezielle webseite da
ist! (/subdir/#filter_...)
- Unterstützung für *.html UND *.htm bieten?
- Onlineeditor anbieten?
- Alle *.html dateien sollten frontpage-editierbar sein, alles andere (#interrupts)
sollte eigentlich kein *.html sein?
- Auto-Generierung von Menü's in Verbindung mit $MENU_XX$ ermöglichen.
Untersektionen werden durch Ordner realisiert
(!) Problem: JEDE Seite (auch index.html oder Unterseiten wie z.B. jedes
einzelne Artwork) wird aufgenommen
(!) Problem: Erstes Item in der Sektion heißt IMMER genau so wie die Sektion
selbst und nicht z.B. "Übersicht"
- Trotz Auto-Generierung von $MENU_XX$ soll man einzelne Menü's per Metatag
austauschen können
- PHP evaluation auch VOR dem zusammenfügen ermöglichen?
- Filter, der z.B. [A+] in einen Adult-Interrupt-Metatag umwandelt (ist diese
Processing-Reihenfolge erlaubt?)
- Content-Editoren integrieren + Global Search + Global Replace
- ist anstelle von htmlentities-filter auch ein utf8encode-handling (bzw.
erhaltung der originalen kodierung) der content-daten möglich, damit
sonderzeichen erlaubt sind?
- Adult-permission-script für images (mod_rewrite mit Cookie-Check?)
- Das komplette Prozessing (magics, eval, stripcomments etc) eines
Contents in eine Funktion auslagern? [Problem: Globals!] Für Designsheet
soll das selbe Prozessing wie für den Inhalt gelten.
- Feature: magic-constants dynamisch? (man schreibt $BLA$ und dann wird
der inhalt der PHP-variable $bla eingesetzt?)
Limitations
- Der DirLister kann keine eigenständige 403-Warnung bei gesperrten
Verzeichnissen ausgeben
- Möglich mit einem 403-Handler in der HTACCESS
- #menu's, #metatags, #design's können offline nicht betrachtet und bearbeitet
werden
- Design-Sheets sollen Offline-Ansehbar und ohne PHP-Quellcode sein! (!)
- Menü's und Metatags sollen Head+Body-Struktur haben und dann eben nur Body
bzw. Head parsen
- If #autoincludes/ or #filters/ directory is not secured, _marx.php cannot
prevent that.
Changelog
2.0.6 (2010-08-30)
Magic Constants sind nun möglich in Menüs und Metatags (RemoveComments+MagicConstants 2 Schritte nach hinten geschoben)
2.0.5 (2010-08-30)
Url-Iterator weiter verbessert.
2.0.4 (2010-08-30)
Url-Iterator weiter verbessert.
Readme enthält nun keine unescaped Magic-Constants mehr und ist HTML-Kodiert.
2.0.3 (2010-08-29)
CSS-Basis wird nun besser geparsed.
Mail-Filter verbessert.
2.0.2
Kleinere Änderungen
2.0.1
Kleinere Änderungen
2.0.0 (2010-08-07)
Das komplette System wurde überarbeitet. Die größte Änderung ist, dass nun
zugehörige Dateien wie Menü's Designs im selben Verzeichnis wie der Content
liegen und dass Content und Ressourcen nun gemischt sind.
1.x
Die Versionsgeschichte der ursprünglichen Version wurde nicht dokumentiert.
Herausgeber
Daniel Marschall