Markerl
STIFTINGTAL.net always be connected
Wednesday, 14.05.2008, 7:07:27 | Server Uptime: 4 Tag(e), 13h, 49m, 28s | optimized for 800x600+
HomeProjektTechnikXtrasCommunityAboutIntern
Anmelden
UserOnline User online:

  • Anonym (30)

Name:
Passwort:
LOGIN
Passwort vergessen
Registrieren
eingeloggt bleiben
Aktuell
Deine Fotos auf Stiftingtal.net
Shoutbox
Gallery
Hochladen Bilder hochladen
Amazon

WLAN-CMS Dokumentation

unvollständig, under construction, ...

Das Objekt Page

Jede Seite, die ins CMS passen sol, muss bestimmte Regeln befolgen, damit Kopf und Fuss korrekt angezeigt wird, bzw. die Seite richtig ins Menü eingegliedert wird.

Das neue System ist objektorientiert. Ein Objekt repräsentiert nun eine Seite.

Zuerst muss die Datei eingebunden werden, die alle Definitionen enthält: Page.inc.php

Das Einbinden sollte

  • mit require geschehen. Damit wird das Script sofort abgebrochen, falls die Datei nicht gefunden werden kann.
  • mit once geschehen, damit die Datei auch sicher nur einmal eingebunden wird.

Also require_once. Das kann z.B. so geschehen:

require_once(dirname(__FILE__) . '/inc/Page.inc.php');

oder auch, wenn die Verzeichnisstruktur nicht zu kompliziert ist, einfach

require_once("inc/Page.inc.php");

Als nächstes erstellst du ein Objekt, dass die neue Seite repräsentiert. Der Typ des Objekts ist die Klasse "Page".
Dem Konstruktur *musst* du __FILE__ übergeben (damit das CMS weiss, in welcher Datei es sich befindet). Also z.B.:

$page = new Page(__FILE__);

Nun kannst du anfangen, der neuen Seite Attribute zu geben. Eine Seite muss einen Titel haben. Den setzt du mit Page::SetTitle. Also z.B.:

$page->SetTitle("Das ist der Titel der Seite");

Die MID

Was ist die MID? Die MID ist die Menü-ID. Damit das CMS weiss, wo es im Menü die Seite einreihen soll, muss eine eine eindeutige(!) ID geben. Wenn du keine MID zuweist, wird automatisch eine erstellt und zwar so, dass der Name der Datei in Großbuchstaben umgewandelt wird, der Punkt durch ein _ ersetzt wird. Daher solltest du diesen Namen dann genauso in der menu.inc.php setzen, oder du lässt ihn dort auch einfach weg.

Wenn das CMS keine Seite mit der passenden MID finden kann, wird jetzt eine Fehlermeldung ausgegeben, was die Fehlersuche erleichtert.

Ich werde auch noch eine Überprüfung einbauen, die kontrolliert, ob die MID eindeutig ist.

Wenn du dir sicher bist, dass der Dateiname eindeutig ist (z.B. diesedateigibtesimganzensystemnurEINMAL.php), dann kannst du die MID weglassen. Sonst erstelle einfach einen zufälligen String (der eindeutig sein muss!) und weise ihn der Seite mit Page::SetMID() zu.
Die gleiche MID muss jedenfalls auch in der menu.inc.php angegeben werden.

Für eine manuelle Zuweisung z.B.:

$page->SetMID('FGH45b4v5vgfhDFG435');

oder

$page->SetMID('EXTERN_PHP4563465456');

Beachte, dass du zwei Seiten in einem Menüpunkt unterbringen kannst, wenn du ihnen die gleiche MID zuweist. Das hab ich z.B. bei den Statistiken gemacht.

Seitenoptionen

Eine Seite soll ein bestimmtes Verhalten an den Tag legen, manchmal sollen die Applets angezeigt werden manchmal nicht. Bis jetzt gibt es folgende Optionen für eine Seite (die gewiss noch erweitert werden):

