Sie sind auf Seite 1von 23

pragmaMx

Programmers Guide

2005-2012 pragmaMx all rights reserved

pragmaMx

Programmers-Guide

Inhalt
Einleitung PragmaMx Coding Standards Namens Konventionen Klassen Funktionen und Methoden Konstanten Globale Variablen Allgemeine Programmiergrundlagen Zeileneinzug und Zeilenlnge Kontrollstrukturen Operatoren Funktionsaufrufe Funktionen Definieren Arrays Strings Code hinzufgen PHP Code Tags Kommentare Allgemeine Sicherheitsfunktionen Direktaufruf von Dateien Request Variablen Session Variablen Lesen und Schreiben in der Datenbank Anzeigen von Datenbankinhalten oder Request Variablen Ausgabe von Content Sprachanpassung Hooks Userfunktionen Weitere wichtige Funktionen pramaMx- Konstanten Modul-Ordnerstruktur Inhalt der einzelnen Ordner Beispieldateien admin.php Index.php setup.pmx.php Blockdatei allgemein: 4 4 4 4 4 5 5 5 5 5 6 6 6 7 7 7 8 8 8 8 8 9 9 9 9 10 11 12 13 14 16 16 18 18 19 19 20

2012 pragmaMx.org

pragmaMx

Programmers-Guide 20 21 21 21 22 22 23 23

Admin.menu.php Admin.case.php User.delete.php User.edit.php User.navbar.php User.userpoits.php User.visitmenu.php Language-Datei

2012 pragmaMx.org

pragmaMx

Programmers-Guide

Einleitung
Im Rahmen der Weiterentwicklung vom pragmaMX 1.12 hin zur nchsten Version ist es notwendig einheitliche Bedingungen auch fr die Codewicklung zu schaffen. In diesem Dokument werden die Standards fr die Programmierung fr pragmaMx aufgezeigt und erlutert. Dieses soll Programmierern helfen, zukunftssichere Module und AddOns fr pragmaMx zu entwickeln. Die Formatierung des php-Quellcodes in pragmaMx orientiert sich weitestgehend an den "PEAR coding standards". Die Pear Standards knnen auf pear.php.net nachgelesen werden. Dieses Dokument basiert teilweise auf der deutschen bersetzung von Joomla! http://www.joomla.de/content/view/112/17/ Die PEAR Standards wurden durch pragmaMx spezifische Dinge erweitert, oder genauer przisiert.

PragmaMx Coding Standards


Alle Scripte mssen mit error_reporting = E_ALL ohne Notices und Warnings, in allen Situationen laufen Alle Script-Dateien, die normalerweise nur includet werden, mssen wirksam gegen Direktaufruf abgesichert sein Variablen und Arrays mssen vor dem ersten Gebrauch initialisiert werden. Request Variablen, die per register_globals in den globalen scope kopiert werden, drfen nicht direkt verwendet werden Alle dem Script bergebenen Request Variablen sind vor deren Verwendung auf Gltigkeit zu prfen. Variablen, die nicht zwingend gesetzt sind, mssen mit isset(), empty() etc. erst berprft werden. nicht mehr bentigte Variablen, insbesondere, wenn sie sehr viel Inhalt haben, sollten mit unset() wieder aus dem Speicher entfernt werden

Namens Konventionen
Klassen Klassen sollten einen beschreibenden Charakter haben. Vermeide Abkrzungen wo mglich. Klassennamen sollten immer mit einem Grobuchstaben anfangen. Die PEAR Klassenhierarchie reflektiert auch in den Klassennamen, jede Eben der Hierarchie wird mit einem einzelnen Unterstrich getrennt. Beispiele guter Klassennamen sind: Log Net_Finger HTML_Upload_Error Funktionen und Methoden Funktionen und Methoden sollten per "studly caps" Style benannt werden (auch bekannt als "bumpy case" oder "camel caps"). Funktionen sollten zustzlich den Paketnamen als Prefix tragen, um Namenskollisionen zwischen Paketen zu vermeiden. Der Anfangsbuchstabe des Namens (nach dem Prefix) wird klein geschrieben, und jeder Buchstabe, der ein neues "Wort" beginnt wird gro geschrieben. Einige Beispiele: connect() getData()

2012 pragmaMx.org

pragmaMx

Programmers-Guide

