White-paper: Jäger zwischen zwei Welten Einleitung Nicht die Augen vor guten Technolgie-Strategien verschliessen, sondern die guten Applikations Desings aus verschiedenen Welten zusammenführen, ist meine Empfehlung. Manfred Jehle CEO / General Manager CeTris GmbH Die Ansätze der ASP.NET Technologie in PHP übertragen Die Vorteile des Code-Behind-Ansatzes von Microsoft können zusammen mit dem MVC (Model-View-Control) Designpattern zu einem einfachen Aufbau der Webseiten genutzt werden. Dabei ist im weiteren der Seiten-Template-Ansatz zusätzlich auf einfache Weise integrierbar. Die Basis des.net-frameworks muss nicht einmal in PHP übertragen werden. Die Grundstrukturen von PHP 4 reichen zur Erstellung einer Webpräsenz mit diesem Ansatz. Welche Vorteile der ASP.NET-Welt bringen in der PHP-Welt Vorteile? Die Trennung eines Templates von den seitenspezifischen Inhalten braucht einen Ansatz, der im ASP.NET mit Custom-Page verfolgt wird. Einzelne Seitenbereiche werden dabei als Control-Parts angesehen. So sind Bereiche für Header, CSS-Einbindung, Navigation, Title und Content fest im Template eingebaut. Diese werden zum Zeitpunkt der Seitengenerierung an die entsprechenden Templatebereiche ausgeliefert. Dies entspricht dem ASP.NET Ansatz der Render. Umsetzungsstrategie Das MVC-Pattern wird konsequent eingesetzt und zusätzlich mit einer Mehrschicht-Architektur verknüpft. Zudem wird ein SecurityLayer eingesetzt, um die Zugriffsberechtigungen zu prüfen und die entsprechenden Berechtigungen für den User für die anderen Schichten zugänglich zu machen. Durch die strikte Aufteilung der Aufgabengebiete auf die Klassen konnte eine einfache und übersichtliche Codestruktur erstellt werden. Die ViewLayer-Class wird pro Seite instanziert. Das Management der Instanzierung erfolgt in der ViewLayer-Class.
Erfahrung Durch die konsequente Trennung von Page Template Klassenstruktur konnte effizient eine grössere Web-Applikation in kurzer Zeit erstellt werden. Zudem wurde für Erweiterungen eine optimale Basis geschaffen, um auf einfache Weise neue Seiten einzubauen oder bestehende Seiten umzubauen. Das Security- Management inklusive Zugriff und Bearbeitungsberechtigungen wurde zentralisiert. Die Entflechtung von HTML und Code bringt den von ASP.NET gewohnten Vorteil und einen entscheidenden Überblick über den vorhandenen Code und dessen Funktion. Die Grenzen liegen ganz klar bei PHP 4. Die beschnittene Objektorientierung vor allem mit dem Fehlen des Überladens von Methodenbringt entscheidende Nachteile gegenüber ASP.NET. Dasselbe gilt für das Fehlen eines Event- Managements. Dieses zu integrieren, sprengt den Rahmen kleinerer Budgets. Somit muss es umgangen werden, was die Möglichkeiten gegenüber der ASP.NET-Struktur massiv einschränkt. Damit ist der Aufbau einer Pre-Render- und Render-Architektur nicht möglich. Fazit Durch den Blick über den eigenen Grenzzaun hinaus wurde eine strategisch wertvolle Architektur erstellt, auf welcher auch in Zukunft aufgebaut werden kann und ein Wachstum sowohl im Umfang als auch beim Einsatz der Datenbank ermöglicht. Der Austausch der Datenbank bedingt lediglich den Austausch der DatabaseLayer-Class. Code Auf den nächsten Seiten finden Sie Ausschnitte aus dem Code.
Page <?php $controllayer->controller($pagename,'','');?> <?php include_once('template.php');?> Template <html> <head> <title><?php echo($controllayer->gettitle());?></title> <link rel="stylesheet" href="css/basic.css" type="text/css" media="screen" /> <?php echo($controllayer->getscriptpart());?> </head> <body <?php echo($controllayer->getbodytagextention());?>> <?php echo($controllayer->getformpart());?> <table id="total" cellpadding="0" cellspacing="0"> <tr id="header"> <td colspan="2"> <div id="header"> <div id="logohomeleft"><a href="<?php echo('jobs.php?phpsessid='.session_id ().'&lan='.$controllayer->getlanguageid());?>"><img src="../img/x.gif" height="50px" width="100" alt="home" border="0"></a></div> <div id="logohomeright"></div> <div id="logohometext"><?php echo($controllayer->gettitle());?></div> <div id="header_trenner"><a href=""><img src="../img/x.gif" height="10px" width="100px" alt="home" border="0"></a></div> <div id="header_infoline"><a href=""><img src="../img/x.gif" height="15px" width="13px" alt="home" border="0"></a> <?php echo($controllayer->getcontentstatus());?> </div> </div> ControllLayer-Class class ControlLayer var $databaselayer; var $businesslayer; var $SecurityLayer; var $ViewLayer; var $Login; var $PW; var $spagename; // Constructor function ControlLayer() $this->databaselayer = new DatabaseLayer(); $this->businesslayer = new BusinessLayer($this->databaseLayer); $this->securitylayer = new SecurityLayer($this->businessLayer); function Controller($action,$UserLogin,$UserPw) // do all for controlling the flow function GetNavigation() return $this->viewlayer->snavigation; function GetContentTitle() return $this->viewlayer->scontenttitle;
function GetContentStatus() return $this->viewlayer->scontentstatus; function GetHidenFields() return $this->viewlayer->shiddenfields; function GetScriptPart() return $this->viewlayer->sscriptpart; function GetContent() return $this->viewlayer->scontent; function GetTitle() return $this->viewlayer->stitle; function GetFormPart() return $this->viewlayer->sformpart; function GetBodyTagExtention() return $this->viewlayer->sbodytagextention; function GetHiddenFields() return $this->viewlayer->shiddenields; function GetBusinessLayer() return $this->businesslayer; function Destructor() $this->businesslayer->destructor(); function GetUserName() return $this->securitylayer->getusername(); function GetUserID() return $this->securitylayer->getuserid(); function IsAdmin() return $this->securitylayer->isadmin(); function GetViewState() return $this->sviewstate;
ViewLayer Class class ViewLayer // Constructor function ViewLayer($parent,$businessLayer,$action) $this->parent = $parent; $this->businesslayer = $businesslayer; // now its ready to produce Content $this->init(); function Init() $this->inistate(); $this->getviewstate(); $this->geterrorfield(); $this->createtitle(); $this->createstatusline(); $this->createcontentheader(); $this->createformpart(); $this->createnavigation(); $this->createcontent(); $this->createhiddenfields(); $this->createbodypartextention(); $this->createscriptpart(); Manfred Jehle, Zug Weder Auszüge mit oder ohne Quellenangabe, noch der ganze Text darf ohne Erlaubnis von Manfred Jehle weiterverwendet werden. Dasselbe gilt für die verwendeten Skizzen, Bilder und Codeausschitte.