PAGEOPT_NOLEFTROW

verhindert, dass die linke Appletleiste bzw. das Menü angezeigt wird

PAGEOPT_NORIGHTROW

verhindert, dass die rechte Appletleiste angezeigt wird.
Setzen kannst du die Seitenoptionen mit Page::SetPageOption().
z.B.:

// zeige linke leiste nicht an
$page->SetPageOption(PAGEOPT_NOLEFTROW);

// zeige rechte leiste nicht an
$page->SetPageOption(PAGEOPT_NORIGHTROW);

Anzeigen der Seite

Den Header gibst du mit Page::Header() aus, den Footer mit Page::Footer().
Also z.B.:

// davor sollten keine HTML Ausgaben stehen, da alle Header (incl. HTTP-Header
// wie Cookies) erst durch Page::Header() gesetzt werden!
$page->Header();

// Der Inhalt der Seite

$page->Footer();

Sicherheit und Berechtigungen

Neu eingeführt wurde eine Klasse ACLSection, mit der es einfach möglich ist, Berechtigungen anzugeben und einfach prüfen zu lassen, ob der Besucher für eine bestimmte Aktion berechtigt ist.

Wenn du z.B. den Text "<p>Geheimtext<p>" nur anzeigen lassen willst, wenn der Benutzer in der Gruppe intern oder friends ist, dann erstellst du zuerst ein ACLSection Objekt:

$my_acl = new ACLSection;

Jetzt kannst du dem Objekt zuweisen, wer für die Aktion befugt ist:

$my_acl->AddGroup('intern');
$my_acl->AddGroup('friends');

Jetzt kannst du mit ACLSection::IsAllowed() einfach überprüfen, ob der gerade angemeldete User die Berechtigung hat:

if($my_acl->IsAllowed())
{
	echo "<p>Geheimtext</p>\n";
}
else
{
	echo "<p>Du bist nicht berechtigt, den Geheimtext zu sehen</p>\n";
}

Eine ACLSection erlaubt zuerst alles, d.h. wenn du ein leeres Objekt erstellst und ACLSection::IsAllowed() ausführst, hat jeder Zugriff.
Wenn du ACLSection::SetPublic(false) setzt, dürfen nur mehr Leute zugreifen, die angemeldet sind.
Bitte beachte, dass ACLSection::AddGroup() die private-Setzung impliziert. Das bedeutet, dass du es normalerweise so schön machen solltest:

$acl = new ACLSection;
$acl->SetPublic(false);
$acl->AddGroup('intern');

Aber ACLSection kann noch viel mehr (davon ist aber leider noch nicht so viel implementiert):

Der Konstruktor

Du kannst im Konstruktor bereits angeben, ob die Seite private (also nur angemeldete User dürfen sie sehen) oder public sein soll:

$acl = new ACLSection(true);  // Das gleiche wie new ACLSection()
$acl = new ACLSection(false); // Seite ist privat

ACLSection::SetPublic($pub) // $pub: boolean

Hiermit kannst du bestimmen, ob die der Benutzer angemeldet sein muss, oder nicht.

ACLSection::SetPrivate($priv) // $priv: boolean

Bewirkt das gleiche wie ACLSection::SetPublic() nur umgekehrt.

ACLSection::SetMode($mode = ACL_ALLOW)

Setzt den Modus des Objektes. Es gibt zwei Modi: ACL_ALLOW und ACL_DENY.

ACL_ALLOW bedeutet, dass grundsätzlich alles erlaubt ist, das nicht explizit verboten ist. ACL_DENY bedeutet, dass grundsätzlich alles verboten ist, was nicht explizit erlaubt ist.

Im Normalzustand ist der Modus ACL_ALLOW. Das bedeutet, jeder ist befugt.

Wird die Seite aber private gemacht, wird der Modus automatisch auf ACL_DENY gesetzt, d.h. nur Mehr Gruppen oder Benutzer, die explizit angegeben sind, haben einen Zugriff.