buildSomeWidget() XML_RPC_serializeData() _sort() _initTree() $this->_status Konstanten Konstanten sollten immer komplett grogeschrieben werden, mit Unterstrich um die Wrter zu trennen. Konstanten, welche in einem Paket/Klasse genutzt werden, sollten mit einem Prfix versehen werden der grogeschriebenen Klasse/Paket. Zum Beispiel, die Konstanten die von DB:: package genutzt werden beginnen alle mit "DB_". Globale Variablen Wenn dein Paket globale Variablen bentigt, sollten deren Namen mit einem einfachen Unterstrich beginnen, gefolgt vom Paketnamen und einem weiteren Unterstrich. Zum Beispiel, das PEAR Paket nutzt eine globale Variable namens $_PEAR_destructor_object_list.

Allgemeine Programmiergrundlagen
Zeileneinzug und Zeilenlnge Nutze einen Zeileneinzug von 4 Leerzeichen, ohne Tabs. Es wird empfohlen Zeilen nach maximal 75-85 Zeichen umzubrechen. Es gibt keine Standardregeln fr das Umbrechen von Zeilen (Unter Windows haben sich 80 Zeichen/Zeile bewhrt), nutze Dein Beurteilungsvermgen. Kontrollstrukturen Diese beinhalten if, for, while, switch, etc. Kontroll Anweisungen sollten ein Leerzeichen zwischen dem Kontrollschlsselwort und der sich ffnenden runden Klammer haben, um sich von den Funktionsaufrufen zu unterscheiden. Es wird stark empfohlen geschweifte Klammern zu nutzen, auch wo sie technisch gesehen nur optional sind. Sie einzusetzen erhht die Lesbarkeit und verhindert gleichzeitig logische Fehler, die sich einschleichen knnen, wenn neue Zeilen hinzugefgt werden. Beispiel fr eine if Abfrage:
<?php if ((condition1) || (condition2)) { action1; } elseif ((condition3) && (condition4)) { action2; } else { defaultaction; } ?>

2012 pragmaMx.org

pragmaMx

Programmers-Guide

Beispiel fr die Switch Anweisung:


<?php switch (condition) { case 1: action1; break; case 2: action2; break; default: defaultaction; break; } ?>

Operatoren (+, -, *, /, =, ==, <<, <, >, >>, ||, &&, ... [alle eben]) sollten immer ein Leerzeichen vor und nach dem eigentlichen Operator haben.
<?php $var += $c + $d ($b - $v); ?>

Funktionsaufrufe Funktionen sollten ohne Leerzeichen zwischen dem Funktionsnamen und der sich ffnenden runden Klammer, und dem ersten Parameter aufgerufen werden; Leerzeichen zwischen Kommas und jedem Parameter, und keine Leerzeichen zwischen dem letzen Parameter und der sich schliessenden Klammer, und dem Semikolon Hier ein Beispiel:
<?php $var = foo($bar, $baz, $quux); ?>

Wie oben gezeigt, sollte ein Leerzeichen auf jeder Seite der Zuweisung des Rckgabewertes an eine Variable sein. Im Falle, dass ein Block von Anweisungen kommt, knnen mehr Leerzeichen eingefgt werden, um die Lesbarkeit des Codes zu verbessern:
<?php $short = foo($bar); $long_variable = foo($baz); ?>

Funktionen Definieren Funktionsdeklarationen folgen der "one true brace" Konvention:


<?php function fooFunction($arg1, $arg2 = '') { if (condition) { statement; } return $val; } ?>

2012 pragmaMx.org

pragmaMx

Programmers-Guide

Funktionsparameter mit Standardwerten werden ans Ende der Parameterliste gesetzt. Es sollte immer versucht werden einen aussagekrftigen Wert aus einer Funktion zurckgeben zu lassen, wenn angebracht. Hier ein etwas greres Beispiel:
<?php function connect(&$dsn, $persistent = false) { if (is_array($dsn)) { $dsninfo = &$dsn; } else { $dsninfo = DB::parseDSN($dsn); } if (!$dsninfo || !$dsninfo['phptype']) { return $this->raiseError(); } return true; } ?>

Arrays Bei Arrayoperationen immer ' und ' (KEIN ") verwenden ( ausser in templates, dort garnichts )
<?php //Falsch: $var[name]=$foo; //Unerwnscht: $var["name"]=$foo; //Richtig: $var['name'] = $foo; ?>

Strings Strings zwischen einfachen Anfhrungszeichen ' und ' werden vom php parser nicht geparst, d.h. $variablen in solchen Strings werden nicht ersetzt. Wenn es in einem string keine variablen gibt, so sollte ' und ' verwendet werden. Variablen in Strings (Also mit "") sollten nach Mglichkeit immer vermieden werden, besser ist es, diese Strings mit dem . Operator zusammenzuhngen. (Ausnahme: MySQL Queries)
<?php //Falsch: $var = "es gibt $var = 'es gibt //Unerwnscht $var = "es gibt //Richtig: $var = 'es gibt $var = 'es gibt ?>

keine neuen nachrichten"; $n neue nachrichten'; $n neue nachrichten"; keine neuen nachrichten'; '.$n.' neue nachrichten';

Code hinzufgen berall da, wo du ohne Vorbehalt eine Klassendatei einfgst, nutze require_once(). berall wo du unter Vorbehalt eine Klassendatei einfgst (z.B. Factory Methoden), nutze include_once(). Beide stellen sicher, dass die Klassendatei nur einmal eingefgt wird. Sie halten die gleiche Dateiliste, damit musst Du dir keine 2012 pragmaMx.org 7

pragmaMx

Programmers-Guide

Sorgen ber die gemischte Verwendung beider machen - eine Datei die mit require_once() eingefgt wird, wird nicht noch einmal mit include_once() eingefgt. Anmerkung: include_once() und require_once() sind Anweisungen, keine Funktionen. Es werden keine runden Klammern um die Dateinamen der Klassendateien bentigt. PHP Code Tags Nutze immer <?php ?>, um PHP code auszuweisen, nicht die <? ?> Kurzform. Dies wird fr die allgemeine Kompatibilitt bentigt und ist der sicherste Weg PHP Code auch auf anderen Betriebssystemen und Konfigurationen zu portieren. Die Kurzform wird voraussichtlich ab php6 nicht mehr untersttzt werden. Beispiel URLs Benutze "beispiel.com", "beispiel.org" und "beispiel.net" fr alle Beispiel URLs und E-Mail Adresen, nach RFC 2606.

Kommentare Inline Dokumentation fr Klassen sollten der PHPDoc Konvention folgen, hnlich der Javadoc. Mehr Informationen zu PHPDoc knnen hier gefunden werden: http://www.phpdoc.org/ . Nicht-Dokumentation Kommentare werden strengstens empfohlen. Eine allgemeine anwendbare Regel ist, sich einen Codebereich anzusehen und und zu denken "Wow, Ich habe keine Lust spter darin rumzusuchen und beschreibe es", Du solltest es auskommentieren, bevor du vergessen hast wie der Code funktioniert. C Style Kommentare (/* */) und Standard C++ Kommentare (//) sind beide gut. Die Nutzung der Perl/shell Style Kommentare (#) ist nicht erwnscht.

Allgemeine Sicherheitsfunktionen
Direktaufruf von Dateien Alle Dateien, die nur includet werden, mssen wirksam gegen Direktaufruf geschtzt werden. Dies wird in pragmaMx am Einfachsten durch die Prfung auf das Vorhandensein der Konstanten mxAdminFileLoaded (in Dateien, die von der admin.php includet werden) oder fr alle Anderen Dateien, der Konstanten mxMainFileLoaded bewerkstelligt werden.
z.B. if (!defined('mxMainFileLoaded')) directly); die (You can't access this file

Request Variablen Alle dem Script per get, post und cookie bergebenen Variablen, werden bereits von pragmaMx wie folgt behandelt: bei register_globals=on werden zuerst die in den globalen Scope importierten Request Variablen wieder gelscht. bei nicht Administratoren werden die nicht erlaubten HTML-Tags gefiltert bei nicht Administratoren werden potentiell gefhrliche Teilstrings gefiltert bei nicht Administratoren werden zensierte Inhalte ausgefiltert. 2012 pragmaMx.org 8

pragmaMx

Programmers-Guide

Nach der Behandlung, werden diese Variablen in den globalen Scope kopiert, da einige Scripte die Einstellung register_globals=on erwarten. (nicht mehr in pragmaMx 0.2)

Session Variablen Die Session Variablen sollten nicht direkt ber $_SESSION verwendet werden, sondern ber folgende ApiFunktionen: - mxSessionSetVar($name, $value) setzt eine Variable in der Session - mxSessionGetVar($name) liest eine Variable aus der Session - mxSessionDelVar($name) entfernt eine Variable aus der Session

Lesen und Schreiben in der Datenbank Durch das explizite Escapen und filtern aller Request Variablen, sind diese eigentlich zur Verwendung in der Datenbank vorbereitet. Trotzdem, weil sich dieser Zustand zwischenzeitlich ndern kann, mssen alle Stringvariablen, vor der Verwendung in der Datenbank mit der Funktion mxAddSlashesForSQL($what) behandelt werden. Desweiteren empfehlen sich weitere individuelle Prfungen auf Gltigkeit, z.B. anhand einer white-List oder einer einfachen Lngenbegrenzung. Variablen, die nur Zahlen enthalten drfen, mssen vor der Verwendung in der DB mit intval() oder hnlichen Funktionen behandelt werden, so dass auf jeden Fall nur ein gltiger Zahlenwert (oder 0) enthalten ist. Die Prfung bzw. Umwandlung der Variablen sollte entweder direkt im zusammengesetzten String der Datenbankanfrage geschehen, oder zumindest unmittelbar davor. Die vielverbreitete Unsitte, dass ausgelesene Datenbankwerte mit stripslashes() behandelt werden ist unntig, bzw. sogar unsinnig.

Datenbankzugriffe Alle Datenbankzugriffe mssen ber die pragmaMx-internen Funktionen aufgerufen werden. Diese Funktionen entsprechen vom Syntax her, den allgemeinen PHP-Funktionen. Statt mysql_xxxx ist grundstzlich sql_xxx zu verwenden. Damit wird sichergestellt, dass alle Datenbankaufrufe ber die PragmaMx-Klassen geroutet werden. Anzeigen von Datenbankinhalten oder Request Variablen Trotz der vorbeugenden globalen Behandlung von Request Variablen, sollten diese auch vor dem Anzeigen innerhalb der Webseite, auf Gltigkeit geprft werden. Alle Daten die zur Anzeige gelangen, sollten mit der Funktion mxPrepareToDisplay() behandelt werden, um evtl. darin enthaltene eMailadressen und hnliche Dinge, vor Spambots zu verstecken.

Ausgabe von Content


Mit der Version 1.12 von PragmaMx steht eine Template-Klasse fr die Ausgabe von Content zur Verfgung. Diese ermglicht die angestrebte Trennung von Code und Design. Die Ausgabe mit echo sollte komplett vermieden werden. Eine Ausgabe von Content ber die Template-Klasse wird folgendermaen realisiert:
<?php /* Templateausgabe erstellen */ $tpl = load_class('Template'); $tpl->init_path(__FILE__); $tpl->init_template(__FILE__); /* Variablen an das Template uebergeben */ $tpl->assign(compact('faqcatlist','module_name')); $content = $tpl->fetch();*/

2012 pragmaMx.org

pragmaMx

Programmers-Guide

/* Ausgabe des Templates */ $tpl->display(ausgabedatei.html); ?>

In Hinsicht auf eine zuknftige HTML5-Kompatibilitt sollten folgende Codes in den Ausgaben nicht mehr verwendet werden: acronym (verwenden statt dessen abbr); applet (verwenden statt dessen object); basefont; big; center; dir; font; frame; frameset; isindex; noframes; noscript (nur in XHTML); s; strike; tt; u. Weitere Funktionen im PragmaMx sind zwar noch aus Kompatibilittsgrnden vorhanden, sollten aber nicht mehr verwendet werden. OpenTable() / CloseTable() >> ersatzlos streichen, oder falls wirklich ntig, ersetzen durch <div class="***"> OpenTable2() / CloseTable2() >> ersetzen durch <div class="note"> oder hnliches OpenTableAl() / CloseTableAl() >> ersetzen durch <div class="warning"> oder hnliches title() >> immer ersetzen durch <h2> wenn Seitentitel, oder <h3> wenn Untertitel GraphicAdmin() >> ersatzlos streichen

Sprachanpassung
Alle Module fr pragmaMX sollten fr eine Mehrsprachigkeit ausgelegt sein. Dazu ist erforderlich, dass innerhalb des Ausgabe KEINE Klartext-Ausgaben erfolgen drfen. Alle Ausgaben haben ber Konstanten zu erfolgen. Die Sprachkonstanten werden in den Sprachdateien innerhalb des Modules abgelegt. Die Sprachdateien befinden sich im Unterordner languages/ des Modulordners und haben folgenden Aufbau:
// gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); // evtl. Konstanten erst abfragen if (!defined("_ADD") ) define("_ADD","New"); if (!defined("_HELP") ) define("_HELP","Help"); define("_XYZ_INDEX","MODUL-Index"); /* ^ ^ ^ Prfix Name bersetzung

*/

2012 pragmaMx.org

10

pragmaMx

Programmers-Guide

Die Konstanten mssen in allen Dateien der verschiedenen Sprachversionen gleichermaen vorkommen und sollten einen Modulspezifischen Prfix (siehe obenstehenden Code) besitzen, damit keine berschneidungen der Sprachkonstanten des Moduls mit anderen Modulen oder dem System zustande kommen. Die Namensgebung der Sprachdateien entspricht folgender Regelung: [prefix.]lang-[sprache].php [prefix] [sprache] - optional, kann eine modulspezifische Differenzierung enthalten - enthlt die Sprachbezeichnung english fr Englisch german fr Deutsch Sie german_ du fr Deutsch DU french fr Franzsisch danish fr Dnisch spanish fr Spanisch turkish fr Trkisch

Eingebunden werden die Sprachdateien in den meisten Fllen mittels


mxGetLangfile ();

Sollten modulspezifische Zusatzdateien existieren, so knnen diese Dateien auch, wie folgt eingebunden werden:
mxGetLangfile( $mymodulname ,[prefix].lang-*.php);

Hooks
Fr verschiedene Systemereignisse knnen entsprechende Dateien vom Modul zur Verfgung gestellt werden, um die Systemintegration zu optimieren. Die sogenannten hook-Dateien werden immer vom System aus aufgerufen, nie vom Modul selber. Diese Dateien mssen sich im Unterordner core/ des Moduls befinden. Nachstehend die Auflistung der Ereignisse und der dafr verwendeten Dateien. Ereignis Administrator Info Datei admin.newentries.php Bemerkungen Rckgabewert in Listet die evtl. Neuigkeiten fr $hook_result[] = den Administrator im array() Adminpaneel auf Generiert die Tabs im eigenen $item[] = array(.) Useraccount Generiert die Tabs fr einen $item[] = array(.) User $hook_result += $Wert

User Neuanlage User ndern User lschen Useraccount User ansehen Userpunkte abfragen

User.add.php User.edit.php User.delete.php User.navbar.php User.visitmenu.php User.userpoints.php Mod_rewrite.php

2012 pragmaMx.org

11

pragmaMx

Programmers-Guide

Beispiele fr einige Hook-Dateien befinden sich im Anhang.

Userfunktionen
Oftmals ist es Notwendig die Userdaten zu ermitteln. pragmaMx stellt dafr eine eigene Klasse zur Verfgung. Hier sind die wichtigsten Funktionen aufgelistet: Funktion
mxIsAdmin()

bergabewerte
-

Rckgabewerte
True/false

Beschreibung
ueberprueft, ob der Nutzer als Admin eingeloggt ist Ueberprueft, ob der Nutzer als User eingeloggt ist

mxIsUser()

True/false

mxGetUserData()

Array mit userdaten Array mit userdaten

den

Abfragen der User-Daten aktuellen Users.

des

mxGetUserDataFromUsername($username)

$username

den

Abfragen der User-Daten von einem bestimmten User mit Usernamen als Abfrageparameter Abfragen der User-Daten von einem bestimmten User mit Userid als Abfrageparameter ermittelt ob ein User online ist Funktion zum Gruppennamens Gruppen-ID Auslesen anhand des der

mxGetUserDataFromUid($uid)

$uid=UserID

Array mit userdaten

den

mxIsUserOnline($username) mxGetGroupTitle($groupid)

$username GruppenID

True/false String

2012 pragmaMx.org

12

pragmaMx

Programmers-Guide

Weitere wichtige Funktionen


Nachfolgende aufgelistete Funktionen werden hufig verwendet. Sie sind hier nur mit der grundstzlichen Funktion beschrieben. Die genaue Verwendung ist in den mx-api-Dateien nachzulesen. Funktion
mxGetLangfile($module = '', $filepatern = 'lang-*.php')

bergabewerte
Optional

Rckgabewerte
False oder Namen Sprachdatei String den der

Beschreibung
Bindet die aktuelle Sprachdatei ein

mxAddSlashesForSQL($what)

Inhalt fr Datanbank

Modifiziert den Variableninhalt zum Speichern in der Datenbank (Escapen von Z eichen) Umkehrfunktion von mxStripSlashes(). Modifiziert eine Datenbankausgabe (Escapen von Zeichen rueckgaengig machen) Umkehrfunktion von mxAddSlashesForSQL(). Variablenwert fuer die Ausgabe aufbereiten / Schutz vor E-MailSammlern. Sucht den Text 'x@y' und ersetzt ihn durch die entsprechenden HTML-Entitaeten, was einen gewissen Schutz vor EMail-Sammlern bietet. Variablenwert fuer die Ausgabe aufbereiten / Schutz vor E-MailSammlern. Sucht den Text 'x@y' und ersetzt ihn durch die entsprechenden HTML-Entitaeten, was einen gewissen Schutz vor EMail-Sammlern bietet.

mxStripSlashes($what)

Inhalt fr Datanbank

String

mxPrepareToDisplay($wert)

Text

String

mxPrepareToHTMLDisplay($wert)

Text

mxPrepareCensored($text) mxCreateImage($image, $alt = '', $border_or_attribs = 0, $more = '', $xhtml = true, $captcha = false, $dimensions = true) mx_strftime($dateformat, $unixtimestamp = 0)

Text

String String

Zensierte Woerter entfernen Zum Erstellen Bildinformationen der

Unix-Timestamp

String

Ersetzt die Funktion strftime mit Ausgabe im Sprachspezifischen Format Email Address Verification

mxCheckEmail($email)

Emailadresse

Boolean

2012 pragmaMx.org

13

pragmaMx

Programmers-Guide

pramaMx- Konstanten
Konstante 'PMX_VERSION' 'MX_VERSION' 'PMX_VERSION_NUM' 'PMX_VERSION_DATE' 'PMX_VERSION_SUB' 'PMX' mxMainFileLoaded 'MX_TIME' DS 'PMX_REAL_BASE_DIR' Mainfile.php 'PMX_SYSTEM_DIR' 'PMX_ADMIN_DIR' 'PMX_DYNADATA_DIR' 'PMX_MEDIA_DIR' 'PMX_LAYOUT_DIR' 'PMX_MODULES_DIR' 'PMX_BLOCKS_DIR' 'PMX_THEMES_DIR' 'PMX_IMAGE_DIR' 'PMX_LANGUAGE_DIR' 'PMX_JAVASCRIPT_DIR' 'PMX_CONFIGFILE' 'MX_THEME' 'MX_THEME_DIR' config.php 'MX_FIRSTGROUPNAME' Format String String String String String Bool Bool Integer String String String String String String String String String String String String String String String String String User Inhalt standard 1.12.0 pragmaMx 1.12.0 Bemerkung Komplette Versionsnummer der PragmaInstallation Pmx-Version inclusive dem String pragmaMX Versionsnummer der Mainfile.php Datum der mainfile.php Revisionsnummer der mainfile.php Ist TRUE, wenn die pragmaMx geladen ist Ist TRUE wenn die maifile.php geladen ist. Startzeit der Seitenverarbeitung Directory-Separator wichtigste Pfad: zum mx-Root, ohne Slash am Ende Ordner mit den Systemdateien, Ordner mit den Administrationsdateien Ordner mit dynamischen Inhalten (Logdatein, Cache, etc.) Ordner mit dynamischen Medien (Bilder, Dokumente, etc.) Ordner mit den Systemdateien fuer die HTML-Ausgabe (view) Ordner mit den Modulen Ordner mit den System-Bloecken Ordner mit den Themes Ordner mit den Bildchen Ordner mit den Systemsprachen Ordner mit Standard Javascripten die Systemkonfigurationsdatei Theme Name Ordner mit dem Theme-Files Name der Standard Usergruppe

TRUE TRUE

modules.php

'MX_MODULE' 'MX_MODULE_FILE'

String String

Modulname Name der Moduldatei

'MX_MODULE' 'MX_ADMINPANEL_SYSTEM' 'MX_ADMINPANEL_CONTENT' 'MX_ADMINPANEL_SECURITY' 'MX_ADMINPANEL_USERS'

String integer Integer Integer Integer

Admin 1 2 3 4

2012 pragmaMx.org

admin.php

Modulename = admin Nummer der Tabs im Adminpaneel

14

pragmaMx

Programmers-Guide
Integer Integer Integer Integer Integer DECIMAL DECIMAL DECIMAL DECIMAL DECIMAL Integer Integer Integer Integer String String String String String String String String String String String String String String String String String String String 5 Sessiongltigkeit bei Inaktivitt Lifetime Cookie Session Lifetime Session Lifetime fr Gste Chmod

'MX_ADMINPANEL_ADDON' MX_SETINACTIVE_MINS MX_COOKIE_LIFETIME MX_SESSION_LIFETIME MX_SESSION_LIFETIME_NOUSER PMX_CHMOD_LOCK PMX_CHMOD_NORMAL PMX_CHMOD_UNLOCK PMX_CHMOD_FULLOCK PMX_CHMOD_FULLUNOCK PMX_GROUP_ID_ANONYMOUS PMX_GROUP_ID_USER PMX_GROUP_ID_ADMIN PMX_GROUP_ID_SYSADMIN MX_NEWSBLOCK_PREFIX MX_PHP_VERSION PMX_PAGE_DELIMITER Mx_baseconfig.php PMX_BASE_PATH PMX_SYSTEM_PATH PMX_ADMIN_PATH PMX_DYNADATA_PATH PMX_MEDIA_PATH PMX_LAYOUT_PATH PMX_MODULES_PATH PMX_THEMES_PATH PMX_IMAGE_PATH PMX_JAVASCRIPT_PATH PMX_CURRENTSCRIPT_PATH PMX_HOME_URL MX_REMOTE_ADDR MX_REMOTE_HOST MX_USER_AGENT Header.php Sql_layer.php MX_SQL_VERSION

0444 0644 0666 0400 0777 -1 0 -2 -3 block-vkp_News_

<!-- pagebreak --> / Includes/ Admin/ Dynadata/ Media/ Layout/ Modules/ Themes/ Images/ PMX_SYSTEM_PATH 'javascript/'

Gruppe fr Gste Standardgruppe fr angemeldete User Gruppe fr Standard-Admins Gruppe fr Systemadmins prefix um die Blcke vom NewsModul zu identifizieren PHP-Version Platzhalter um mehrseitige Inhalte zu splitten der wichtigste Pfad: zum mx-Root Ordner mit den Systemdateien Ordner mit den Administrationsdateien Ordner mit dynamischen Inhalten (Logdatein, Cache, etc.) Ordner mit dynamischen Medien (Bilder, Dokumente, etc.) Ordner mit den Systemdateien fuer die HTML-Ausgabe (view) Ordner mit den Modulen Ordner mit den Themes Ordner mit Bildern Ordner mit Standard Javascripten das aktuelle Verzeichnis ! ohne slash am Ende! URL inkl. evtl. Unterverzeichnis

$_SERVER['REMOTE_AD DR'] $_SERVER['REMOTE_HO ST'] $_SERVER['HTTP_USER_ AGENT'] SQL-Version

PMX_HEADER

Bool

True, wenn header.php geladen

2012 pragmaMx.org

15

pragmaMx

Programmers-Guide
Bool True, wenn footer.php geladen

Hinweis: Alle Konstanten, welche auf _DIR enden beinhalten den Pfad auf dem Server, im Gegensatz dazu enthalten alle Konstanten, welche auf _PATH enden, den Pfad zur pmx-Root.

Modul-Ordnerstruktur
Die zu einem Modul gehrenden Dateien sollten in folgender Weise strukturiert sein. Nachstehend aufgefhrt die empfohlene Ordnerstruktur innerhalb des Moduls. Diese Angaben sind natrlich teilweise optional und werden mit Sicherheit nicht fr jedes Modul komplett bentigt. Alle Dateien sind im Anhang noch mal mit einem Beispielcode aufgefhrt.

Inhalt der einzelnen Ordner Basisordner Muss enthalten eine index.php und eine setup.pmx.php Admin admin.php beinhaltet minimal den Sprungverteiler der einzelnen Adminoptionen admin.case.php admin.menu.php hier sind die Blcke des Modules hier sind die hook-Dateien abgelegt, die vom System entsprechend des Ereignisses aufgerufen werden: Install.tabledef.php DB-Installation Mod_rewrite.php Definitionsklasse der modRewrite-Funktionen user.edit.php user.add.php user.delete.php user.userpoints.php user.navbar.php user.visitmenu.php

Blocks Core

2012 pragmaMx.org

Footer.php

PMX_FOOTER

16

pragmaMx

Programmers-Guide

Images

Bentigte Bilder innerhalb des Modules

Includes bentigte Include-Dateien fr das Modul Language hier liegen alle Language-Files Style bentigte CSS-Dateien

Templates Template-Dateien fr die Ausgabe

In den Core-Ordnern von pragmaMx soll in Zukunft kein Modul mehr Dateien ablegen. In der Version 1.12 und lter sind folgende Dateien noch in den System-Ordnern vorhanden: links.modulexyz.php in admin/links case.modulexyz.php in admin/case

2012 pragmaMx.org

17

pragmaMx

Programmers-Guide

Beispieldateien
admin.php
<?php /** * */ // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); $module_name = basename(dirname(dirname(__FILE__))); // Sprachdateien einbinden mxGetLangfile($module_name,"admin.lang-*.php"); // eigene Includes einbinden //include ('modules'.DS.$module_name.DS.'core'.DS.'tabledef.php'); include (PMX_MODULES_PATH .$module_name.DS."inc".DS."functions.php"); /* Variablen auf Ausgangszustand setzen */ if if if if if if if (empty($ok)) $ok = 0; (empty($cat)) $cat=0; (empty($pic)) $pic=0; (empty($listlen)) $listlen=0; (empty($start)) $start=0; (empty($sort)) $sort=0; (empty($sortpublished)) $sortpublished=0;

if (!isset($act)) $act="" ; /* Sprungverteiler*/ switch ($act) { case "info": include .$module_name.DS."admin".DS."admin_info.php"); break; default: main(); break; } function main() { global $prefix; } ?>