ACLSection::AddGroup($gruppe, $modus = ACL_ALLOW)

Fügt eine Gruppe hinzu. Mit dem zweiten Parameter kann man angeben wie. Normalerweise ist er auf ACL_ALLOW, d.h. Personen hat Zugriff. Setzt man ihn auf ACL_DENY, so darf diese Gruppe nicht zugreifen.

ACLSection::RemoveGroup($gruppe, $modus = ACL_ALLOW)

Entfernt einen Eintrag, der zuvor gemacht wurde.

ACLSection::AddUser($user, $modus = ACL_ALLOW)

Funktioniert gleich wie ACLSection::AddGroup, nur mit Usern.

ACLSection::RemoveUser($user, $modus = ACL_ALLOW)

Entfernt einen betreffenden Eintrag, der zuvor gemacht wurde.

ACLSection::AddAddress($addr, $mode = ACL_DENY)

Hier können einzelne Computer oder ganze Netzwerke hinzugefügt werden, die Zugriff haben sollen.

Gültig sind alle normales UNIX-Angaben, wie z.B.:

192.168.0.200 (IP Adresse)
bloodhound (DNS-Name)
bloodhound.intern.stiftingtal.net (voller DNS-Name)
192.168.0.0/24 (das komplette WLAN)
192.168.0.0 255.255.255.0 (das komplette WLAN)
192.168.0.1 (ianus, also alle externen Besucher)

ACLSection::RemoveAddress($addr, $mode = ACL_DENY)

Dient zum Entfernen eines Eintrags, der zuvor mit ACLSection::AddAddress() hinzugefügt wurde.

ACLSection::GetReasonGroup()

Falls der Benutzer nicht berechtigt ist, gibt diese Funktion die Gruppe zurück, an der (falls) die Authentifizierung gescheitert ist. Das ist z.B. nützlich, um mittels RequireAuth() die passende Meldung zu erzeugen, oder unterschiedliche Meldungen je nach Berechtigung.
z.B.

if(!$acl->IsAllowed)
{
	$group = $acl->GetReasonGroup();
	RequireAuth($group);
}

ACLSection::IsAllowed()

Diese Funktion überprüft, ob der aktuell angemeldete Benutzer mit den zuvor eingegebenen Regeln berechtigt ist. Gibt entweder true zurück, falls er berechtigt ist, sonst false.

Zusammenfassung

Durch diese Klasse ist es nun einfach möglich, innerhalb von einer Seite verschiedene Bereiche ('Sections') zu definieren, die alle unterschiedliche Berechtigungen haben sollen. Dazu muss einfach für jede Sektion ein neues ACLSection-Objekt erstellt werden.

Rechte einer Seite

Will man nun eine komplette Seite nur einer Gruppe zugänglich machen, so muss man nicht mehr mühevoll eine eigene ACLSection erstellen, und die über die ganze Seite strecken; mit der neuen Page-Klasse können für die ganze Seite direkt Berechtigungen gesetzt werden.

Und zwar liefert Page::GetACL() einen Zeiger auf ein internes ACLSection Objekt vom Page-Objekt.
Dieses wird im Konstruktor von Page wie ein normales ACLSection Objekt erstellt, das bedeutet, die Sektion ist public und auf ACL_ALLOW gesetzt.

Will man diese Berechtigungen für die komplette Seite nun ändern, so muss man sich die Referenz dieses Objektes holen:

$page_acl = &$page->GetACL();

Nun kann man $page_acl wie eine normale ACLSection befüllen.

Ruft man nun Page::Header() auf, und dem Benutzer fehlen die Berechtigungen, so wird direkt RequireAuth aufgerufen, der Footer angezeigt und das Script beendet.

© 2003-2007 by Niki Hammler, GFX/Design by Markus Pirker

ADMIN LOGIN

Erstellt in 0.918 Sekunden. Davon 0 Sekunden SQL Abfragen von insgesamt 10 SQL Abfragen.
Letzte Änderung (Code dieser Seite): 11.01.2008 17:28