(PMX_MODULES_PATH

2012 pragmaMx.org

18

pragmaMx Index.php
<?php /** * */

Programmers-Guide

// gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); // Variablen definieren $module_name=basename(dirname(__FILE__)); // Variablen auf Ausgangszustand setzen if (empty($act)) $act = ; // SPrachdateien einbinden mxGetLangfile($module_name); // eigene Includes einbinden include_once .$module_name.DS."includes".DS."functions.php"); /** * rechte Bloecke festlegen */ $index=0; /* Sprungverteiler */ switch ($act) { case "parameter": hpf(); break; default: main_hpf(); break; } function main_hpf() { global $prefix; } ?> (PMX_MODULES_PATH

setup.pmx.php
<?php // /** * Die Variable $credits wird vom System ausgelesen. * Hier sind keine Funktionen oder Ausgaben erlaubt. */ $credits = "blabla zu meinem Modul"; ?>

2012 pragmaMx.org

19

pragmaMx

Programmers-Guide

Blockdatei allgemein:
<?php /** * * $Revision: 0.1 $ * $Author: Author $ * $Date: 2009/01/14 $ */ // Blockcache ermoeglichen $mxblockcache = true; true/false

// optional zugehriger Modulname $module_name = 'ModuleXYZ'; // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); // evtl. Sprachdateien einbinden mxGetLangfile($module_name); // ggf. globale Veriablen deklarieren global $prefix; /* das ist der Blocktitel, kann aber auch in der Blockkonfiguration festgelegt werden. Vorrang hat der Eintrag in der Blockkonfiguration */ $blockfiletitle = "Blocktitle"; /* die Variable $content enthlt die komplette Ausgabe des Blockes */ $content="Blockinhalt; /* hier sind keine Ausgaben mit echo etc. erlaubt!! */ ?>

Admin.menu.php
<?php /** */ // gegen Direktaufruf sichern if (!defined("mxAdminFileLoaded")) // Modulename angeben $module_name="ModuleXYZ"; // hier wird der Link im Adminmenu generiert adminmenu("admin.php?op=$module_name", "bilddatei.png",MX_ADMINPANEL_ADDON); ?> ("Modulname"), die("Access Denied");

2012 pragmaMx.org

20

pragmaMx

Programmers-Guide

Admin.case.php
<?php /** */ // gegen Direktaufruf sichern if (!defined("mxAdminFileLoaded")) die("Access Denied"); switch($op) { case "parameter": // Moduleadmindatei einbinden include_once(dirname(dirname(__file__)) . '/admin/admin.php'); break; } ?>

User.delete.php
<?php /** * */ // delete user // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); // needed $uid= UserID

$module_name = basename(dirname(dirname(__FILE__))); // hier knnen die Daten anhand der Userid gelscht werden... ?>

User.edit.php
<?php /** * */ // edit user // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); // needed // todo ?> $uid= UserID

2012 pragmaMx.org

21

pragmaMx

Programmers-Guide

User.navbar.php
<?php /** * */ // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); global $prefix; $thismodname = basename(dirname(dirname(__FILE__))); $item[] = array(/* Attribute */ 'link' => 'modules.php?name=' . $thismodname."", 'caption' => $thismodname, 'image' => PMX_MODULES_PATH . $thismodname . '/style/images.png', 'tabname' => $thismodname, ); ?>

User.userpoits.php
<?php /** * */ // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); // $uid = UserId // return $hook_result $module_name = basename(dirname(dirname(__FILE__))); $hook_result += $mypoints; ?>

2012 pragmaMx.org

22

pragmaMx

Programmers-Guide

User.visitmenu.php
<?php /** * */ // gegen Direktaufruf sichern defined('mxMainFileLoaded') or die('access denied'); $thismodname = basename(dirname(dirname(__file__))); $item[] = array(/* Attribute */ 'link' => 'modules.php?name=' . $thismodname . 'blabla' . urlencode($userinfo['uid']), 'caption' => "BLABLA".$userinfo['uname'], 'image' => PMX_MODULES_PATH . $thismodname . '/style/images.png', 'tabname' => $thismodname, ); } ?>

Language-Datei
defined('mxMainFileLoaded') or die('access denied'); // ggf. Abfrage, ob Konstante schon definiert wurde if (!defined("_ADD") ) define("_ADD","New"); if (!defined("_HELP") ) define("_HELP","Help"); // Sprachkonstanten definieren define("_MODUL_INDEX","MODUL-Index");

2012 pragmaMx.org

23