Anhang B: Metaphern in der Führung komplexer ... - Universität Zürich
Anhang B: Metaphern in der Führung komplexer ... - Universität Zürich
Anhang B: Metaphern in der Führung komplexer ... - Universität Zürich
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Entwicklung e<strong>in</strong>es Content Management<br />
Systems für die MIO-Lernumgebung<br />
Diplomarbeit im Fach Informatik<br />
vorgelegt von<br />
Christian Ziegler<br />
Bett<strong>in</strong>gen,Basel,CH<br />
Matrikelnr.: 95-915-021<br />
Angefertigt am<br />
Institut für Informatik<br />
<strong>der</strong> <strong>Universität</strong> <strong>Zürich</strong><br />
Prof. Dr. H. Schauer<br />
Betreuer: Dr. Andreas Huber<br />
Abgabe <strong>der</strong> Arbeit: 08.10.2002
CMS für die MIO-Lernumgebung Inhaltsverzeichnis<br />
Inhaltsverzeichnis<br />
Inhaltsverzeichnis .......................................................................................................................2<br />
Abbildungsverzeichnis ................................................................................................................5<br />
Tabellenverzeichnis ....................................................................................................................6<br />
Zusammenfassung/Abstract ........................................................................................................7<br />
1. Ausgangslage ..........................................................................................................................8<br />
1.1. Voraussetzungen .............................................................................................................8<br />
1.2. Problemstellung ...............................................................................................................8<br />
1.3. Rahmenbed<strong>in</strong>gungen .......................................................................................................9<br />
1.4. Glie<strong>der</strong>ung <strong>der</strong> Arbeit .....................................................................................................9<br />
2. E<strong>in</strong>leitung ..............................................................................................................................10<br />
2.1.Verwendete Technologien .............................................................................................10<br />
2.1.1. Apache ...................................................................................................................10<br />
2.1.2. MySQL ..................................................................................................................10<br />
2.1.3. PHP ........................................................................................................................10<br />
2.1.4. XML/XSL/HTML .................................................................................................11<br />
2.1.5. PhpMyAdm<strong>in</strong> ........................................................................................................13<br />
2.2. E<strong>in</strong>führung <strong>in</strong> das konzeptuelle Datenbankschema ......................................................14<br />
2.2.1. Konzepte ................................................................................................................14<br />
2.3. Begriffsabgrenzung .......................................................................................................16<br />
2.4. E<strong>in</strong>führung Content Management System ....................................................................17<br />
2.4.1. Herkömmliches Webpublish<strong>in</strong>g vs. Content Management ...................................17<br />
2.4.2. Kernpr<strong>in</strong>zip von Content Management Systemen .................................................17<br />
2.4.3. Content Life Cycle ................................................................................................18<br />
2.4.4. Anfor<strong>der</strong>ungen an e<strong>in</strong> Content Management System ............................................20<br />
2.5. Open source CMS .....................................................................................…................23<br />
3. Anfor<strong>der</strong>ungsspezifikation des Content Management Systems ..........................................24<br />
3.1. Systemanfor<strong>der</strong>ungen ...................................................................................................25<br />
3.2. Objektmodell ................................................................................................................30<br />
3.3. Anwendungsfall-Diagramm .........................................................................................32<br />
3.4. Detailanalyse <strong>der</strong> Hauptanwendungsfälle ....................................................................33<br />
3.4.1. Lehrtext anschauen ................................................................................................34<br />
3.4.2. Lehrtext erstellen ...................................................................................................35<br />
3.4.3. Lehrtext editieren ...................................................................................................36<br />
3.4.4. Lehrtext prüfen ......................................................................................................37<br />
3.4.5. Metadaten verwalten .............................................................................................38<br />
3.4.6. Archiv ....................................................................................................................39<br />
3.5. Zustandsmodelle ...........................................................................................................40<br />
3.6. Analyse des bestehenden Designs .................................................................................42<br />
4. Architekturentwurf ................................................................................................................43<br />
4.1. Datenbankstruktur .........................................................................................................44<br />
4.2. Trennung von Inhalt und Layout ...................................................................................47<br />
2
CMS für die MIO-Lernumgebung Inhaltsverzeichnis<br />
4.3. Struktur <strong>der</strong> Website .....................................................................................................48<br />
5. Implementierung ...................................................................................................................54<br />
5.1. Genereller Skriptaufbau ................................................................................................55<br />
5.2. Verwendung von $_POST ............................................................................................56<br />
5.3. edit_xml.php .................................................................................….......…..................57<br />
5.4. XML, XSL und DTD ....................................................................................................64<br />
6. Proof of Concept ...............................................................................................................…65<br />
7. Benutzerdokumentation ........................................................................................................67<br />
7.1. E<strong>in</strong>führung .....................................................................................................................67<br />
7.2. Bedienung .....................................................................................................................68<br />
7.2.1. Hauptfenster ..........................................................................................................68<br />
7.2.2. Funktionen .............................................................................................................69<br />
8. Zusammenfassung und Ausblick ..........................................................................................84<br />
8.1. Zusammenfassung .........................................................................................................84<br />
8.2. Ausblick ........................................................................................................................84<br />
9. Literaturverzeichnis ..............................................................................................................86<br />
<strong>Anhang</strong> A: Tabellen ..................................................................................................................88<br />
<strong>Anhang</strong> B: <strong>Metaphern</strong> <strong>in</strong> <strong>der</strong> <strong>Führung</strong> <strong>komplexer</strong> IT-Projekte [Hald02]<br />
aufbereitet als Lehre<strong>in</strong>heit ......................................................................................90<br />
<strong>Anhang</strong> C: e<strong>in</strong>gerichtete Umgebung .........................................................................................99<br />
httpd.conf .............................................................................................................................99<br />
php.<strong>in</strong>i .................................................................................................................................109<br />
<strong>Anhang</strong> D: Source-Code .........................................................................................................118<br />
1. frame.php .......................................................................................................................119<br />
2. <strong>in</strong>dex.html .......................................................................................................................119<br />
3. table_of_contents.html ...................................................................................................119<br />
4. choose_class.php ............................................................................................................119<br />
5. contents.php ...................................................................................................................121<br />
6. show_content.php ...........................................................................................................125<br />
7. new_content.php ............................................................................................................126<br />
8. edit_content.php .............................................................................................................126<br />
9. archive.php .....................................................................................................................127<br />
10. check_content.php ........................................................................................................128<br />
11. set_state.php .................................................................................................................128<br />
12. get_metadata.php .........................................................................................................129<br />
13. set_metadata.php .........................................................................................................131<br />
14. edit_xml.php ................................................................................................................132<br />
15. content.xsl ....................................................................................................................141<br />
3
CMS für die MIO-Lernumgebung Inhaltsverzeichnis<br />
16. content_form.xsl ...........................................................................................................142<br />
17. content.dtd ....................................................................................................................143<br />
18. Bedienungsanleitung_CMS.html .................................................................................143<br />
4
CMS für die MIO-Lernumgebung Abbildungsverzeichnis<br />
Abbildungsverzeichnis<br />
Abb. 1: ER-Gegenstandstyp (nach [Ditt99]) .............................................................................14<br />
Abb. 2: ER-Beziehungstyp mit Strukturbeschränkungen (nach [Ditt99]) ................................15<br />
Abb. 3: Manuelle Adm<strong>in</strong>istration vs. Content Management System [P<strong>in</strong>uts] ..........................17<br />
Abb. 4: Verwendung von Templates [P<strong>in</strong>uts] ...........................................................................18<br />
Abb. 5: Content-Lifecycle [We<strong>in</strong>00].........................................................................................19<br />
Abb. 6: Objektmodell ................................................................................................................31<br />
Abb. 7: Anwendungsfall-Diagramm .........................................................................................32<br />
Abb. 8: Aktivitätsdiagramm Lehrtext anschauen......................................................................34<br />
Abb. 9: Aktivitätsdiagramm Lehrtext erstellen .........................................................................35<br />
Abb. 10: Aktivitätsdiagramm Lehrtext editieren.......................................................................36<br />
Abb. 11: Aktivitätsdiagramm Lehrtext prüfen ..........................................................................37<br />
Abb. 12: Aktivitätsdiagramm Metadaten verwalten..................................................................38<br />
Abb. 13: Aktivitätsdiagramm Lehrtext aus Archiv anschauen..................................................39<br />
Abb. 14: Zustandsmodell Life Cycle e<strong>in</strong>es Lehrtextes..............................................................41<br />
Abb. 15: Zustandsmodell Status e<strong>in</strong>es Lehrtext än<strong>der</strong>n ............................................................41<br />
Abb. 16: ER-Diagramm.............................................................................................................44<br />
Abb. 17: Website-Struktur.........................................................................................................48<br />
Abb. 18: Screenpr<strong>in</strong>t Index.html ...............................................................................................49<br />
Abb. 19: Screenpr<strong>in</strong>t Auswahl Editieren...................................................................................50<br />
Abb. 20: Screenpr<strong>in</strong>t Thema und L<strong>in</strong>k <strong>in</strong> Template („content_form.xsl“) e<strong>in</strong>fügen ................51<br />
Abb. 21: Screenpr<strong>in</strong>t Ausgabe des Dokuments mit Stylesheet „content.xsl“ ...........................52<br />
Abb. 22: Screenpr<strong>in</strong>t Hauptfenster ............................................................................................68<br />
Abb. 23: Screenpr<strong>in</strong>t Ansicht ....................................................................................................69<br />
Abb. 24: Screenpr<strong>in</strong>t Erstellen...................................................................................................70<br />
Abb. 25: Screenpr<strong>in</strong>t Thema wählen .........................................................................................71<br />
Abb. 26: Screenpr<strong>in</strong>t Untertitel1, Untertitel2 und Textarea ......................................................72<br />
Abb. 27: Screenpr<strong>in</strong>t Syntaktisch unkorrekte Tag-E<strong>in</strong>gabe ......................................................74<br />
Abb. 28: Screenpr<strong>in</strong>t E<strong>in</strong>gerückte Listen- und Tabellen-Tags <strong>in</strong> <strong>der</strong> Textarea.........................75<br />
Abb. 29: Screenpr<strong>in</strong>t L<strong>in</strong>k/Bild e<strong>in</strong>fügen ..................................................................................76<br />
Abb. 30: Screenpr<strong>in</strong>t Textarea-E<strong>in</strong>trag......................................................................................77<br />
Abb. 31: Screenpr<strong>in</strong>t Ausgabe...................................................................................................78<br />
Abb. 32: Screenpr<strong>in</strong>t Genehmigen/Ablehnen............................................................................80<br />
Abb. 33: Screenpr<strong>in</strong>t Metadaten................................................................................................82<br />
Abb. 34: E<strong>in</strong>flüsse auf das <strong>Führung</strong>sverhalten [Hald02] ..........................................................95<br />
5
CMS für die MIO-Lernumgebung Tabellenverzeichnis<br />
Tabellenverzeichnis<br />
Tab. 1: Anwendungsfall Lehrtext anschauen ............................................................................34<br />
Tab. 2: Anwendungsfall Lehrtext erstellen ...............................................................................35<br />
Tab. 3: Anwendungsfall Lehrtext editieren...............................................................................36<br />
Tab. 4: Anwendungsfall Lehrtext prüfen ..................................................................................37<br />
Tab. 5: Anwendungsfall Metadaten verwalten..........................................................................38<br />
Tab. 6: Anwendungsfall Archiv ................................................................................................39<br />
Tab. 7: Metadata........................................................................................................................45<br />
Tab. 8: Content ..........................................................................................................................45<br />
Tab. 9: State...............................................................................................................................45<br />
Tab. 10: Groups_persons [Lagl02]............................................................................................46<br />
Tab. 11: Classes_groups [Lagl02].............................................................................................46<br />
Tab. 12: Metadata......................................................................................................................88<br />
Tab. 13: Content ........................................................................................................................88<br />
Tab. 14: State.............................................................................................................................88<br />
Tab. 15: Groups_persons [Lagl02]............................................................................................88<br />
Tab. 16: Classes_groups [Lagl02].............................................................................................88<br />
Tab. 17: Classes [Lagl02]..........................................................................................................89<br />
Tab. 18: Groups [Lagl02] ..........................................................................................................89<br />
Tab. 19: Themes [Lagl02] .........................................................................................................89<br />
Tab. 20: Persons [Lagl02] .........................................................................................................89<br />
Tab. 21: Begriff Lea<strong>der</strong>ship vs. Management [Hald02]............................................................92<br />
Tab. 22: Systemebenen [Hald02] ..............................................................................................97<br />
Tab. 23: Situativer E<strong>in</strong>satz von <strong>Metaphern</strong> [Hald02]................................................................98<br />
6
CMS für die MIO-Lernumgebung Zusammenfassung<br />
Zusammenfassung<br />
Die Informationsflut grosser Websites ist immer schwieriger zu handhaben. Der Arbeitsaufwand<br />
und die Kosten für Erstellung und Pflege von Inhalten durch Programmierer und<br />
Redakteure führen zu immer grösseren Problemen.<br />
Durch die E<strong>in</strong>führung e<strong>in</strong>es Content Management Systems zur Strukturierung und Verwaltung<br />
<strong>der</strong> Informationsseiten sollen die Handlungen <strong>der</strong> Anwen<strong>der</strong> koord<strong>in</strong>iert und die Veröffentlichung<br />
<strong>der</strong> Dokumente automatisiert werden.<br />
Im Rahmen dieser Diplomarbeit wurde für die webbasierte Lernumgebung des Ergänzungsstudiums<br />
MIO (Mensch Informatik Organisation) e<strong>in</strong> Content Management System entwickelt,<br />
welches die Verfasser bei <strong>der</strong> Erstellung, Steuerung und Organisation von Lehrtexten<br />
unterstützen soll. Die Arbeit basiert auf <strong>der</strong> vorgängigen Analyse des aktuellen Stands <strong>der</strong><br />
Technik („state of the art“) von Content Management Systemen. Abschliessend wurde das<br />
CMS-Tool im S<strong>in</strong>ne e<strong>in</strong>es „Proof of Concept“ anhand e<strong>in</strong>er beispielhaften Lehre<strong>in</strong>heit<br />
getestet.<br />
Abstract<br />
The amount of <strong>in</strong>formation <strong>in</strong> the web is gett<strong>in</strong>g more and more difficult to handle.<br />
Expenditure of energy and costs of produc<strong>in</strong>g and manag<strong>in</strong>g the content by programmers and<br />
editors results <strong>in</strong> bigger and bigger problems.<br />
The <strong>in</strong>troduction of a content management system to structure and manage the sites should<br />
coord<strong>in</strong>ate the acts of users and automate the publication of documents.<br />
With<strong>in</strong> the scope of this diploma a content management system has been developed for the<br />
webbased learn<strong>in</strong>g environment of MIO, which should help authors to produce, control and<br />
organize the learn<strong>in</strong>g texts. This thesis bases on analyses of the state of the art of content<br />
management systems. F<strong>in</strong>ally, the tool was tested as a proof of concept with an exemplary<br />
learn<strong>in</strong>g unit.<br />
7
CMS für die MIO-Lernumgebung Ausgangslage<br />
1. Ausgangslage<br />
1.1. Voraussetzungen<br />
„Das Ergänzungsstudium mensch | <strong>in</strong>formatik | organisation (MIO) wird vom Institut für<br />
Informatik <strong>der</strong> <strong>Universität</strong> <strong>Zürich</strong> angeboten. Es richtet sich an <strong>Führung</strong>skräfte aus den<br />
Bereichen Bus<strong>in</strong>ess, Informatik, Organisationsentwicklung und Human Ressources, die für<br />
ihre aktuelle o<strong>der</strong> zukünftige Tätigkeit profunde Kenntnisse <strong>der</strong> <strong>Führung</strong> und des<br />
Managements technisch <strong>in</strong>novativer Verän<strong>der</strong>ungsprozesse benötigen. Der Studiengang<br />
vermittelt im ersten Semester neue Erkenntnisse über Wissensgebiete, die zur Entwicklung<br />
und E<strong>in</strong>führung <strong>in</strong>novativer IT- Lösungen relevant s<strong>in</strong>d. Fallbeispiele aus <strong>der</strong> Praxis <strong>der</strong><br />
Studienteilnehmer werden exemplarisch analysiert und Lösungsansätze diskutiert. Begleitende<br />
Lerngruppen und e<strong>in</strong>e webbasierte Lernumgebung unterstützen die Lernprozesse“ [Mahl02].<br />
Für das Ergänzungsstudium MIO wurde e<strong>in</strong>e webbasierte Lernumgebung entwickelt. Sie dient<br />
<strong>der</strong> Verwaltung aller MIO-Benutzerdaten, <strong>der</strong> Kommunikation zwischen den Studienteilnehmern,<br />
<strong>der</strong> Erfassung und Veröffentlichung von eigenen Projektarbeiten und <strong>der</strong><br />
Bereitstellung von Lernmaterialien und Informationen über den Studiengang [Mahl02].<br />
Die MIO-Lernumgebung wurde bis Ende Mai 2002 überarbeitet und e<strong>in</strong>e neue Version <strong>der</strong><br />
MIO-Lernumgebung (Lernumgebung 2.0 siehe [Mahl02],[Nier02],[Lagl02]) erstellt. Nach<br />
dieser grundlegenden Überarbeitung sollen nun auf <strong>der</strong> neuen Plattform funktionelle<br />
Ergänzungen zur Verbesserung <strong>der</strong> Lehr- und Lernunterstützung des Tools realisiert werden.<br />
1.2. Problemstellung<br />
Das zu entwickelnde Content Management System (CMS) soll die Verfasser von Lehrtexten<br />
für die MIO-Lernumgebung bei ihrer Arbeit unterstützen. Unter „Content“ wird hier Lehrstoff<br />
verstanden.<br />
Nach e<strong>in</strong>er Literaturanalyse über den aktuellen Stand <strong>der</strong> Technik („state of the art“) im<br />
Bereich Content Management ist e<strong>in</strong>e formalisierte und grafisch aufbereitete Spezifikation für<br />
e<strong>in</strong> CMS zu erstellen.<br />
Anschliessend wird die technische Spezifikation auf dem Testsystem implementiert.<br />
Beson<strong>der</strong>s betont wird die Abgrenzung zwischen <strong>der</strong> Verwaltung <strong>der</strong> Daten über<br />
konventionelle relationale Datenbanken und mittels XML/XSL.<br />
Die Arbeit soll auf <strong>der</strong> Struktur <strong>der</strong> bestehenden Datenbank aufsetzen. Diese kann gegebenenfalls<br />
erweitert werden. Kritisch zu überprüfen ist das bestehende Design <strong>der</strong> Aufbereitung und<br />
<strong>der</strong> Ausgabe von Lehrtexten.<br />
Basierend auf dieser Implementation soll anschliessend e<strong>in</strong>e beispielhafte Lerne<strong>in</strong>heit mit dem<br />
Thema „<strong>Metaphern</strong> <strong>in</strong> <strong>der</strong> <strong>Führung</strong> von komplexen IT-Projekten“ für die Lernumgebung<br />
aufbereitet werden. Dabei ist von <strong>der</strong> Semesterarbeit von Lukas Haldemann [Hald02]<br />
auszugehen. Mit ihr soll die Applikation im S<strong>in</strong>ne e<strong>in</strong>es „Proof of Concept“ überprüft werden.<br />
Abschliessend ist e<strong>in</strong>e HTML-Datei als Benutzerleitfaden zu erstellen.<br />
8
CMS für die MIO-Lernumgebung Ausgangslage<br />
1.3. Rahmenbed<strong>in</strong>gungen<br />
Die Arbeiten s<strong>in</strong>d <strong>in</strong> die vom Schwerpunkt MIO unterstützte technische Umgebung e<strong>in</strong>zupassen<br />
(Apache, MySQL, PHP4, XML, XSL). Die Programmierarbeiten sollen primär auf<br />
e<strong>in</strong>er selbst e<strong>in</strong>gerichteten Umgebung ausgeführt werden. Für den Systemtest steht e<strong>in</strong> Server<br />
auf <strong>der</strong> Basis von MacOSX am Schwerpunkt MIO zur Verfügung.<br />
1.4. Glie<strong>der</strong>ung <strong>der</strong> Arbeit<br />
Das folgende Kapitel 2 führt zunächst <strong>in</strong> die verwendeten Technologien und <strong>in</strong> das<br />
konzeptuelle Datenbankschema e<strong>in</strong>, <strong>der</strong> Begriff „Content Management“ wird abgegrenzt und<br />
es wird e<strong>in</strong>e E<strong>in</strong>führung <strong>in</strong> Content Management Systeme (CMS) gegeben.<br />
Schliesslich behandelt das Kapitel e<strong>in</strong>e mögliche Verwendung von Open Source CMS.<br />
Kapitel 3 spezifiziert die Anfor<strong>der</strong>ungen an das CMS.<br />
Kapitel 4 erläutert die Datenbank- und die Websitestruktur und den konzeptuellen Entwurf.<br />
In Kapitel 5 folgt die Beschreibung <strong>der</strong> Implementierung. Es werden die wichtigsten<br />
Codestücke genauer umschrieben und erklärt.<br />
Kapitel 6 beschreibt die beim „Proof of Concept“ gemachten Erfahrungen und <strong>der</strong>en Fazit.<br />
E<strong>in</strong>e Bedienungsanleitung des Content Management Systems ist unter Kapitel 7 abgedruckt.<br />
Kapitel 8 fasst die Arbeit zusammen und gibt Ausblick auf zukünftige Erweiterungen des<br />
Programms.<br />
Kapitel 9 be<strong>in</strong>haltet das Literaturverzeichnis.<br />
In <strong>Anhang</strong> A s<strong>in</strong>d die Tabellen zum Datenbankschema zu f<strong>in</strong>den.<br />
<strong>Anhang</strong> B gibt Auskunft über die Versionen <strong>der</strong> verwendeten Technologien und be<strong>in</strong>haltet die<br />
Konfigurationsdateien <strong>der</strong> e<strong>in</strong>gerichteten Umgebung.<br />
<strong>Anhang</strong> C be<strong>in</strong>haltet die aufbereitete Lehre<strong>in</strong>heit.<br />
In <strong>Anhang</strong> D ist <strong>der</strong> Quellcode und <strong>der</strong> HTML-Quellcode <strong>der</strong> Bedienungsanleitung abgedruckt.<br />
Alle Quellcode-Dateien sowie die Arbeit selbst s<strong>in</strong>d auf <strong>der</strong> beiliegenden CD abgespeichert.<br />
9
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2. E<strong>in</strong>leitung<br />
2.1. Technologien<br />
Folgende Technologien werden verwendet:<br />
• Apache Webserver<br />
• MySQL Datenbank<br />
• PHP4 Serverscriptsprache<br />
• XML/XSL/HTML/Javascript<br />
• PhpMyAdm<strong>in</strong><br />
2.1.1. Apache<br />
Apache ist <strong>der</strong> mit 54% Verbreitung am meisten e<strong>in</strong>gesetzte Webserver [Netcra]. Er ist <strong>in</strong>kl.<br />
Quellcode für mehr als zwei Dutzend Plattformen frei verfügbar. Die Apache-Software<br />
zeichnet sich durch Stabilität, Robustheit und Geschw<strong>in</strong>digkeit aus [Apache].<br />
2.1.2. MySQL<br />
MySQL ist e<strong>in</strong> relationales Datenbank-Verwaltungssystem, das für den nicht kommerziellen<br />
E<strong>in</strong>satz als Open Source Software frei verfügbar ist. MySQL unterstützt die Benutzer mit<br />
e<strong>in</strong>er leistungsstarken Mehrbenutzer-SQL-Datenbanklösung, welche mehrere Arbeitsschritte<br />
gleichzeitig verarbeiten kann und schnell, robust und e<strong>in</strong>fach im Gebrauch ist. SQL steht für<br />
“Structured Query Language”. Nachteile äussern sich <strong>in</strong> <strong>der</strong> fehlenden Möglichkeit, Sichten<br />
und geschachtelte Anfragen zu generieren [Mysqlc].<br />
2.1.3. PHP<br />
Die PHP-Präprozessor-Eng<strong>in</strong>e stellt e<strong>in</strong>e robuste <strong>in</strong> HTML e<strong>in</strong>gebundene Skript-Sprache zur<br />
Verfügung. Die Syntax ist angelehnt an C, PERL und Java, enthält aber e<strong>in</strong>ige e<strong>in</strong>zigartige<br />
PHP-spezifische Merkmale. PHP gestattet schnell funktionsreiche dynamische Websites zu<br />
erzeugen. PHP stellt e<strong>in</strong>e exzellente Schnittstelle zu Onl<strong>in</strong>e-Datenbanken bereit, wobei es<br />
e<strong>in</strong>e große Anzahl von Datenbank-Systemen (u.a. MySQL) unterstützt. Um für den PHP-<br />
Prozessor zu kennzeichnen, welche Teile <strong>der</strong> Seite er verarbeiten soll, muss <strong>der</strong> Code von<br />
e<strong>in</strong>em öffnenden und e<strong>in</strong>em schliessenden Tag umgeben werden. Das öffnende Tag ist<br />
“”. In e<strong>in</strong>er HTML-Seite können beliebig viele solcher PHP-<br />
Blöcke enthalten se<strong>in</strong>.<br />
PHP-Code besteht aus e<strong>in</strong>er Folge von Anweisungen. E<strong>in</strong>zelne Anweisungen müssen<br />
vone<strong>in</strong>an<strong>der</strong> getrennt werden. In PHP wird dazu das Semikolon (;) verwendet.<br />
PHP verwendet untypisierte Variablen, d.h. es muss nicht festgelegt werden, ob Zahlen, Texte<br />
o<strong>der</strong> sonstige Werte <strong>in</strong> e<strong>in</strong>er Variablen gespeichert werden sollen. PHP paßt den Typ<br />
automatisch an die Verwendung an. So kann zum Beispiel mit e<strong>in</strong>em Str<strong>in</strong>g, <strong>der</strong> nur e<strong>in</strong>e Zahl<br />
enthält, und e<strong>in</strong>er Zahl ganz normal gerechnet werden. Variablen beg<strong>in</strong>nen <strong>in</strong> PHP mit e<strong>in</strong>em<br />
Dollarzeichen, gefolgt von dem Variablenbezeichner (z.B. $name).<br />
10
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
Um Text an den Browser auszugeben bzw. <strong>in</strong> die ausgegebene HTML-Seite e<strong>in</strong>zufügen,<br />
bietet PHP das Kommando “echo” an, das Text nicht auf den Bildschirm, son<strong>der</strong>n an den<br />
Browser schickt. So kann HTML-Code erzeugt werden, <strong>der</strong> dann vom Browser verarbeitet<br />
wird.<br />
echo "";<br />
echo "Dies erzeugt e<strong>in</strong>e Tabelle";<br />
echo "";<br />
Bsp.: Echo-Ausgabe<br />
In PHP dürfen <strong>in</strong> e<strong>in</strong>em auszugebenen Str<strong>in</strong>g ke<strong>in</strong>e Anführungszeichen (") verwendet werden.<br />
Sollen sie trotzdem verwendet werden, muss ihnen e<strong>in</strong> Backslash (\) vorangestellt werden.<br />
Innerhalb e<strong>in</strong>es auszugebenden Textes können Variablen verwendet werden, die dann von<br />
PHP durch die aktuellen Werten ersetzt werden.<br />
$a = 1; $b = 2;<br />
$summe = $a + $b;<br />
echo "Die Summe aus $a und $b ist $summe";<br />
Bsp.: PHP-Variablen<br />
Variablen ausserhalb von PHP / Verwendung von HTML-Formularen<br />
Sobald e<strong>in</strong>e HTML-Formular an e<strong>in</strong> PHP-Skript übergeben wird, s<strong>in</strong>d die <strong>in</strong> die<br />
E<strong>in</strong>gabefel<strong>der</strong> des Formulars gemachten E<strong>in</strong>träge für das PHP-Skript als Variablen verfügbar.<br />
Diese werden bei Abschicken des Formulars automatisch <strong>in</strong> die PHP-eigenen globalen<br />
Variablen $_POST o<strong>der</strong> $_GET geschrieben, je nachdem, welche Methode im -Tag<br />
von HTML angegeben wurde. Das Attribut „Action“ gibt das aufzurufende PHP-Skript an.<br />
<br />
Name: <br />
<br />
<br />
Bsp.: Formular<br />
Wird das Formular abgeschickt, steht <strong>der</strong> Wert des Textfeldes <strong>in</strong> <strong>der</strong> Variable<br />
$_POST[`username`] zur Verfügung.<br />
Weitere Informationen zu PHP s<strong>in</strong>d unter [Phpnet] und zu f<strong>in</strong>den.<br />
2.1.4. XML/XSL/HTML/Javascript<br />
Die eXtensible Markup Language (XML) stellt e<strong>in</strong>en vom World Wide Web Consortium<br />
(W3C) verwalteten Standard zur Darstellung strukturierter Daten dar. Das Format ist<br />
gleichermassen von Mensch und Masch<strong>in</strong>e lesbar und ähnelt stark HTML.<br />
XML erlaubt es, eigene Dokumenten-Markups (Tags) zu def<strong>in</strong>ieren und damit e<strong>in</strong> Dokument<br />
zu formatieren.<br />
Für die Darstellung von XML-Dokumenten s<strong>in</strong>d Stylesheets nötig. Dazu existiert e<strong>in</strong>e<br />
Stylesheet-Spezifikation namens Extensible Stylesheet Language (XSL). Die Benutzung von<br />
XSL garantiert e<strong>in</strong>e auf allen Plattformen gleich ersche<strong>in</strong>ende Formatierung [Ecks00].<br />
Es gibt i.a. drei Dateien, die von e<strong>in</strong>er XML-konformen Anwendung bearbeitet werden, um<br />
XML-Inhalt darzustellen:<br />
11
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
XML-Dokument<br />
Diese Datei enthält die Dokumentdaten, üblicherweise gekennzeichnet durch aussagekräftige<br />
XML-Elemente, welche zusätzliche Attribute enthalten können.<br />
<br />
<br />
<br />
<br />
Hallo XML!<br />
<br />
Bsp.: XML-Datei [Xmlgur]<br />
XSL-Stylesheet<br />
E<strong>in</strong> Stylesheet diktiertdie Formatierung <strong>der</strong> Dokumenten-Elemente bei ihrer Darstellung. Auf<br />
das gleiche Dokument können verschiedene Stylesheets Anwendung f<strong>in</strong>den und somit dessen<br />
Ersche<strong>in</strong>ungsbild verän<strong>der</strong>n, ohne die zugrunde liegenden Daten zu bee<strong>in</strong>flussen [Ecks00].<br />
Diese Trennung von Inhalt und Formatierung ist e<strong>in</strong> wesentliches Merkmal von XML.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Bsp.: XSL-Datei [Xmlgur]<br />
Dokumenttypdef<strong>in</strong>ition (DTD)<br />
Die DTD bestimmt die Regeln, wie die XML-Elemente, Attribute und an<strong>der</strong>e Daten def<strong>in</strong>iert<br />
und mit e<strong>in</strong>em logischen Bezug zue<strong>in</strong>an<strong>der</strong> <strong>in</strong> e<strong>in</strong>em XML-Dokument dargestellt werden<br />
können. [Ecks00]<br />
<br />
<br />
<br />
Bsp.: DTD-Datei [Xmlgur]<br />
Um e<strong>in</strong> XML-Dokument schliesslich darstellen zu können, bedarf es e<strong>in</strong>er XSL-Transformation<br />
(XSLT). XSLT ist e<strong>in</strong>e Methode, XML-Dokumente so <strong>in</strong> e<strong>in</strong> entsprechendes<br />
Ausgabeformat umzuwandeln, dass sie von <strong>der</strong> jeweiligen Anwendung (Webbrowser, PDF-<br />
Rea<strong>der</strong> etc.) angezeigt werden können.<br />
Weiterführende Informationen zu XML/XSL/DTD unter [Shep02].<br />
Auf die Technologie von HTML und soll hier nicht weiter e<strong>in</strong>gegangen werden.<br />
Bzgl. Javascript soll nur erwähnt werden, dass dies e<strong>in</strong>e Client-basierte Skriptsprache ist.<br />
Somit wird Javascript-Code vom Client und nicht vom Server ausgeführt.<br />
Da die folgende Arbeit nur e<strong>in</strong>ige Zeilen an Javascript-Code be<strong>in</strong>haltet, kann auf weitere<br />
Erklärungen zu dieser Technologie verzichtet werden.<br />
12
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2.1.5. PhpMyAdm<strong>in</strong><br />
PhpMyAdm<strong>in</strong> ist e<strong>in</strong>e <strong>in</strong> PHP geschriebene Verwaltungsoberfläche für MySQL, die<br />
Manipulation <strong>der</strong> Datenbankstruktur und <strong>der</strong> dar<strong>in</strong> gespeicherten Daten ermöglicht [Phpmya].<br />
13
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2.2. E<strong>in</strong>führung <strong>in</strong> das konzeptuelle Datenbankschema<br />
Im Folgenden wird auf Grundlagen e<strong>in</strong>er relationalen Datenbank e<strong>in</strong>gegangen. Das konkrete<br />
Datenbankschema wird <strong>in</strong> Kapitel 4 beschrieben.<br />
Nachdem die Beschreibung des Anwendungsbeispiels aus <strong>der</strong> Ausgangslage bekannt ist, folgt<br />
im nächsten Schritt die Entwicklung des konzeptuellen Entwurfs. Ziel des konzeptuellen<br />
Entwurfs ist die Beschreibung <strong>der</strong> M<strong>in</strong>iwelt mit abstrakten und wohldef<strong>in</strong>ierten Konzepten.<br />
Er verwendet die Mittel des konzeptuellen Datenmodells und resultiert im konzeptuellen<br />
Schema.<br />
Das Entity-Relationship-Model (Gegenstand-Beziehungsmodell) gehört zu den wichtigsten<br />
Modellen, mit denen dieses Schema grafisch dargestellt werden kann. E<strong>in</strong>em ER-Model kann<br />
man Zusammenhänge zwischen den Datensätzen und die Aufteilung <strong>der</strong> Daten <strong>in</strong> unabhängige<br />
Tabellen entnehmen.<br />
Die Konzepte des ER-Model sollen nun vorgestellt werden (nach [Ditt99]).<br />
2.2.1. Konzepte<br />
E<strong>in</strong> Gegenstand ist e<strong>in</strong> <strong>in</strong>dividuell identifizierbares Exemplar von D<strong>in</strong>gen, Personen o<strong>der</strong><br />
Begriffen <strong>der</strong> realen o<strong>der</strong> <strong>der</strong> Vorstellungswelt.<br />
E<strong>in</strong>e Eigenschaft wird Gegenständen zugeordnet und ermöglicht damit <strong>der</strong>en<br />
Charakterisierung, Klassifizierung und unter Umständen e<strong>in</strong>e e<strong>in</strong>deutige Identifizierung. E<strong>in</strong>e<br />
Eigenschaft hat e<strong>in</strong>en Namen und e<strong>in</strong>en (allenfalss mehrere) Eigenschaftswert(e). Die<br />
zusätzliche Glie<strong>der</strong>ung <strong>der</strong> Eigenschaften mit Hilfe <strong>der</strong> folgenden Klassifizierungseigenschaften<br />
hilft, die Struktur und den Zusammenhang <strong>der</strong> darzustellenden Informationen<br />
zu erfassen.<br />
a) e<strong>in</strong>fache (atomare) – zusammengesetzte Eigenschaften<br />
b) e<strong>in</strong>wertige – mehrwertige Eigenschaften<br />
c) eigenständige – abgeleitete Eigenschaften<br />
E<strong>in</strong> Gegenstandstyp beschreibt die geme<strong>in</strong>same Struktur, die <strong>in</strong>dividuelle Gegenstände e<strong>in</strong>er<br />
Gruppe strukturell ähnlicher Gegenstände haben müssen. Die Gegenstandsmenge e<strong>in</strong>es<br />
bestimmten Gegenstandtyps ist die aktuelle Menge von <strong>in</strong>dividuellen Gegenständen, <strong>der</strong>en<br />
Struktur durch den Gegenstandstyp beschrieben ist.<br />
Gegenstandstyp<br />
Primärschlüssel: Datentyp<br />
Attribut: Datentyp=Vore<strong>in</strong>gestellter Wert<br />
Mehrwertiges Attribut:<br />
*E<strong>in</strong>trag fakultativ („Null“-Wert<br />
erlaubt)<br />
Abb. 1: ER-Gegenstandstyp (nach [Ditt99])<br />
14
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
Die Wertmenge e<strong>in</strong>er e<strong>in</strong>fachen Eigenschaft e<strong>in</strong>es bestimmten Gegenstandstyps enthält die<br />
Werte, die <strong>der</strong> betreffenden Eigenschaft zugewiesen werden können.<br />
E<strong>in</strong> Gegenstandsschlüssel ist e<strong>in</strong>e Eigenschaft o<strong>der</strong> e<strong>in</strong>e Komb<strong>in</strong>ation von Eigenschaften, mit<br />
<strong>der</strong>en Wert(en) die <strong>in</strong> e<strong>in</strong>er Gegenstandsmenge enthaltenen Gegenstände e<strong>in</strong>deutig<br />
identifiziert werden können (Grafik: siehe Gegenstandstyp).<br />
E<strong>in</strong>e Beziehung assoziiert zwei (o<strong>der</strong> mehr) Gegenstände e<strong>in</strong>es bestimmten Typs. E<strong>in</strong><br />
Beziehungstyp beschreibt die Typen <strong>der</strong> teilnehmenden Gegenstände. Die Beziehungsmenge<br />
e<strong>in</strong>es bestimmten Beziehungstyps ist die aktuelle Menge von <strong>in</strong>dividuellen Beziehungen,<br />
<strong>der</strong>en Struktur durch den Beziehungstyp beschrieben ist.<br />
Es gibt Strukturbeschränkungen auf e<strong>in</strong>en Beziehungstyp, welche durch e<strong>in</strong> Paar von ganzen<br />
Zahlen (n für beliebig gross) <strong>in</strong> Form von (m<strong>in</strong>,max) dargestellt werden:<br />
a) E<strong>in</strong>e Kard<strong>in</strong>alitätsbeschränkung für e<strong>in</strong>en an e<strong>in</strong>em bestimmten Beziehungstyp B<br />
beteiligten Gegenstandstyp G spezifiziert die Anzahl <strong>der</strong> Beziehungen des Typs B,<br />
an denen e<strong>in</strong> Gegenstand des Typs G maximal teilnehmen kann<br />
b) E<strong>in</strong>e Partizipationsbeschränkung für e<strong>in</strong>en an e<strong>in</strong>em bestimmten Beziehungstyp B<br />
beteiligten Gegenstandstyp G spezifiziert, ob die Existenz e<strong>in</strong>es Gegenstands des<br />
Typs G davon abhängt, dass er an e<strong>in</strong>er Beziehung des Typs B beteiligt ist<br />
Gegenstandstyp B<br />
Primärschlüssel:<br />
Datentyp<br />
(1,1)<br />
Beziehungstyp<br />
Attribut:<br />
Datentyp=Vore<strong>in</strong>gestellter<br />
Wert<br />
Abb. 2: ER-Beziehungstyp mit Strukturbeschränkungen (nach [Ditt99])<br />
15<br />
(0,n)<br />
Gegenstandstyp G<br />
Primärschlüssel: Datentyp
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2.3. Begriffsabgrenzung<br />
Aufgrund <strong>der</strong> vielfältigen Verwendung des Begriffs „Management-System“ soll <strong>der</strong> Begriff<br />
des Content Management Systems von den übrigen abgegrenzt werden.<br />
Document Management System<br />
In Unternehmen entstehen verschiedenste Dokumente, die Informationen erfassen o<strong>der</strong><br />
bestimmte Vorgänge dokumentieren. Systeme für das Dokumentenmanagement helfen bei <strong>der</strong><br />
Verwaltung und dem kontrollierten Zugriff. Wesentliche Features s<strong>in</strong>d dabei Erfassung,<br />
Versionierung und Archivierung. Die mit diesen Systemen erfassten Dokumente s<strong>in</strong>d meist<br />
nur über Volltextsuche recherchierbar, da sie <strong>in</strong> unstrukturierter Form vorliegen.<br />
Dokumentenmanagement hat zum Ziel, grosse Datenbestände an Informationen <strong>in</strong> vielen<br />
verschiedenen Formaten zugänglich zu machen [ZsTr02].<br />
Knowledge Management System<br />
Knowledgemanagement versucht, aus e<strong>in</strong>mal erfassten Informationen Wissen zu generieren.<br />
Software für Knowledgemanagement-Systeme spezialisiert sich somit auf Teilbereiche wie<br />
das <strong>in</strong>telligente Auff<strong>in</strong>den von Informationen, den gruppenbasierten Wissensaustausch und<br />
Ähnliches [ZsTr02].<br />
Learn<strong>in</strong>g Content Management System (LCMS)<br />
Die Idee e<strong>in</strong>es LCMS ist das Wie<strong>der</strong>verwenden des Inhalts e<strong>in</strong>es E-learn<strong>in</strong>g-Systems.<br />
E<strong>in</strong> LCMS ist e<strong>in</strong>e Mehrbenutzerumgebung, welche es den Entwicklern des Lernstoffes<br />
ermöglicht, den digitalen Lernstoff zu kreieren, <strong>in</strong> e<strong>in</strong>er zentralen Objektdatenbank zu<br />
speichern, wie<strong>der</strong>zuverwenden, zu managen und den Lernenden zur Verfügung zu stellen.<br />
Dabei wird <strong>der</strong> Lernstoff <strong>in</strong>dividuell zusammengestellt und aufbereitet. So ist es möglich, e<strong>in</strong><br />
Lernpaket zur Verfügung zu stellen, welches genau auf den jeweiligen Lernenden<br />
zugeschnitten ist [Intime],[Idccom].<br />
Web Content Management System (WCMS)<br />
Anstatt <strong>der</strong> vollständigen Bezeichnung „Web Content Management System“ wird häufig nur<br />
<strong>der</strong> Begriff „Content Management System (CMS)“ gebraucht. Wenn also von e<strong>in</strong>em CMS<br />
die Rede ist, ist normalerweise e<strong>in</strong> WCMS geme<strong>in</strong>t.<br />
Der Begriff CMS beschreibt jedoch nicht die Funktionalität, die e<strong>in</strong> WCMS bietet, son<strong>der</strong>n<br />
bildet vielmehr e<strong>in</strong>e Überkategorie zu verschiedenen Weiterentwicklungen des Document<br />
Management System. Die zentrale Rolle beim Content Management spielt die Aufteilung von<br />
Dokumenten <strong>in</strong> e<strong>in</strong>zelne Inhaltsobjekte. Hier<strong>in</strong> liegt auch <strong>der</strong> wesentliche Unterschied zum<br />
Document Management System. Im Folgenden wird <strong>der</strong> Begriff „Content Management<br />
System (CMS)“ für „Web Content Management System“ verwendet.<br />
Der Content setzt sich aus den digitalen Assets (e<strong>in</strong>zelne Bestandteile e<strong>in</strong>er Webseite wie<br />
Texte, Bil<strong>der</strong>, etc.) zusammen. Deshalb wird e<strong>in</strong> CMS auch als Asset Management System<br />
bezeichnet [KrKo02].<br />
16
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2.4. E<strong>in</strong>führung Content Management System<br />
2.4.1. Herkömmliches Webpublish<strong>in</strong>g vs. Content Management<br />
Die Informationsflut grosser Websites ist immer schwieriger zu handhaben. Der<br />
Arbeitsaufwand und die Kosten für Erstellung und Pflege von Inhalten durch Programmierer<br />
und Redakteure führen zu immer grösseren Problemen. Veraltete Informationen, „tote“ L<strong>in</strong>ks<br />
und unauff<strong>in</strong>dbare Dokumente s<strong>in</strong>d die Folge.<br />
Die E<strong>in</strong>führung e<strong>in</strong>es Content Management System zur Strukturierung und Verwaltung <strong>der</strong><br />
Informationsseiten ist e<strong>in</strong>e mögliche Lösung. Das CMS soll die Handlungen <strong>der</strong> Anwen<strong>der</strong><br />
koord<strong>in</strong>ieren und die Veröffentlichung <strong>der</strong> Dokumente automatisieren, so dass konsistente<br />
und stets aktuelle Onl<strong>in</strong>e-Informationen im Internet angeboten werden. Das CMS unterstützt<br />
die Erstellung, Steuerung und Organisation <strong>der</strong> Inhalte.<br />
Je umfangreicher sich <strong>der</strong> Inhalt e<strong>in</strong>er Website entwickelt, desto aufwendiger ist die<br />
herkömmliche Pflege über HTML-Editoren (siehe Abb. 3). E<strong>in</strong> Content Management System<br />
verarbeitet die Inhalte wesentlich schneller und flexibler. Die Time-to-Web lässt sich so um<br />
e<strong>in</strong> Vielfaches verkürzen.<br />
Abb. 3: Manuelle Adm<strong>in</strong>istration vs. Content Management System [P<strong>in</strong>uts]<br />
Content Management (CM) erlaubt die schnelle Pflege von Web<strong>in</strong>halten ohne<br />
Programmierkenntnisse. Bei CM wird nicht auf die Programmierung verzichtet, son<strong>der</strong>n je<strong>der</strong><br />
Mitarbeiter kann sich an e<strong>in</strong>er Website wie<strong>der</strong> auf se<strong>in</strong>e Kernkompetenzen konzentrieren. Die<br />
Programmierer müssen ke<strong>in</strong>e Inhalte mehr pflegen, son<strong>der</strong>n kümmern sich um das<br />
Technische. Der Redakteur braucht ke<strong>in</strong>e HTML-Seiten zu erstellen, um Inhalte zu<br />
veröffentlichen.<br />
2.4.2. Kernpr<strong>in</strong>zip von Content Management Systemen<br />
Das Kernpr<strong>in</strong>zip von Content Management Systemen ist die Trennung von Layout und Inhalt.<br />
Die Speicherung <strong>der</strong> Inhalte erfolgt unabhängig von Ausgabeformat und Design. Vorlagen<br />
(Templates) def<strong>in</strong>ieren die Anordnung und Darstellung <strong>der</strong> Inhaltselemente. Durch das<br />
17
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
Content Management System werden bei <strong>der</strong> Generierung e<strong>in</strong>er Website die Vorlagen<br />
automatisch mit den Inhalten gefüllt.<br />
Durch die Verwendung von Templates ist die konsequente E<strong>in</strong>haltung des Layouts garantiert.<br />
Än<strong>der</strong>ungen am Layout erfor<strong>der</strong>n lediglich die Anpassung weniger Templates, die Inhalte<br />
bleiben unverän<strong>der</strong>t. Content Management Systeme entkoppeln damit die Inhaltserstellung<br />
und Website-Programmierung.<br />
Abb. 4: Verwendung von Templates [P<strong>in</strong>uts]<br />
Das Kernpr<strong>in</strong>zip spricht für e<strong>in</strong>en E<strong>in</strong>satz von XML/XSL bei <strong>der</strong> Entwicklung e<strong>in</strong>es CMS.<br />
Dabei werden <strong>der</strong> Inhalt mit XML, die Darstellung (Templates) mit XSL und die Struktur-<br />
Regeln mit DTD festgelegt.<br />
Die Umwandlung <strong>in</strong> das Ausgabeformat übernimmt <strong>der</strong> XSL-Transformator.<br />
2.4.3. Content Life Cycle<br />
Als Content Life Cycle wird <strong>der</strong> Lebenszyklus <strong>der</strong> Inhaltselemente von Websites im<br />
def<strong>in</strong>ierten Workflow (Produktionsprozess des Inhalts) verstanden. Der Content Life Cycle ist<br />
e<strong>in</strong> theoretisches Modell, das den Workflow <strong>in</strong> sechs Abschnitte e<strong>in</strong>teilt [We<strong>in</strong>00]:<br />
1. Recherchieren <strong>der</strong> Informationen<br />
2. Erstellen <strong>der</strong> e<strong>in</strong>zelnen Inhalte<br />
3. Kontrollieren<br />
4. Freigeben<br />
5. Publizieren<br />
6. Archivieren<br />
Recherchieren<br />
Recherchieren bedeutet das Sammeln von Informationen, welche dann <strong>in</strong> <strong>der</strong><br />
Erstellungsphase umgesetzt werden.<br />
18
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
Erstellung<br />
Der Autor bedient sich <strong>der</strong> gesammelten Informationen aus <strong>der</strong> Phase des Recherchierens und<br />
setzt diese um. Bei <strong>der</strong> Erstellung bedient er sich <strong>der</strong> Werkzeuge, die dem zu erstellenden<br />
Bestandteil entsprechen (z.B. Word wird für e<strong>in</strong>en Text verwendet).<br />
Kontrolle<br />
Autoren s<strong>in</strong>d meist das erste Glied <strong>in</strong> e<strong>in</strong>er Kette von Verantwortlichkeiten. Sie erstellen auf<br />
Anordnung Inhalte und müssen diese zur Kontrolle und Freigabe e<strong>in</strong>er höheren Instanz<br />
vorlegen. Dieser <strong>der</strong> Erstellung des Inhalts nachfolgende zweite Abschnitt des Content Life<br />
Cycle ist e<strong>in</strong>e wichtige Stufe für die Qualität <strong>der</strong> Inhalte auf e<strong>in</strong>er Website.<br />
Freigabe und Wie<strong>der</strong>vorlage<br />
Hat <strong>in</strong> <strong>der</strong> Phase <strong>der</strong> Kontrolle e<strong>in</strong> entsprechend autorisierter Mitarbeiter die Inhalte geprüft,<br />
kann er diese nun freigeben und damit die nächste Phase des Zyklus e<strong>in</strong>leiten. Unkorrekte<br />
Inhalte werden zur Überarbeitung an den Autor zurückgegeben (Wie<strong>der</strong>vorlage) und f<strong>in</strong>den<br />
sich zur weiteren Bearbeitung im Abschnitt <strong>der</strong> Erstellung wie<strong>der</strong>.<br />
Publikation<br />
Nach erfolgreicher Freigabe kann <strong>der</strong> Text veröffentlicht werden. Entsprechend autorisierte<br />
Mitarbeiter können Inhalte nach Kontrolle und Freigabe im Web publizieren lassen. In <strong>der</strong><br />
Praxis bedeutet dies, dass e<strong>in</strong> neuer o<strong>der</strong> bearbeiteter Inhalt im Intra-, Extra- o<strong>der</strong> Internet<br />
veröffentlicht und damit <strong>der</strong> entsprechenden Öffentlichkeit zugänglich gemacht wird.<br />
Archivierung<br />
Nachdem <strong>der</strong> Inhalt nach e<strong>in</strong>iger Zeit se<strong>in</strong>en Zweck erfüllt hat, muss die Ausschreibung aus<br />
dem Web wie<strong>der</strong> entfernt werden. Löschen wäre die schnellste Variante, aber nicht die beste.<br />
Die Archivierung alter Inhalte ist s<strong>in</strong>nvoller, denn sie hat e<strong>in</strong>ige bedeutende Vorteile:<br />
Man kann alte Stände <strong>der</strong> Website e<strong>in</strong>sehen o<strong>der</strong> wie<strong>der</strong>herstellen o<strong>der</strong> auf Basis alter<br />
Beiträge neue <strong>der</strong> gleichen Art erstellen, <strong>in</strong>dem man die alten als Vorlage benutzt.<br />
Abb. 5: Content-Lifecycle [We<strong>in</strong>00]<br />
19
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2.4.4. Anfor<strong>der</strong>ungen an e<strong>in</strong> Content Management System<br />
Im Folgenden s<strong>in</strong>d die wichtigsten Funktionen, die e<strong>in</strong> CMS erfüllen sollte, aufgeführt.<br />
Anschliessend werden <strong>in</strong> e<strong>in</strong>em Ausscheidungsverfahren die von uns benötigten Funktionen<br />
festgelegt. Aufgrund von [KrKo02],[Nohr00],[P<strong>in</strong>uts],[RoRi01],[ZsTr02] kann eruiert<br />
werden, dass für e<strong>in</strong> CMS folgende Eigenschaften und Funktionalitäten „state of the art“ s<strong>in</strong>d:<br />
Trennung von Inhalt und Layout<br />
Diese Trennung ist auf verschiedener Ebene möglich: Absatz-, Seitenebene o<strong>der</strong> nur <strong>in</strong>nerhalb<br />
<strong>der</strong> Menüsteuerung. Je nach Grad <strong>der</strong> Trennung wird <strong>der</strong> Produzent mehr o<strong>der</strong> weniger<br />
stark <strong>in</strong> se<strong>in</strong>en gestalterischen Freiheiten e<strong>in</strong>geschränkt.<br />
Lebenszyklus-Management von Dokumenten<br />
Der Dokumentenlebenszyklus be<strong>in</strong>haltet die Erstellung, Updates und die Archivierung von<br />
Dokumenten (siehe 2.3.3. Content Life Cycle).<br />
Dieser Lebenszyklus besteht aus folgenden sechs Phasen:<br />
1. Recherchieren <strong>der</strong> Informationen<br />
2. Erstellen <strong>der</strong> Inhalte (Texte, Bil<strong>der</strong>, Videos etc.)<br />
3. Kontrollieren<br />
4. Freigeben<br />
5. Publizieren (HTML, XML, PDF etc.)<br />
6. Archivieren<br />
Jedes Dokument muss mit dem Erstellungsdatum, dem Publikationsdatum und <strong>der</strong> Dauer <strong>der</strong><br />
Publikationsperiode versehen se<strong>in</strong>. Zusätzlich ist e<strong>in</strong>e Angabe <strong>der</strong> Methode nötig, wie das<br />
Dokument entfernt werden soll (manuell o<strong>der</strong> automatisch). Eventuell sollte e<strong>in</strong> Agent den<br />
Betreiber e<strong>in</strong>er Site warnen, sobald sich dieser Zeitpunkt nähert. Das Dokument kann dann<br />
weiterh<strong>in</strong> im Netz publiziert bleiben o<strong>der</strong> manuell bzw. automatisch entfernt werden.<br />
Genehmigungsprozess<br />
Sobald e<strong>in</strong> Genehmigungsprozess def<strong>in</strong>iert ist, muss <strong>der</strong> betroffene Inhalt durch diesen<br />
Prozess geleitet werden. Dieser Prozess <strong>in</strong>formiert die Autoren, falls das Dokument überarbeitet<br />
werden muss. Nach Genehmigung aller Stellen erfolgt automatisch die Publikation.<br />
Verän<strong>der</strong>ungen an publizierten Dokumenten dürfen nur an Kopien vorgenommen werden.<br />
Diese s<strong>in</strong>d erst nach erneuter Prüfung und Genehmigung durch die entsprechenden Gremien<br />
für die Publikation freigegeben. Je<strong>der</strong> vordef<strong>in</strong>ierte Abschnitt e<strong>in</strong>es Dokuments hat se<strong>in</strong>en<br />
eigenen Genehmigungsprozess. So können e<strong>in</strong>em Abschnitt genau diejenigen Personen<br />
zugeteilt werden, welche das nötige Wissen, die Verantwortung und die Kompetenzen<br />
besitzen.<br />
Rollenkonzepte (Verwaltung von Benutzungs- und Zugriffsrechten)<br />
Die Vergabe von Zugriffsrechten kann auf verschiedenen Ebenen erfolgen: z.B. auf <strong>der</strong><br />
Absatz-, Seiten- o<strong>der</strong> Objektebene.<br />
20
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
In <strong>der</strong> Regel s<strong>in</strong>d hierarchisch abgestufte Rechte s<strong>in</strong>nvoll:<br />
Das volle Zugriffsrecht benötigt nur die mit <strong>der</strong> Gesamtkoord<strong>in</strong>ation beauftragte Stelle.<br />
Weitere Zugriffsrechte sollten abgestuft je nach def<strong>in</strong>ierter Kompetenz <strong>der</strong> Akteure vergeben<br />
werden.<br />
Die Vergabe von Zugriffsrechen auf die Menüstruktur kann s<strong>in</strong>nvoll se<strong>in</strong>. Manche Systeme<br />
zeigen stets das vollständige Menüverzeichnis an und fragen beim Aufruf e<strong>in</strong>es geschützten<br />
Menüpunkts die Authentifizierung ab. Die Menüstruktur kann – bei Anzeige aller Menüpunkte<br />
– schnell zu Unübersichtlichkeit führen. Daher ist es s<strong>in</strong>nvoll, die Menüstruktur<br />
dynamisch zu generieren, so dass dem Benutzer nur diejenigen Menüpunkte zur Verfügung<br />
stehen, zu welchen er auch Zutritt hat.<br />
Editor<br />
Um die Akzeptanz <strong>der</strong> Benutzer zu erhöhen, sollte <strong>der</strong> Editor möglichst e<strong>in</strong>fach gehalten<br />
werden. Für e<strong>in</strong>e dezentrale Erstellung des Content ist e<strong>in</strong> Editor mit WYSIWYG-ähnlichen<br />
Eigenschaften (What You See Is What You Get) von Vorteil. Die Benutzung von Templates<br />
soll e<strong>in</strong> e<strong>in</strong>heitliches Layout gewährleistet werden („Corporate Idetity“). Ausserdem ist so das<br />
H<strong>in</strong>zufügen und Editieren von Inhalt ohne Kenntnisse von HTML o<strong>der</strong> XML möglich.<br />
Meta<strong>in</strong>formationen (Informationen über Informationen)<br />
Es ist nötig, zum eigentlichen Content Meta<strong>in</strong>formationen zu verwalten. Meta<strong>in</strong>formationen<br />
beschreiben e<strong>in</strong> Dokument nach formalen o<strong>der</strong> <strong>in</strong>haltlichen Aspekten. Zu den<br />
Meta<strong>in</strong>formationen können u.a. gehören:<br />
• Autoren<strong>in</strong>formationen<br />
• Erstellungsdatum und Än<strong>der</strong>ungsdatum<br />
• Versionsangaben<br />
• Angaben über die Lebensdauer e<strong>in</strong>es Dokumentes bzw. dessen Inhalt<br />
• Sprach<strong>in</strong>formationen<br />
• Klassifikations<strong>in</strong>formationen<br />
• Angaben über Dateiformate und –grösse<br />
Über diese Meta<strong>in</strong>formationen werden z.T. wichtige Funktionalitäten des CMS gesteuert, z.B.<br />
die Lebensdauer e<strong>in</strong>es Dokuments bzw. dessen Inhalt und damit die Revisionsterm<strong>in</strong>e.<br />
Versionsmanagement<br />
Ältere Versionen von Content sollten zur Verfügung gestellt werden. Versionsmanagement<br />
lässt e<strong>in</strong>en Rückblick auf die Entstehungs- und Verän<strong>der</strong>ungsgeschichte von Dokumenten<strong>in</strong>halten<br />
zu. Um e<strong>in</strong>em unterschiedlich hohen Än<strong>der</strong>ungsbedarf verschiedener Dokumente<br />
gerecht zu werden, sollte e<strong>in</strong> CMS e<strong>in</strong>e vom Anwen<strong>der</strong> frei zu konfigurierende Anzahl <strong>der</strong><br />
zur Verfügung stehenden historischen Versionen anbieten. Versionsmanagement ist e<strong>in</strong>e<br />
Anfor<strong>der</strong>ung an die Archivfunktion e<strong>in</strong>es CMS und damit an e<strong>in</strong> leistungsfähiges<br />
Dokumentenmanagement.<br />
21
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
L<strong>in</strong>k-Management<br />
Das System sollte über e<strong>in</strong> „<strong>in</strong>telligentes“ L<strong>in</strong>k-Management verfügen, welches das Auftreten<br />
von „toten“ L<strong>in</strong>ks <strong>in</strong>nerhalb des Systems unterb<strong>in</strong>det und automatisch korrigiert, so dass stets<br />
nur gültige L<strong>in</strong>ks im System verwaltet und publiziert werden.<br />
Beim Löschen von Inhalten, auf die noch e<strong>in</strong> o<strong>der</strong> mehrere L<strong>in</strong>ks verweisen, werden diese<br />
L<strong>in</strong>ks automatisch ebenfalls elim<strong>in</strong>iert. Da e<strong>in</strong> solcher Automatismus möglicherweise auch zu<br />
ungewollten Aktionen des Systems führen kann, sollte das System die Alternative bieten,<br />
diese Aktion vom Anwen<strong>der</strong> selbst ausführen zu lassen, nachdem er über e<strong>in</strong>e mögliche<br />
Inkonsistenz h<strong>in</strong>gewiesen wurde.<br />
Retrievalmöglichkeiten<br />
Neben e<strong>in</strong>er s<strong>in</strong>nvollen, systematisch aufgebauten Menüstruktur für die Navigation <strong>in</strong> den<br />
Dokumentbeständen ist e<strong>in</strong>e ausgereifte Retrievalfunktionalität für das schnelle Auff<strong>in</strong>den<br />
von Informationen sehr wichtig. Das System sollte neben e<strong>in</strong>er Recherche über Meta<strong>in</strong>formationen<br />
die Möglichkeit e<strong>in</strong>er Volltextsuche bieten, die idealerweise auch Treffer<br />
<strong>in</strong>nerhalb von Word-, PDF- und an<strong>der</strong>en B<strong>in</strong>ärobjekten f<strong>in</strong>det. Ausgefeilte Retrievalkomponenten<br />
bieten gewichtete Rank<strong>in</strong>g-Listen im Anschluss an e<strong>in</strong>e Suche an.<br />
Ausserdem sollte sie e<strong>in</strong>fach zu bedienen se<strong>in</strong>.<br />
Dateiformate<br />
Das System sollte möglichst viele gebräuchliche Objekttypen verwalten können (Neben<br />
HTML und XML auch Word, PDF etc.).<br />
Diskussions-Management<br />
Besuchern von <strong>der</strong> Site sollte standardmässig die Möglichkeit geboten werden, Kommentare<br />
und Kritik zu <strong>der</strong> Site zu äussern. Diese Anregungen werden an die verantwortliche Person /<br />
Gruppe gesendet.<br />
Import und Export<br />
Das System sollte die Möglichkeit bieten, bestehende Web-Auftritte samt ihren Strukturen zu<br />
übernehmen, sowie neben HTML-Seiten an<strong>der</strong>e Dokument-Formate (wie z.B. PDF) e<strong>in</strong>zub<strong>in</strong>den.<br />
E<strong>in</strong>e Exportfunktion ist nötig für die Publikation auf e<strong>in</strong>em o<strong>der</strong> mehreren Web-Servern.<br />
Darüber h<strong>in</strong>aus sollte e<strong>in</strong>e Exportfunktion Offl<strong>in</strong>e-Versionen des Web-Auftritts erzeugen<br />
können, z.B. um diese auf CD-ROM zu brennen.<br />
22
CMS für die MIO-Lernumgebung E<strong>in</strong>leitung<br />
2.5. Open-Source CMS<br />
Generell handelt es sich bei jedem Programm, dessen Quellcode im Klartext verfügbar ist, um<br />
Open-Source. Open-Source-Software wird gewöhnlich <strong>in</strong> öffentlichen Kooperationen von<br />
zahlreichen Programmierern entwickelt und ist somit an ke<strong>in</strong>e Firma kommerziell o<strong>der</strong><br />
entwicklungstechnisch gebunden. Dies sichert e<strong>in</strong>e schnelle Weiterentwicklung <strong>der</strong><br />
Komponenten, birgt jedoch die Gefahr, dass <strong>in</strong> <strong>der</strong> Entwicklung nicht nachvollziehbare neue<br />
Schwerpunkte gesetzt werden o<strong>der</strong> die Entwicklung komplett e<strong>in</strong>gestellt wird [KrKo02].<br />
Der Vorteil von Open-Source-Software liegt dar<strong>in</strong>, dass sich neue Standards und <strong>in</strong>dividuelle<br />
Anpassungen selbst <strong>in</strong>tegrieren lassen, da <strong>der</strong> Quellcode verfügbar ist.<br />
Nachteilig wirkt sich aus, dass aufgrund <strong>der</strong> Entwicklung durch mehrere Firmen ungewiss ist,<br />
ob und wann neue Funktionen implementiert werden.<br />
In Bezug auf Content Management Systeme ist e<strong>in</strong>e grosse Palette an Open-Source-Produkten<br />
vorhanden, welche sich aber <strong>in</strong> <strong>der</strong> Funktionalität stark unterscheiden. Das Angebot reicht<br />
von e<strong>in</strong>er e<strong>in</strong>fachen Dokumentenverwaltung bis zum komplexen CMS.<br />
Viele Open-Source-CMS s<strong>in</strong>d <strong>in</strong> ihrer Grundausstattung sehr spartanisch gehalten, bieten<br />
jedoch teilweise e<strong>in</strong> hohes Mass an „Customiz<strong>in</strong>g“, also an projektbezogener H<strong>in</strong>zuprogrammierung<br />
von Features.<br />
Wird <strong>der</strong> Aufwand für die zusätzliche Programmierarbeit <strong>in</strong> Kauf genommen, können solche<br />
Produkte, wie z.B. Midgard [Midgar], zu funktionsreichen CMS mit Benutzerverwaltung,<br />
Dokumentenmanagement, Trennung von Metadaten und Content, Editor, Versionsmanagement,<br />
Suchmechanismen, Unterstützung verschiedener Dateiformate und L<strong>in</strong>kmanagement<br />
erweitert werden.<br />
Die meisten dieser Produkte bieten neben <strong>der</strong> Trennung von Layout und Inhalt wenigstens<br />
e<strong>in</strong>en Editor zur Erstellung und Än<strong>der</strong>ung von Websites und gehen damit über die re<strong>in</strong>e<br />
Dokumentenverwaltung h<strong>in</strong>aus. E<strong>in</strong>ige dieser Editoren s<strong>in</strong>d WYSIWYG-fähig (What You<br />
See Is What You Get) o<strong>der</strong> lassen die Verwendung von hauseigenen Tags zu o<strong>der</strong> vere<strong>in</strong>en<br />
beides.<br />
Des weiteren s<strong>in</strong>d oft e<strong>in</strong>e Zugangsverwaltung und e<strong>in</strong> Suchmechanismus <strong>in</strong>tegriert.<br />
Ausgefeiltere Systeme wie z.B. Zope [Zoporg] be<strong>in</strong>halten ausserdem e<strong>in</strong>e Unterstützung von<br />
XML, e<strong>in</strong>e Objekt-Datenbank, die verschiedene Objekte wie z.B. Bil<strong>der</strong> für die Integration <strong>in</strong><br />
die Website bereithält, e<strong>in</strong>e Session-Verwaltung und e<strong>in</strong> Dikussionsgruppen-Portal.<br />
Lei<strong>der</strong> lassen die Qualität und <strong>der</strong> Umfang <strong>der</strong> Dokumentationen von Open-Source-CMS oft<br />
zu wünschen übrig. Vorbildlich diesbezüglich ist jedoch z.B. Typo3 [Typo3c].<br />
Zu erwähnen ist, dass die meisten dieser Systeme auf den Technologien Apache, PHP und<br />
MySQL basieren. Somit ist das ganze Paket „Open-Source“.<br />
Weitere Informationen können unter [Cmseva] und den dort bef<strong>in</strong>dlichen L<strong>in</strong>ks<br />
nachgeschlagen werden.<br />
Auf <strong>der</strong> Webseite www.contentmanager.de [Contma] wird jeweils die aktuelle Marktübersicht<br />
von Content Management Systemen publiziert.<br />
23
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3. Anfor<strong>der</strong>ungsspezifikation<br />
Aus den im letzten Kapitel eruierten Anfor<strong>der</strong>ungen an e<strong>in</strong> Content Management System<br />
sollen nun nach e<strong>in</strong>em Ausschlussverfahren die für das zu implementierende System<br />
Notwendigen bestimmt und anschliessend genauer spezifiziert werden. Für die grafische<br />
Beschreibung wird die Spezifikationssprache UML (unified modell<strong>in</strong>g language) verwendet<br />
(nach [Gl<strong>in</strong>00]).<br />
Nach e<strong>in</strong>er genauen Beschreibung <strong>der</strong> Systemanfor<strong>der</strong>ungen wird das System aus<br />
verschiedener Sichtweise betrachtet (nach [Gl<strong>in</strong>00]).<br />
Das Objektmodell beschreibt das System aus statischer Sicht. Es spezifiziert die Gegenstände<br />
<strong>der</strong> Realität, mit denen das System umgehen muss.<br />
Das Anwendungsfall-Diagramm modelliert die Benutzer-System-Interaktion aus Benutzersicht<br />
und gibt e<strong>in</strong>en Überblick über die Anwendungsfälle.<br />
In e<strong>in</strong>er Detailanalyse werden die Anwendungsfälle genauer spezifiziert und <strong>der</strong>en Ablauf aus<br />
Aktivitätssicht als Aktivitätsdiagramme dargestellt.<br />
E<strong>in</strong> Teil des Systems wird schliesslich aus Verhaltenssicht als Zustandsmodell beschrieben.<br />
Sämtliche Modelle werden mit Hilfe des Visualisierungstools VISIO 2000 erstellt.<br />
24
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.1. Systemanfor<strong>der</strong>ungen<br />
Nach Rücksprache mit Vertretern des Schwerpunkts MIO steht fest, dass die zu<br />
implementierende Applikation folgende Funktionen zur Verfügung stellen muss:<br />
• Trennung von Inhalt und Layout<br />
• Lebenszyklus-Management <strong>in</strong>kl. Bestätigung <strong>der</strong> Kontrollphase<br />
• Meta<strong>in</strong>formationen verwalten<br />
• Rollenkonzepte<br />
• Editor für Lehrtexte<br />
• Versionsmanagement<br />
Trennung von Inhalt und Layout<br />
Die Kernanfor<strong>der</strong>ung des CMS ist die Trennung des Inhalts von Gestaltung und<br />
Funktionalität. Optimalerweise s<strong>in</strong>d auch Gestaltung und Funktionalität autonom. Somit<br />
können die drei Bestandteile unabhängig vone<strong>in</strong>an<strong>der</strong> geän<strong>der</strong>t werden, ohne e<strong>in</strong>en an<strong>der</strong>en<br />
Teil verän<strong>der</strong>n zu müssen.<br />
E<strong>in</strong>e durch das CMS ausgelieferte Seite wird aus Templates und Inhalten zusammengesetzt.<br />
E<strong>in</strong>e Implementation mit XML (Inhalt), XSL (Gestaltung) und PHP (Funktionalität) wird <strong>der</strong><br />
Kernanfor<strong>der</strong>ung <strong>der</strong> Trennung des Inhalts von Gestaltung und Funktionalität gerecht.<br />
Das Ersche<strong>in</strong>ungsbild e<strong>in</strong>er Webseite wird durch Vorlagen, sog. Templates bestimmt. Solche<br />
Vorlagen s<strong>in</strong>d normalerweise starr vorgegeben und <strong>der</strong> Autor kann nur aus Bestehenden e<strong>in</strong>e<br />
ihm passende auswählen.<br />
Das zu implementierende System soll dem Autor die Möglichkeit bieten, diese Vorlagen<br />
se<strong>in</strong>en Bedürfnissen anzupassen. Vorerst wird nur e<strong>in</strong> Template im System <strong>in</strong>tegriert, was<br />
e<strong>in</strong>e spätere Ergänzung durch weitere nicht ausschliessen soll. Die Anpassung <strong>der</strong> Vorlage<br />
wird dadurch e<strong>in</strong>geschränkt, dass nur vorgegebene Fel<strong>der</strong> verwendet werden können. Wie<br />
viele Fel<strong>der</strong> und <strong>in</strong> welcher Reihenfolge diese e<strong>in</strong>gefügt werden, ist dabei dem Autor<br />
überlassen.<br />
Lebenszyklus-Management<br />
Die Recherche <strong>der</strong> Informationen geschieht ausserhalb des CMS und wird deshalb mit <strong>der</strong><br />
Erstellungsphase des Lehrtextes zusammengelegt. Nach E<strong>in</strong>gabe e<strong>in</strong>es Lehrtextes muss dieser<br />
<strong>in</strong> e<strong>in</strong>er nächsten Phase kontrolliert und anschliessend freigegeben o<strong>der</strong> abgelehnt werden.<br />
E<strong>in</strong> freigegebener Lehrtext wird automatisch vom System publiziert. E<strong>in</strong> abgelehnter Lehrtext<br />
muss nochmals überarbeitet und erneut überprüft werden. Veraltete Lehrtexte werden im<br />
Archiv abgelegt.<br />
Nach Freigabe o<strong>der</strong> Ablehnung e<strong>in</strong>es Lehrtextes muss <strong>der</strong> entsprechende Autor sofort<br />
<strong>in</strong>formiert werden. Die Benachrichtigung erfolgt per E-Mail an den Autor. Bei Ablehnung ist<br />
e<strong>in</strong>e Begründung des Entscheids anzugeben.<br />
25
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
Meta<strong>in</strong>formationen<br />
Die Meta<strong>in</strong>formationen be<strong>in</strong>halten Informationen über Titel, Autor, Thema, Version, Status,<br />
Erstellungsdatum, Klasse, Schreibberechtigungsgruppe und Prüfberechtigungsgruppe e<strong>in</strong>es<br />
Dokuments.<br />
Diese Informationen können je<strong>der</strong>zeit durch kompetente Stellen verän<strong>der</strong>t werden, mit<br />
Ausnahme von Version und Erstellungsdatum, da das Editieren <strong>der</strong> Versionsangabe zu<br />
Inkonsistenz führen könnte und das Än<strong>der</strong>n des Erstellungsdatums e<strong>in</strong>e spätere<br />
Rekonstruktion <strong>der</strong> Entstehungsgeschichte <strong>der</strong> Dokumenten<strong>in</strong>halte verh<strong>in</strong><strong>der</strong>t.<br />
Die Statusangabe gibt Auskunft darüber, <strong>in</strong> welcher Phase des Lebenszyklus sich e<strong>in</strong><br />
Dokument bef<strong>in</strong>det. Über den gesamten Lebenszeitraum hat jedes Dokument immer genau<br />
e<strong>in</strong>en Zustand, welcher durch die aktuelle Phase des Lebenszyklus bestimmt wird.<br />
Folgende Zustände s<strong>in</strong>d möglich:<br />
• Zu prüfen<br />
• Freigegeben<br />
• Nicht freigegeben<br />
• Veraltet<br />
Nach <strong>der</strong> Erstellung e<strong>in</strong>es Dokuments wird es automatisch vom System als „zu prüfen“<br />
gekennzeichnet. Nach <strong>der</strong> Kontrollphase ist es entwe<strong>der</strong> „freigegeben“ o<strong>der</strong> „nicht<br />
freigegeben“. Freigegebene Lehrtexte können angeschaut werden. Nicht freigegebene<br />
Lehrtexte können editiert werden. In <strong>der</strong> Archivierungsphase ist es überholt und als „veraltet“<br />
gekennzeichnet.<br />
Rollenkonzepte<br />
Folgen<strong>der</strong> Abschnitt bezieht sich auf [Mahl02] und [Kaeg02].<br />
Die Personenverwaltung <strong>der</strong> MIO-Umgebung ist im Moment im Umbruch. Das<br />
Rollenkonzept des CMS soll möglichst an die neue Version [Kaeg02] <strong>der</strong> Personenverwaltung<br />
angeglichen werden. Dabei wird nur auf die Teile <strong>der</strong> Personenverwaltung<br />
e<strong>in</strong>gegangen, welche das CMS betreffen.<br />
Die Benutzer des MIO-Systems s<strong>in</strong>d <strong>in</strong> folgende Gruppen e<strong>in</strong>geteilt:<br />
• Allgeme<strong>in</strong>e Interessenten<br />
Personen, die sich für MIO und Studiengänge <strong>in</strong>teressieren.<br />
• Teilnehmer e<strong>in</strong>er Klasse<br />
Dies kann e<strong>in</strong>e aktuelle o<strong>der</strong> zukünftige Klasse se<strong>in</strong>.<br />
• Referenten<br />
Die Referenten bereichern die Aktivitäten <strong>in</strong> Weiterbildung, Forschung und Beratung<br />
um wichtige Inputs aus <strong>der</strong> akademischen Welt und aus <strong>der</strong> Welt <strong>der</strong><br />
Organisationsberatung. Sie verfügen über e<strong>in</strong>en höheren akademischen Abschluss und<br />
bewegen sich im Spannungsfeld von Wissenschaft und Praxis.<br />
26
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
• Mentoren/Ehemalige Teilnehmer<br />
Mentoren s<strong>in</strong>d erfahrene Ratgeber und motivierende Helfer, die e<strong>in</strong>en <strong>in</strong>tensiven<br />
Kontakt zur MIO Praxis <strong>in</strong> Unternehmen herstellen. Konkret heisst das: Ehemalige<br />
berichten von Erfahrungen, stellen Praxisfälle im Rahmen <strong>der</strong> e<strong>in</strong>zelnen Fachtage vor,<br />
gestalten die Praxistage mit, unterstützen die Projektgruppen während <strong>der</strong> Praxisphase<br />
und fungieren als Ansprechpartner und zusätzliche Projekte<strong>in</strong>br<strong>in</strong>ger.<br />
Damit geben wir den Ehemaligen die Gelegenheit, ihre Erfahrungen aufzuarbeiten und<br />
zu reflektieren, wovon die „Neuen“ profitieren.<br />
• Personen aus dem MIO-Team<br />
Das MIO-Team begleitet die Teilnehmenden durch die Ausbildung und ist<br />
verantwortlich für das Konzept und die <strong>in</strong>haltliche und didaktische Ausgestaltung <strong>der</strong><br />
Workshops <strong>in</strong> den Tagungshotels. Es koord<strong>in</strong>iert die Referenten und Mentoren an den<br />
Studientagen.<br />
• Adm<strong>in</strong>istratoren<br />
Sie s<strong>in</strong>d für die Pflege aller Daten des Systems verantwortlich.<br />
• Studienleitung<br />
Gruppe, die pro Klasse Lehrtexte prüfen und freigeben kann<br />
Die Gruppen werden verschiedenen Klassen zugeordnet. Pro Studiengang gibt es e<strong>in</strong>e eigene<br />
Klasse, die aktiv o<strong>der</strong> passiv se<strong>in</strong> kann. Zusätzlich existiert die Pool-Klasse, welche immer<br />
aktiv ist. Der Pool-Klasse gehören die Gruppe des MIO-Teams und die <strong>der</strong> Adm<strong>in</strong>istratoren<br />
an.<br />
Die Vergabe <strong>der</strong> Benutzungsrechte erfolgt auf verschiedener Ebene:<br />
• Klassen-<br />
• Gruppen- und<br />
• Personenebene<br />
Die Lehrtexte beziehen sich grundsätzlich auf Klassen. Pro Klasse hat genau e<strong>in</strong>e Gruppe e<strong>in</strong><br />
bestimmtes Recht bzgl. <strong>der</strong> Lehrtexte.<br />
E<strong>in</strong>em Lehrtext wird somit e<strong>in</strong>e Klasse, e<strong>in</strong> Autor (Referent), e<strong>in</strong>e Editiergruppe und e<strong>in</strong>e<br />
Prüfgruppe zugewiesen. Als Standard für die zugewiesene Editier- und Prüfgruppe wird die<br />
Studienleitung <strong>der</strong> jeweiligen Klasse e<strong>in</strong>getragen.<br />
Bezüglich <strong>der</strong> CMS-Funktionen Ansicht, Erstellen, Editieren, Prüfen, Metadaten verwalten<br />
und Archivieren werden folgende Berechtigungen vergeben, wobei je<strong>der</strong> Lehrtexte sich<br />
jeweils auf e<strong>in</strong>e Klasse bezieht:<br />
Ansicht<br />
Lehrtexte anschauen dürfen:<br />
- alle Gruppen <strong>der</strong> Klasse<br />
- Adm<strong>in</strong>istratoren<br />
27
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
Erstellen<br />
Lehrtexte erstellen dürfen:<br />
- Referenten <strong>der</strong> Klass<br />
- Adm<strong>in</strong>istratoren<br />
Editieren<br />
Lehrtexte editieren dürfen:<br />
- <strong>der</strong> Autor, solange <strong>der</strong> Lehrtext von <strong>der</strong> Studienleitung nicht geprüft und freigegeben ist<br />
- Adm<strong>in</strong>istratoren<br />
Prüfen<br />
Lehrtexte prüfen dürfen:<br />
- die Studienleitung<br />
- Adm<strong>in</strong>istratoren<br />
Metadaten verwalten<br />
- die Studienleitung<br />
- Adm<strong>in</strong>istratoren<br />
Archiv anschauen<br />
- Referenten <strong>der</strong> Klasse<br />
- Adm<strong>in</strong>istratoren<br />
Editor für Lehrtexte<br />
Der Editor soll e<strong>in</strong>fach und flexibel <strong>in</strong> <strong>der</strong> Bedienung se<strong>in</strong>. Die vorhandenen Fel<strong>der</strong><br />
Haupttitel, Autor und Thema können durch Knopfdruck mit zusätzlichen Titel- und<br />
Textfel<strong>der</strong>n ergänzt werden. Der „Klar-Text“ <strong>in</strong> den Textfel<strong>der</strong>n kann mit e<strong>in</strong>fachen HTML-<br />
Befehlen formatiert und mit L<strong>in</strong>ks versehen werden. Bil<strong>der</strong> können aus e<strong>in</strong>em Bildverzeichnis<br />
<strong>in</strong> den Text e<strong>in</strong>gefügt werden.<br />
Verwendbare HTML-Tags:<br />
• Tabelle: mit den Tags , und <br />
• Listen: mit dem Tag <br />
mit dem Tag <br />
• fett: <br />
• kursiv: <br />
• unterstrichen: <br />
• Trennstrich: <br />
• Umbruch: (wie Enter-Taste)<br />
Alle verwendbaren HTML-Elemente (ausser und ) bestehen aus e<strong>in</strong>em e<strong>in</strong>leitenden<br />
und e<strong>in</strong>em abschliessenden Tag.<br />
28
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
Versionsmanagement<br />
Ältere Versionen erhalten den Status „veraltet“ und werden <strong>in</strong> e<strong>in</strong>em Archiv abgelegt. Jede<br />
neue Version erhält e<strong>in</strong>e neue Versionsnummer. Die archivierten Dokumente können je<strong>der</strong>zeit<br />
angeschaut, aber nicht mehr editiert werden.<br />
Jedoch besteht die Möglichkeit, falls die benötigten Benutzungsrechte vorhanden s<strong>in</strong>d, den<br />
Status e<strong>in</strong>es Dokuments über die Metadatenverwaltung wie<strong>der</strong> zu än<strong>der</strong>n. So kann e<strong>in</strong><br />
versehentlich <strong>in</strong>s Archiv abgelegtes Dokument wie<strong>der</strong> zur Nutzung freigegeben werden.<br />
Ebenso kann e<strong>in</strong> Dokument, welches nicht mehr aktuell ist, aber nicht als neue Version<br />
aufbereitet werden soll, über die Metadatenverwaltung als „veraltet“ gekennzeichnet und <strong>in</strong>s<br />
Archiv abgelegt werden.<br />
29
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.2. Objektmodell<br />
Das Objektmodell zeigt die statische Struktur des Systems auf. Es werden die Objekte des<br />
Systems, die Beziehungen zwischen den Objekten, sowie die Attribute und Operationen <strong>der</strong><br />
e<strong>in</strong>zelnen Klassen beschrieben.<br />
• Lehrtext<br />
Lehrtexte bilden den Content des CMS. E<strong>in</strong> Lehrtext besteht aus se<strong>in</strong>em Inhalt. Die<br />
Funktionen <strong>der</strong> Lehrtexte lassen diese anzeigen, erstellen, editieren o<strong>der</strong> prüfen.<br />
• Klasse<br />
Je<strong>der</strong> Lehrtext gehört zu e<strong>in</strong>er Klasse. E<strong>in</strong>e Klasse ist gegeben durch e<strong>in</strong>en<br />
Klassennamen und e<strong>in</strong>e Klassenbeschreibung. Sie besitzt ausserdem Angaben darüber,<br />
ob sie aktiv (d.h. Studiengang ist aktuell) und offen (d.h. Anmeldung an diesen<br />
Studiengang ist möglich) ist.<br />
• Gruppe<br />
Zu je<strong>der</strong> Klasse können mehrere Gruppen gehören. E<strong>in</strong>e Gruppe ist durch e<strong>in</strong>en<br />
Gruppennamen und e<strong>in</strong>e Gruppenbeschreibung bestimmt.<br />
• Person<br />
Alle Personen s<strong>in</strong>d Mitglie<strong>der</strong> e<strong>in</strong>er o<strong>der</strong> mehrerer Gruppen. Personen s<strong>in</strong>d durch<br />
<strong>der</strong>en Basisdaten (Name, Vorname etc.) und <strong>der</strong>en Status bestimmt. Der Status gibt<br />
an, ob e<strong>in</strong>e Person nur „allgeme<strong>in</strong> <strong>in</strong>teressiert“ o<strong>der</strong> Mitglied e<strong>in</strong>er Gruppe ist.<br />
• Metadaten<br />
Die Metadaten repräsentieren Informationen über e<strong>in</strong>en Lehrtext. Sie gehören genau<br />
zu e<strong>in</strong>em Lehrtext und be<strong>in</strong>halten Titel, e<strong>in</strong>e Person als Autor, Thema und<br />
Erstellungsdatum. Von e<strong>in</strong>em Lehrtext können verschiedene Versionen existieren.<br />
Ältere Versionen s<strong>in</strong>d als solche markiert (Status „veraltet“). Für Lese- und<br />
Schreibberechtigung s<strong>in</strong>d Gruppen angegeben.<br />
• Ansicht<br />
Ermöglicht das Anzeigen von Lehrtexten.<br />
• Erstellen<br />
Ermöglicht das Erstellen von Lehrtexten.<br />
• Editieren<br />
Ermöglicht das Editieren von Lehrtexten.<br />
• Prüfen<br />
Ermöglicht das Prüfen von Lehrtexten.<br />
• Archiv<br />
Ermöglicht das Anzeigen archivierten Lehrtexten.<br />
30
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
Abb. 6: Objektmodell<br />
31
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.3. Anwendungsfall-Diagramm<br />
Mit dem folgenden Anwendungsfall-Diagramm soll e<strong>in</strong> Überblick über die Hauptanwendungsfälle<br />
(Szenarien) und <strong>der</strong>en Akteure gegeben werden.<br />
Abb. 7: Anwendungsfall-Diagramm<br />
32
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4. Detailanalyse <strong>der</strong> Hauptanwendungsfälle<br />
Im Folgenden werden die Akteure und Anwendungsfälle aus dem Anwendungsfall-Diagramm<br />
erläutert. Die Anwendungsfälle werden textuell und <strong>der</strong>en Ablauf als Aktivitätsdiagramme<br />
beschrieben.<br />
Akteure<br />
• Autor: erstellt Lehrtext und gibt ihn <strong>in</strong>s System e<strong>in</strong>, editiert Lehrtext.<br />
• Teilnehmer: schaut Lehrtext an<br />
• Adm<strong>in</strong>istratoren/Studienleitung: editieren Lehrtext und Metadaten, prüfen Lehrtext<br />
Anwendungsfälle<br />
• Lehrtext anschauen: Anschauen <strong>der</strong> Lehrtexte, die freigegeben s<strong>in</strong>d<br />
• Lehrtext erstellen: Erstellen e<strong>in</strong>es neuen Lehrtextes<br />
• Lehrtext editieren: Editieren <strong>der</strong> Lehrtexte, die nicht archiviert wurden<br />
• Lehrtext prüfen: Prüfen <strong>der</strong> Lehrtexte, die „zu prüfen“ s<strong>in</strong>d<br />
• Metadaten verwalten: Editieren <strong>der</strong> Metadaten <strong>der</strong> Lehrtexte, die nicht archiviert<br />
wurden<br />
• Archiv: Anschauen archivierter Lehrtexte<br />
33
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4.1. Lehrtext anschauen<br />
Anwendungsfall Lehrtext anschauen<br />
Kurzbeschreibung: E<strong>in</strong> Kursteilnehmer ruft e<strong>in</strong>en Lehrtext auf um ihn anzuschauen<br />
Akteur: Kursteilnehmer<br />
System: CMS<br />
Beschreibung: Das System zeigt Hauptmenü an.<br />
Der Teilnehmer wählt Menüpunkt „Ansicht“. Darauf verifiziert das<br />
System die Rechte und zeigt diejenigen Lehrtexte <strong>in</strong> e<strong>in</strong>em<br />
Auswahlfeld an, die aktuell s<strong>in</strong>d und für welche die Berechtigung<br />
zum Anschauen vorhanden ist.<br />
Der Teilnehmer wählt gewünschten Lehrtext aus und drückt den<br />
„ok“-Knopf. Falls <strong>der</strong> gewünschte Lehrtext nicht <strong>in</strong> <strong>der</strong> Auswahl<br />
vorhanden ist (weil z.B. Berechtigung fehlt), wird mit Wählen e<strong>in</strong>es<br />
an<strong>der</strong>en Menüpunkts die Aktion abgebrochen.<br />
An<strong>der</strong>nfalls zeigt das System den ausgewählten Lehrtext an.<br />
Tab. 1: Anwendungsfall Lehrtext anschauen<br />
Abb. 8: Aktivitätsdiagramm Lehrtext anschauen<br />
34
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4.2. Lehrtext erstellen<br />
Anwendungsfall Lehrtext erstellen<br />
Kurzbeschreibung: E<strong>in</strong> Autor erfasst e<strong>in</strong>en neuen Lehrtext<br />
Akteur: Autor<br />
System: CMS<br />
Beschreibung: Das System zeigt Hauptmenü an.<br />
Der Teilnehmer wählt Menüpunkt „Erstellen“. Darauf verifiziert das<br />
System die Rechte.<br />
Bei erfolgreicher Verifikation zeigt das System das<br />
Standardformular (Template) für die Lehrtexte<strong>in</strong>gabe im Editor an.<br />
Der Autor gibt den Titel e<strong>in</strong>. Er wählt se<strong>in</strong>en Namen und das Thema<br />
des Lehrtextes aus den Auswahlfel<strong>der</strong>n aus und bestätigt jeweils<br />
se<strong>in</strong>e Wahl mit Drücken des „ok“-Knopfs.<br />
Der Autor fügt mit „Untertitel1 e<strong>in</strong>fügen“, „Untertitel2 e<strong>in</strong>fügen“<br />
und „Textarea e<strong>in</strong>fügen“ neue Fel<strong>der</strong> <strong>in</strong> das Formular e<strong>in</strong> o<strong>der</strong><br />
löscht diese wie<strong>der</strong> mit den jeweiligen „Löschen“-Knöpfen.<br />
Um den e<strong>in</strong>gegebenen Lehrtext zu speichern drückt <strong>der</strong> Autor den<br />
Knopf „Version erstellen“.<br />
Möchte <strong>der</strong> Autor die E<strong>in</strong>gaben nicht speichern, kann mir Anwählen<br />
e<strong>in</strong>es an<strong>der</strong>en Menüpunkts die Aktion abgebrochen werden.<br />
Das System zeigt den e<strong>in</strong>gegebenen Lehrtext an.<br />
Tab. 2: Anwendungsfall Lehrtext erstellen<br />
Abb. 9: Aktivitätsdiagramm Lehrtext erstellen<br />
35
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4.3. Lehrtext editieren<br />
Anwendungsfall Lehrtext editieren<br />
Kurzbeschreibung: E<strong>in</strong> Mitglied <strong>der</strong> Gruppe mit Editierrechten bearbeitet e<strong>in</strong>en<br />
vorhandenen Lehrtext<br />
Akteur: Mitglied <strong>der</strong> Gruppe mit Editierrechten<br />
System: CMS<br />
Beschreibung: Das System zeigt Hauptmenü an.<br />
Das Gruppenmitglied wählt Menüpunkt „Editieren“. Darauf<br />
verifiziert das System die Rechte.<br />
An<strong>der</strong>nfalls zeigt das System diejenigen Lehrtexte <strong>in</strong> e<strong>in</strong>em<br />
Auswahlfeld an, die aktuell s<strong>in</strong>d und für welche die Berechtigung<br />
zum Editieren vorhanden ist.<br />
Der Teilnehmer wählt gewünschten Lehrtext aus und drückt den<br />
„ok“-Knopf. Falls <strong>der</strong> gewünschte Lehrtext nicht <strong>in</strong> <strong>der</strong> Auswahl<br />
vorhanden ist (weil z.B. Berechtigung fehlt), wird mit Wählen e<strong>in</strong>es<br />
an<strong>der</strong>en Menüpunkts die Aktion abgebrochen.<br />
Das System zeigt den ausgewählten Lehrtext im Editor an.<br />
Der Autor bearbeitet den Inhalt.<br />
Der Autor fügt mit „Untertitel1 e<strong>in</strong>fügen“, „Untertitel2 e<strong>in</strong>fügen“<br />
und „Textarea e<strong>in</strong>fügen“ neue Fel<strong>der</strong> <strong>in</strong> das Formular e<strong>in</strong> o<strong>der</strong><br />
löscht diese wie<strong>der</strong> mit den jeweiligen „Löschen“-Knöpfen.<br />
Um den bearbeiteten Lehrtext zu speichern drückt <strong>der</strong> Autor den<br />
Knopf „Version erstellen“.<br />
Das System legt die alte Version des Lehrtextes im Archiv mit dem<br />
Vermerk „veraltet“ ab und zeigt die neue Version an.<br />
Tab. 3: Anwendungsfall Lehrtext editieren<br />
Abb. 10: Aktivitätsdiagramm Lehrtext editieren<br />
36
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4.4. Lehrtext prüfen<br />
Anwendungsfall Lehrtext prüfen und freigeben/ablehnen<br />
Kurzbeschreibung: E<strong>in</strong> Mitglied <strong>der</strong> Gruppe mit Prüfrechten kontrolliert e<strong>in</strong>en<br />
vorhandenen Lehrtext und gibt ihn zur Publikation frei o<strong>der</strong> lässt ihn<br />
nochmals überarbeiten<br />
Akteur: Mitglied <strong>der</strong> Gruppe mit Prüfrechten<br />
System: CMS<br />
Beschreibung: Das System zeigt Hauptmenü an.<br />
Das Gruppenmitglied wählt Menüpunkt „Prüfen“. Darauf verifiziert<br />
das System die Rechte.<br />
An<strong>der</strong>nfalls zeigt das System diejenigen Lehrtexte <strong>in</strong> e<strong>in</strong>em<br />
Auswahlfeld an, die zu prüfen s<strong>in</strong>d und für welche die Berechtigung<br />
zum Prüfen vorhanden ist.<br />
Der Teilnehmer wählt gewünschten Lehrtext aus und drückt den<br />
„ok“-Knopf. Falls <strong>der</strong> gewünschte Lehrtext nicht <strong>in</strong> <strong>der</strong> Auswahl<br />
vorhanden ist (weil z.B. Berechtigung fehlt), wird mit Wählen e<strong>in</strong>es<br />
an<strong>der</strong>en Menüpunkts die Aktion abgebrochen.<br />
Das System zeigt den gewählten Lehrtext an.<br />
Das Gruppenmitglied kontrolliert den Inhalt des Lehrtextes.<br />
Anschliessend wählt es „freigeben“ o<strong>der</strong> „ablehnen“ an und drückt<br />
den „ok“-Knopf.<br />
Das System kennzeichnet Lehrtext als freigegeben/nicht freigegeben<br />
und gibt entsprechende Meldung aus.<br />
Tab. 4: Anwendungsfall Lehrtext prüfen<br />
Abb. 11: Aktivitätsdiagramm Lehrtext prüfen<br />
37
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4.5. Metadaten verwalten<br />
Anwendungsfall Metadaten verwalten<br />
Kurzbeschreibung: E<strong>in</strong> Mitglied <strong>der</strong> klassenspezifischen Studienleitung bearbeitet die<br />
Metadaten e<strong>in</strong>es aktuellen Lehrtextes<br />
Akteur: Mitglied <strong>der</strong> klassenspezifischen Studienleitung<br />
Beschreibung: Das System zeigt Hauptmenü an.<br />
Das Gruppenmitglied wählt Menüpunkt „Metadaten verwalten“.<br />
Darauf verifiziert das System die Rechte.<br />
An<strong>der</strong>nfalls zeigt das System diejenigen Lehrtexte <strong>in</strong> e<strong>in</strong>em<br />
Auswahlfeld an, <strong>der</strong>en Metadaten zu bearbeiten s<strong>in</strong>d und für welche<br />
die Berechtigung „Bearbeiten von Metadaten“ vorhanden ist.<br />
Der Teilnehmer wählt gewünschten Lehrtext aus und drückt den<br />
„ok“-Knopf. Falls <strong>der</strong> gewünschte Lehrtext nicht <strong>in</strong> <strong>der</strong> Auswahl<br />
vorhanden ist (weil z.B. Berechtigung fehlt), wird mit Wählen e<strong>in</strong>es<br />
an<strong>der</strong>en Menüpunkts die Aktion abgebrochen.<br />
Das System zeigt die Metadaten des ausgewählten Lehrtextes <strong>in</strong><br />
e<strong>in</strong>em Bearbeitungsformular an.<br />
Das Gruppenmitglied bearbeitet den Inhalt.<br />
Um die bearbeiteten Metadaten zu speichern drückt <strong>der</strong> Autor den<br />
„ok“-Knopf.<br />
Das System gibt Meldung aus.<br />
Tab. 5: Anwendungsfall Metadaten verwalten<br />
Abb. 12: Aktivitätsdiagramm Metadaten verwalten<br />
38
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.4.6. Archiv<br />
Anwendungsfall Archiv<br />
Kurzbeschreibung: E<strong>in</strong> Kursteilnehmer ruft e<strong>in</strong>en archivierten Lehrtext auf um ihn<br />
anzuschauen.<br />
Akteur: Autor<br />
System: CMS<br />
Beschreibung: Das System zeigt Hauptmenü an.<br />
Der Teilnehmer wählt Menüpunkt „Archiv“. Darauf verifiziert das<br />
System die Rechte und zeigt diejenigen Lehrtexte <strong>in</strong> e<strong>in</strong>em<br />
Auswahlfeld an, die veraltet s<strong>in</strong>d und für welche die Berechtigung<br />
zum Anschauen vorhanden ist.<br />
Der Teilnehmer wählt gewünschten Lehrtext aus und drückt den<br />
„ok“-Knopf. Falls <strong>der</strong> gewünschte Lehrtext nicht <strong>in</strong> <strong>der</strong> Auswahl<br />
vorhanden ist (weil z.B. Berechtigung fehlt), wird mit Wählen e<strong>in</strong>es<br />
an<strong>der</strong>en Menüpunkts die Aktion abgebrochen.<br />
An<strong>der</strong>nfalls zeigt das System den ausgewählten Lehrtext an.<br />
Tab. 6: Anwendungsfall Archiv<br />
Abb. 13: Aktivitätsdiagramm Lehrtext aus Archiv anschauen<br />
39
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.5. Zustandsmodelle<br />
Mit e<strong>in</strong>em Zustandsmodell soll das dynamische zeitliche Verhalten des Lebenszyklus e<strong>in</strong>es<br />
Lehrtextes (siehe 2.3.3. Content Life Cycle) modelliert werden.<br />
Im Verlaufe se<strong>in</strong>es Bestehens kann e<strong>in</strong> Lehrtext folgende Zustände annehmen:<br />
- zu prüfen<br />
- freigegeben<br />
- nicht freigegeben<br />
- veraltet<br />
Nach Erstellen e<strong>in</strong>es Lehrtextes ist er automatisch im Zustand „zu prüfen“. Sobald er durch<br />
e<strong>in</strong>e kompetente Stelle kontrolliert wurde, geht er <strong>in</strong> den nächsten Zustand über. Dieser ist bei<br />
Freigabe des Lehrtextes „freigegeben“ o<strong>der</strong> bei Ablehnung „nicht freigegeben“.<br />
E<strong>in</strong> zu prüfen<strong>der</strong> Lehrtext kann editiert werden. Beim Speichern erhält er den Status<br />
„veraltet“ und wird archiviert. Gleichzeitig wird e<strong>in</strong>e neue Version des Lehrtextes mit den<br />
gemachten Än<strong>der</strong>ungen erstellt. Diese bef<strong>in</strong>det sich wie<strong>der</strong> im Anfangszustand „zu prüfen“.<br />
E<strong>in</strong> archivierter Lehrtext kann nicht mehr editiert, son<strong>der</strong>n nur noch im Archiv angeschaut<br />
werden. Jedoch besteht je<strong>der</strong>zeit die Möglichkeit über den Menüpunkt „Metadaten verwalten“<br />
den Status direkt zu än<strong>der</strong>n und den Lehrtext wie<strong>der</strong> freizugeben.<br />
Wird e<strong>in</strong> Lehrtext vom Prüfer abgelehnt, erhält <strong>der</strong> Autor e<strong>in</strong>en H<strong>in</strong>weis, den Text nochmals<br />
zu überarbeiten. Beim Speichern des überarbeiteten Lehrtextes wird e<strong>in</strong>e neue Version erstellt<br />
und die alte <strong>in</strong>s Archiv abgelegt. So ist es je<strong>der</strong>zeit möglich, die Entstehungsgeschichte <strong>der</strong><br />
Dokumente zu rekonstruieren.<br />
40
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
Das folgende Zustandsmodell soll den herkömmlichen Ablauf des Life Cycle e<strong>in</strong>es Lehrtextes<br />
grafisch veranschaulichen.<br />
Abb. 14: Zustandsmodell Life Cycle e<strong>in</strong>es Lehrtextes<br />
Zusätzlich besteht für Berechtigte je<strong>der</strong>zeit die Möglichkeit, über die Metadatenverwaltung<br />
den Status (zu prüfen, freigegeben, nicht freigegeben, veraltet) e<strong>in</strong>es Lehrtextes <strong>in</strong> e<strong>in</strong>en<br />
an<strong>der</strong>en zu überführen.<br />
Abb. 15: Zustandsmodell Status e<strong>in</strong>es Lehrtext än<strong>der</strong>n<br />
41
CMS für die MIO-Lernumgebung Anfor<strong>der</strong>ungsspezifikation<br />
3.6. Analyse des bestehenden Designs<br />
Lehrtexte werden bislang als Dateien <strong>in</strong> die Umgebung mite<strong>in</strong>gebunden. Sie liegen <strong>in</strong><br />
elektronischer Form zum „Download“ im Bereich „Material“ vor. Die Texte s<strong>in</strong>d vom<br />
Benutzer vorab als Datei zu erstellen und können anschliessend bei vorhandener Berechtigung<br />
<strong>in</strong> die Materialliste aufgenommen werden.<br />
Der Benutzer muss beim „Upload“ den Typ <strong>der</strong> Datei angeben. Diese kann <strong>in</strong> e<strong>in</strong>em HTML-<br />
o<strong>der</strong> <strong>in</strong> e<strong>in</strong>em sonstigen Format vorliegen. Im letzteren Fall wird als Dateityp „b<strong>in</strong>file“<br />
angegeben.<br />
Bei Verwendung von an<strong>der</strong>en Formaten als HTML sollte möglichst darauf geachtet werden,<br />
dass <strong>der</strong> Browser fähig ist, diese darzustellen.<br />
Statt e<strong>in</strong>er Datei kann auch nur e<strong>in</strong> L<strong>in</strong>k auf e<strong>in</strong>e Datei erfasst werden.<br />
Zusätzlich zum Date<strong>in</strong>amen muss e<strong>in</strong> Materialname, <strong>der</strong> Dateityp und die updateberechtigte<br />
Person angegeben werden. Schliesslich wird die Datei e<strong>in</strong>em Term<strong>in</strong> (Block) zugewiesen,<br />
unter welchem sie später zur Verfügung steht.<br />
Unter dem Menüpunkt „Materialübersicht“ s<strong>in</strong>d die Dateien <strong>in</strong> e<strong>in</strong>er Tabelle aufgelistet.<br />
Das bestehende Design <strong>der</strong> Aufbereitung und Ausgabe von Lehrtexten genügt den <strong>in</strong> Kapitel<br />
3.1. eruierten Anfor<strong>der</strong>ungen bei weitem nicht.<br />
Aufgrund <strong>der</strong> Tatsache, dass ganze Dateien e<strong>in</strong>gespeist werden,<br />
• ist e<strong>in</strong> e<strong>in</strong>heitliches Ersche<strong>in</strong>ungsbild nicht möglich.<br />
• besteht ke<strong>in</strong>e Trennung von Inhalt und Layout.<br />
• s<strong>in</strong>d Metadaten vom Inhalt nicht separierbar und können somit nicht getrennt<br />
bearbeitet werden.<br />
• ist für jeden Dateityp e<strong>in</strong> eigener Editor nötig.<br />
• müssen L<strong>in</strong>ks auf Elemente <strong>der</strong> Umgebung von Hand <strong>in</strong> den Lehrtext e<strong>in</strong>gebunden<br />
werden. Dazu s<strong>in</strong>d die Angaben für das Zielattribut des L<strong>in</strong>ks im Vorfeld genau<br />
abzuklären.<br />
• müssen diese zur Prüfung evtl. mehrmals vom Benutzer zur Prüfstelle und wie<strong>der</strong><br />
zurückgeschickt werden, bis sie veröffentlicht werden können.<br />
Zusätzlich fehlen die Möglichkeiten <strong>der</strong> Versionierung und Archivierung.<br />
Die erörterten Schwächen e<strong>in</strong>es Dateiuploads können mithilfe e<strong>in</strong>es Content Management<br />
Systems behoben werden.<br />
42
CMS für die MIO-Lernumgebung Architekturentwurf<br />
4. Architekturentwurf<br />
Die <strong>in</strong> <strong>der</strong> Analysephase gefällten Entscheide legen die Systemarchitektur fest. Diese ist im<br />
folgenden Kapitel genau beschrieben. Dabei werden die zugrundeliegende Datenbankstruktur<br />
und die daraus hervorgehenden Tabellen erläutert. In e<strong>in</strong>em weiteren Schritt folgt die<br />
Beschreibung <strong>der</strong> Website-Struktur, von <strong>der</strong> e<strong>in</strong> Teilkonstrukt genauer betrachtet wird.<br />
Das Content Management System wird als weiterer Teil <strong>in</strong> die bestehende MIO-Umgebung<br />
e<strong>in</strong>gebaut. Der Aufruf des CMS geschieht über den L<strong>in</strong>k „CMS“ <strong>in</strong> <strong>der</strong> rechtsstehenden<br />
Navigation <strong>der</strong> Umgebung.<br />
Die <strong>der</strong> Umgebung zugrundeliegende funktionsorientierte Architektur (siehe [Mahl02])<br />
schreibt die des CMS vor. Zur Realisierung e<strong>in</strong>er Funktion werden teilweise an<strong>der</strong>e<br />
Funktionen aufgerufen. Auf diese Art entsteht e<strong>in</strong>e Hierarchie von Funktionen, wobei<br />
diejenige an <strong>der</strong> Spitze <strong>der</strong> Hierarchie das Hauptprogramm darstellt.<br />
Der Datenaustausch zwischen den Modulen erfolgt durch Aufruf mit Parameterübergabe.<br />
Die funktionsorientierte Architektur [Gl<strong>in</strong>98] kann <strong>der</strong> gewünschten Modularisierung nur<br />
teilweise genügen. Alle Aufgaben, bei denen e<strong>in</strong>e Gruppe von Funktionen e<strong>in</strong>en<br />
geme<strong>in</strong>samen Status verwaltet (im Fall des CMS die Bearbeitung <strong>der</strong> Dokumenten<strong>in</strong>halte im<br />
Editor), müssen die Funktionen zusammen mit den Statusdaten zu e<strong>in</strong>em Modul<br />
zusammengefasst werden. Dies kann bei komplexen funktionsorientierten Entwürfen das<br />
Verständnis erschweren.<br />
Im Folgenden wird das Content Management System von se<strong>in</strong>er Umgebung abgekoppelt<br />
betrachtet. Die für das CMS-Datenbankschema relevanten Entitäten können aus [Lagl02]<br />
übernommen werden.<br />
Das ER-Diagramm wird mit Microsoft Powerpo<strong>in</strong>t 2000 erstellt.<br />
43
CMS für die MIO-Lernumgebung Architekturentwurf<br />
4.1. Datenbankstruktur<br />
Das folgende ER-Diagramm soll die Datenbank-Struktur des Content Management Systems<br />
näher erläutern. Anhand dieses Schemas können die Zusammenhänge <strong>der</strong> e<strong>in</strong>zelnen<br />
Gegenstände herausgelesen werden.<br />
Zentraler Punkt dieses Schemas s<strong>in</strong>d die Metadaten. Metadata repräsentiert alle Informationen<br />
über e<strong>in</strong>en Lehrtext. Der Inhalt des Lehrtextes ist separat als Content abgelegt. Je<strong>der</strong> Content<br />
hat genau e<strong>in</strong>en Satz an Informationen (Metadata) und umgekehrt.<br />
Über die Metadaten ist je<strong>der</strong> Lehrtext mit den übrigen Gegenständen verbunden. E<strong>in</strong> Lehrtext<br />
ist zu je<strong>der</strong> Zeit <strong>in</strong> e<strong>in</strong>em Zustand (state), welcher angibt, <strong>in</strong> welcher Phase des Life Cycle er<br />
sich bef<strong>in</strong>det.<br />
E<strong>in</strong> Lehrtext gehört zu e<strong>in</strong>em Thema und hat e<strong>in</strong>en Autor, welcher zu e<strong>in</strong>er o<strong>der</strong> mehreren<br />
Gruppen gehören kann. Diese wie<strong>der</strong>um s<strong>in</strong>d Mitglied e<strong>in</strong>er Klasse.<br />
Je<strong>der</strong> Lehrtext ist e<strong>in</strong>er o<strong>der</strong> mehreren Klassen zugeordnet, d.h. jedes Mitglied <strong>der</strong> Gruppen<br />
e<strong>in</strong>er dieser Klassen hat Zugang zu diesem Dokument.<br />
Die Metadaten geben ausserdem Auskunft darüber, welche Gruppen Editier- o<strong>der</strong> Prüfrechte<br />
haben.<br />
Abb. 16: ER-Diagramm<br />
Um das Konstrukt durchwegs verstehen zu können, müssen die aus diesem Schema hervorgehenden<br />
Tabellen mitbetrachtet werden. Sie s<strong>in</strong>d vollständig im <strong>Anhang</strong> zu f<strong>in</strong>den.<br />
Diejenigen, welche e<strong>in</strong>er zusätzlichen Erklärung bedürfen, s<strong>in</strong>d im Folgenden abgedruckt.<br />
44
CMS für die MIO-Lernumgebung Architekturentwurf<br />
Tabellen<br />
Diese <strong>in</strong> Tabellenform dargestellten Gegenstände und Beziehungen enthalten zusätzlich die<br />
jeweiligen Fremdschlüssel. Grundsätzlich kann die Notation des Schemas aus den weiter oben<br />
vorgestellten Konzepten herausgelesen werden. Erklärungen zu speziellen Beziehungskonstrukten<br />
o<strong>der</strong> zur Bedeutung spezieller Fel<strong>der</strong> von Gegenständen s<strong>in</strong>d am Ende <strong>der</strong><br />
jeweiligen Tabelle angegeben.<br />
metadata<br />
metadata_id <strong>in</strong>t<br />
title text<br />
lock <strong>in</strong>t<br />
version <strong>in</strong>t<br />
date date<br />
*content_type text<br />
persons_id <strong>in</strong>t<br />
themes_id <strong>in</strong>t<br />
classes_id <strong>in</strong>t<br />
state_id <strong>in</strong>t<br />
edit_group_id <strong>in</strong>t<br />
check_group_id <strong>in</strong>t<br />
Tab. 7: Metadata<br />
Metadata be<strong>in</strong>haltet alle Informationen über den Lehrtext. Das Feld “lock” hat standardmässig<br />
den Wert 0. Wird e<strong>in</strong> Lehrtext o<strong>der</strong> dessen Metadaten bearbeitet, wird das Feld auf 1 gesetzt.<br />
Der entsprechende Lehrtext ist <strong>in</strong> dieser Zeit für an<strong>der</strong>e Benutzer gesperrt.<br />
„Content_type“ bezeichnet die Art des Inhalts (Lehrtext, Homepage, Mikroartikel). Dieses<br />
Feld steht für e<strong>in</strong>e zukünftige Erweiterung <strong>der</strong> Umgebung zur Verfügung.<br />
content<br />
content_id <strong>in</strong>t<br />
content text<br />
metadata_id <strong>in</strong>t<br />
Tab. 8: Content<br />
In „content“ wird <strong>der</strong> eigentliche Inhalt des Lehrtextes gespeichert.<br />
state<br />
state_id <strong>in</strong>t<br />
state text<br />
Tab. 9: State<br />
„State“ beschreibt den Status des Lehrtextes („zu prüfen“, „freigegeben“, „nicht freigegeben“<br />
o<strong>der</strong> „veraltet“ möglich).<br />
45
CMS für die MIO-Lernumgebung Architekturentwurf<br />
groups_persons<br />
groups_persons_id <strong>in</strong>t<br />
groups_id <strong>in</strong>t<br />
persons_id <strong>in</strong>t<br />
Tab. 10: Groups_persons [Lagl02]<br />
Groups_persons verb<strong>in</strong>det groups und persons. Da sowohl Personen <strong>in</strong> mehreren Gruppen<br />
Mitglied se<strong>in</strong> können (m), als auch Gruppen mehrere Personen be<strong>in</strong>halten können (n), muss<br />
e<strong>in</strong> neues Beziehungsschema def<strong>in</strong>iert werden. Dabei werden die Primärschlüssel von persons<br />
und groups als Fremdschlüssel e<strong>in</strong>gefügt.<br />
classes_groups<br />
classes_groups_id <strong>in</strong>t<br />
classes_id <strong>in</strong>t<br />
groups_id <strong>in</strong>t<br />
Tab. 11: Classes_groups [Lagl02]<br />
Classes_groups verb<strong>in</strong>det classes und groups. Wie bei groups_persons muss aufgrund <strong>der</strong><br />
m:n-Beziehung e<strong>in</strong> neues Beziehungsschema def<strong>in</strong>iert werden. Die Primärschlüssel von<br />
classes und groups werden als Fremdschlüssel e<strong>in</strong>gefügt.<br />
46
CMS für die MIO-Lernumgebung Architekturentwurf<br />
4.2. Trennung von Inhalt und Layout<br />
Aus <strong>der</strong> Anfor<strong>der</strong>ungsanalyse geht hervor, dass sich die gefor<strong>der</strong>te Trennung von Inhalt,<br />
Gestaltung und Funktionalität mit den vorgeschriebenen Technologien leicht realisieren lässt.<br />
Der Inhalt e<strong>in</strong>es Dokuments wird dabei mit XML beschrieben und für die Gestaltung sorgt e<strong>in</strong><br />
XSL-Stylesheet (Template). Als Programmiersprache ist PHP vorgesehen.<br />
Gemäss Anfor<strong>der</strong>ungsanalyse soll das zu implementierende System dem Autor die Möglichkeit<br />
bieten, das Template se<strong>in</strong>en Bedürfnissen anzupassen.<br />
Die Fel<strong>der</strong> „Haupttitel“, „Autor“ und „Thema“ s<strong>in</strong>d im Template schon vorhanden und damit<br />
vorgegeben. Diese können durch die Fel<strong>der</strong> Untertitel1 (Untertitel <strong>der</strong> Grösse 1), Untertitel2<br />
(Untertitel <strong>der</strong> Grösse 2) und Textarea ergänzt werden. Titelfel<strong>der</strong> s<strong>in</strong>d pr<strong>in</strong>zipiell e<strong>in</strong>zeilig,<br />
Textareas werden zehnzeilig angezeigt, wobei <strong>der</strong>en Inhalt unbegrenzt ist.<br />
Zusätzliche Untertitel- und Textfel<strong>der</strong> können <strong>in</strong> beliebiger Anzahl und Reihenfolge e<strong>in</strong>gefügt<br />
werden.<br />
47
CMS für die MIO-Lernumgebung Architekturentwurf<br />
4.3. Struktur <strong>der</strong> Website<br />
Die Struktur <strong>der</strong> Website ist im folgenden Diagramm grafisch festgehalten. Das Diagramm ist<br />
hierarchisch aufgebaut, d.h. die Wurzel repräsentiert den E<strong>in</strong>stieg <strong>in</strong> die Website, von wo aus<br />
die Ebenen bis zu den Blättern durchlaufen werden können. L<strong>in</strong>ks zu verknüpften Seiten s<strong>in</strong>d<br />
mit Pfeilen dargestellt.<br />
Abb. 17: Website-Struktur<br />
48
CMS für die MIO-Lernumgebung Architekturentwurf<br />
Über den L<strong>in</strong>k „CMS“ des Navigationsmenüs <strong>der</strong> MIO-Umgebung wird <strong>der</strong> E<strong>in</strong>stieg <strong>in</strong> das<br />
Content Management Systems ermöglicht. „Index.html“ stellt die Hauptseite dar, welche sich<br />
als e<strong>in</strong> <strong>in</strong> zwei Frames aufgeteiltes Fenster präsentiert. Im oberen Frame bef<strong>in</strong>det sich das<br />
Navigationsmenü (table_of_contents.html), über welches <strong>der</strong> Inhalt (contents.php) des<br />
unteren Frames bestimmt werden kann.<br />
Abb. 18: Screenpr<strong>in</strong>t Index.html<br />
Nach Wahl e<strong>in</strong>es Menüpunkts <strong>der</strong> Navigation wird über „choose_class.php“ e<strong>in</strong> Auswahlfeld<br />
mit den vorhandenen Klassen angezeigt.<br />
Die Wahl e<strong>in</strong>er Klasse ist notwendig, da sich je<strong>der</strong> Lehrtext auf e<strong>in</strong>e bestimmte Klasse<br />
bezieht. „Contents.php“ übernimmt nach erfolgter Auswahl e<strong>in</strong>er Klasse die Klassen-ID. Der<br />
zusätzlich mitgelieferte Parameter <strong>der</strong> Navigation-Menüwahl bestimmt die <strong>in</strong> „contents.php“<br />
abzuarbeitende Funktion (show_content(), new_content(), edit_content(), check_content(),<br />
manage_metadata() o<strong>der</strong> archive()).<br />
49
CMS für die MIO-Lernumgebung Architekturentwurf<br />
Folgendes Teilkonstrukt soll e<strong>in</strong>en E<strong>in</strong>druck vermitteln, wie das Zusammenspiel <strong>der</strong><br />
e<strong>in</strong>zelnen Seiten funktioniert und welche Art von Daten überliefert und ausgegeben werden.<br />
Im Beispiel wird <strong>der</strong> Menüpunkt „Editieren“ angewählt und die entsprechende Funktion<br />
„edit_content()“ <strong>in</strong> „contents.php“ aufgerufen. Die Funktion „edit_content()“ lässt alle für den<br />
Benutzer zugänglichen Lehrtexte <strong>in</strong> e<strong>in</strong>em Auswahlfeld anzeigen.<br />
Abb. 19: Screenpr<strong>in</strong>t Auswahl Editieren<br />
Die Betätigung des „ok“-Knopfs bestätigt die Wahl des Dokuments und schickt dessen ID an<br />
die Seite „edit_content.php“. „Edit_content.php“ lädt die zur Dokumenten-ID passenden<br />
Daten aus <strong>der</strong> Datenbank und kreiert den XML-Str<strong>in</strong>g. Der XSLT-Prozessor „Sablotron“<br />
transformiert den XML-Str<strong>in</strong>g zusammen mit dem XSL-Stylesheet „content_form.xsl“ <strong>in</strong><br />
e<strong>in</strong>en HTML-Str<strong>in</strong>g.<br />
Das XSL-Stylesheet „content_form.xsl“ stellt e<strong>in</strong> Template dar, welches von Sablotron mit<br />
den aus <strong>der</strong> Datenbank geladenen Daten gefüllt und anschliessend im Browser angezeigt wird.<br />
Das Dokument kann nun vom Benutzer bearbeitet werden.<br />
50
CMS für die MIO-Lernumgebung Architekturentwurf<br />
Der Editor ermöglicht dem Benutzer, das Template mit zusätzlichen Titel- o<strong>der</strong> Textfel<strong>der</strong>n<br />
zu erweitern („Textarea e<strong>in</strong>fügen“, „Untertitel1 e<strong>in</strong>fügen“ und „Untertitel2 e<strong>in</strong>fügen“) o<strong>der</strong><br />
bereits e<strong>in</strong>gefügte wie<strong>der</strong> zu löschen („Löschen“, jeweils rechts neben entsprechendem Feld).<br />
Die Fel<strong>der</strong> „Autor“ und „Thema“ s<strong>in</strong>d für e<strong>in</strong>e direkte E<strong>in</strong>gabe gesperrt. Deren Inhalt muss<br />
über „Autor wählen“ und „Thema wählen“ aus e<strong>in</strong>em Auswahlfeld übernommen werden.<br />
Dies garantiert e<strong>in</strong>e korrekte Verl<strong>in</strong>kung zu e<strong>in</strong>em vorhandenen Element.<br />
Über die neben Textfel<strong>der</strong>n stehenden Knöpfe „L<strong>in</strong>k/Bild e<strong>in</strong>fügen“ ist es möglich, L<strong>in</strong>ks zu<br />
vorhandenen Elementen sowie zu Bil<strong>der</strong>n o<strong>der</strong> E-Mail-Adressen <strong>in</strong> den Text e<strong>in</strong>zufügen.<br />
Das System erlaubt auch, die L<strong>in</strong>k-Tags direkt <strong>in</strong> das Textfeld e<strong>in</strong>zugeben. Aufgrund des<br />
Risikos e<strong>in</strong>er falschen Verl<strong>in</strong>kung (falsche Zielangabe o<strong>der</strong> unkorrekte Syntax <strong>der</strong> Tags) ist<br />
dies aber i.a. nicht zu empfehlen.<br />
Abb. 20: Screenpr<strong>in</strong>t Thema und L<strong>in</strong>k <strong>in</strong> Template („content_form.xsl“) e<strong>in</strong>fügen<br />
51
CMS für die MIO-Lernumgebung Architekturentwurf<br />
Das fertig bearbeitete Dokument wird über „Version erstellen“ gespeichert und angezeigt.<br />
Die Bearbeitung des Templates sowie <strong>der</strong> Aufruf von Auswahlfel<strong>der</strong>n und das abschliessende<br />
„Version erstellen“ wird über die Seite „edit_xml.php“ gesteuert. Deren Funktion<br />
„edit_template()“ kreiert nach je<strong>der</strong> Benutzeraktion (Benutzer drückt e<strong>in</strong>en <strong>der</strong> Knöpfe des<br />
Templates) e<strong>in</strong>en neuen XML-Str<strong>in</strong>g, lässt diesen durch Sablotron mit dem passenden XSL-<br />
Stylesheet („content_form.xsl“) transformieren und im Browser als HTML-Str<strong>in</strong>g darstellen.<br />
Dabei werden auch die vom Benutzer zwischenzeitlich gemachten Än<strong>der</strong>ungen <strong>der</strong> Text<strong>in</strong>halte<br />
<strong>in</strong> den neuen XML-Str<strong>in</strong>g übernommen.<br />
Beim Speichern des Dokuments („Version erstellen“) wird zur Darstellung das XSL-<br />
Stylesheet „content.xsl“ verwendet.<br />
Abb. 21: Screenpr<strong>in</strong>t Ausgabe des Dokuments mit Stylesheet „content.xsl“<br />
Die Regeln für e<strong>in</strong>en gültigen XML-Syntax s<strong>in</strong>d <strong>in</strong> <strong>der</strong> DTD-Datei „content.dtd“ vorgegeben.<br />
Ist <strong>der</strong> zu transformierende XML-Str<strong>in</strong>g regelwidrig zusammengesetzt, gibt <strong>der</strong> XSLT-<br />
Prozessor e<strong>in</strong>e Fehlermeldung aus.<br />
52
CMS für die MIO-Lernumgebung Architekturentwurf<br />
Im Folgenden wird das restliche Konstrukt <strong>der</strong> Website vorgestellt.<br />
Nach je<strong>der</strong> Menüpunktwahl wird zuerst e<strong>in</strong> Auswahlfeld <strong>der</strong> vorhandenen Klassen angezeigt,<br />
von welchen e<strong>in</strong>e ausgewählt werden kann. Alle weiteren Aktionen beziehen sich dann auf<br />
diese Klasse.<br />
Über „Ansicht“ lässt „contents.php“ die Auswahl <strong>der</strong> aktuellen Lehrtexte anzeigen. Nach<br />
Betätigung des „ok“-Knopfs übergibt die Funktion „show_content()“ die ID des vom<br />
Benutzer gewählten Dokuments an die Seite „show_content.php“. „Show_content.php“ lädt<br />
den entsprechenden XML-Str<strong>in</strong>g aus <strong>der</strong> MIO-Datenbank und lässt ihn nach <strong>der</strong><br />
Transformation <strong>in</strong>s HTML-Format im Browser anzeigen.<br />
„Erstellen“ lässt den Benutzer über „new_content.php“ neue Lehrtexte erstellen. Der XML-<br />
Str<strong>in</strong>g für das anzuzeigende Standardformular wird nicht dynamisch aus <strong>der</strong> Datenbank<br />
geladen, son<strong>der</strong>n ist statisch als Str<strong>in</strong>g im Skript „new_content.php“ vorhanden.<br />
Erstellte Lehrtexte müssen vor <strong>der</strong> Publikation zuerst geprüft werden. Über den Menüpunkt<br />
„Prüfen“ werden die als „zu prüfen“ markierte Lehrtexte im Auswahlfeld angezeigt. Nach<br />
Betätigung des „ok“-Knopfs wird <strong>der</strong> gewählte von „check_content.php“ ausgegeben.<br />
Der Prüfer entscheidet über e<strong>in</strong>e Radio-box, ob <strong>der</strong> Lehrtext freizugeben o<strong>der</strong> nicht<br />
freizugeben ist. Der Entscheid wird an „set_state.php“ geschickt. „Set_state.php“ nimmt den<br />
entsprechenden E<strong>in</strong>trag <strong>in</strong> <strong>der</strong> Datenbank vor.<br />
Über „Archiv“ lässt „archive.php“ archivierte Lehrtexte (als „veraltet“ markierte Lehrtexte)<br />
darstellen.<br />
Schliesslich kann <strong>der</strong> Benutzer über „Metadaten“ die Metadaten <strong>der</strong> Lehrtexte bearbeiten.<br />
Dazu lässt „contents.php“ die Auswahl <strong>der</strong> editierbaren Metadaten auflisten. Die gewählten<br />
Metadaten werden anschliessend von „get_metadata“ aus <strong>der</strong> Datenbank geladen und <strong>in</strong><br />
e<strong>in</strong>em herkömmlichen HTML-Formular ausgegeben. Nach Bearbeitung durch den Benutzer<br />
speichert „set_metadata.php“ die gemachten Än<strong>der</strong>ungen <strong>in</strong> <strong>der</strong> Datenbank.<br />
Die hier vorgestellte Lösung bzgl. Klassenwahl ist provisorisch. In <strong>der</strong> neuen Version <strong>der</strong><br />
Personenverwaltung [Kaeg02] soll die Klassenwahl vor Aufruf des CMS vorgenommen<br />
werden.<br />
Dies sollte <strong>in</strong> e<strong>in</strong>er weiteren Version des CMS folgen<strong>der</strong>massen berücksichtigt werden:<br />
Die vorab gewählte Klasse ist <strong>in</strong> die Lehrtext-Abfragen <strong>der</strong> <strong>in</strong> „contents.php“ abzuarbeitenden<br />
Funktionen (show_content(), new_content(), edit_content(), check_content(), manage_metadata()<br />
o<strong>der</strong> archive()) mite<strong>in</strong>zubauen.<br />
Gleichzeitig wird das Skript „choose_class.php“ überflüssig und kann entfernt werden.<br />
Entsprechende Än<strong>der</strong>ungen s<strong>in</strong>d <strong>in</strong> „table_of_contents.php“ vorzunehmen (die L<strong>in</strong>ks <strong>der</strong><br />
Navigation müssen neu auf das Skript „contents.php“ zeigen).<br />
53
CMS für die MIO-Lernumgebung Implementierung<br />
5. Implementierung<br />
Nach <strong>der</strong> E<strong>in</strong>führung <strong>in</strong> die Sprache PHP <strong>in</strong> Kapitel 2 soll nun e<strong>in</strong> E<strong>in</strong>blick <strong>in</strong> den<br />
Programmiercode gegeben werden.<br />
Im Code <strong>der</strong> MIO-Umgebung musste die Datei frame.php [Mahl02] angepasst werden. Sie ist<br />
für die Anzeige <strong>der</strong> Navigation <strong>der</strong> Umgebung zuständig. Die Navigation wurde um den<br />
Menüpunkt „CMS“ ergänzt.<br />
Die MIO-Datenbank [Lagl02] wurde um die Tabellen „metadata“, „content“ und „state“<br />
erweitert.<br />
54
CMS für die MIO-Lernumgebung Implementierung<br />
5.1. Genereller Skriptaufbau<br />
Der grundlegende Skriptaufbau kann von <strong>der</strong> MIO-Umgebung übernommen werden. Jedes<br />
Skript wird durch die E<strong>in</strong>b<strong>in</strong>dung von „hea<strong>der</strong>.php“ e<strong>in</strong>geleitet und mit <strong>der</strong> E<strong>in</strong>b<strong>in</strong>dung von<br />
„footer.php“ abgeschlossen (siehe [Mahl02]).<br />
„Hea<strong>der</strong>.php“ lädt die globalen Variablen und Funktionen <strong>der</strong> Umgebung, welche teilweise<br />
auch vom CMS benutzt werden müssen. So s<strong>in</strong>d die Variablen vorgegeben, welche für e<strong>in</strong>e<br />
Verb<strong>in</strong>dung zur MySQL-Datenbank benötigt werden. Dabei wird die ADODB-Library<br />
(Active Data Objects DataBase) verwendet, welche e<strong>in</strong>en allgeme<strong>in</strong>gültigen Zugriff auf<br />
verschiedenste Datenbanken (z.B. MySQL, Oracle, MS SQL, Access, Sybase, ODBC und<br />
ADO) ermöglicht. „Hea<strong>der</strong>.php“ stellt jeweils bei Ausführung e<strong>in</strong>e Verb<strong>in</strong>dung zur MIO-<br />
Datenbank her. Die Verb<strong>in</strong>dung kann über die globale Variable „$miodb“ angesprochen<br />
werden.<br />
Wird im Skript die Überprüfung <strong>der</strong> Adm<strong>in</strong>istratorrechte benötigt, f<strong>in</strong>det jeweils die Funktion<br />
„isAdm<strong>in</strong>()“ aus „.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php“ [Nier02] Verwendung.<br />
Ist das aktuelle Skript abgearbeitet, wird die Verb<strong>in</strong>dung durch „footer.php“ geschlossen.<br />
Der restliche Inhalt von „hea<strong>der</strong>.php“ ist für das CMS nicht relevant.<br />
55
CMS für die MIO-Lernumgebung Implementierung<br />
5.2. Verwendung von $_POST<br />
Die Datenübergabe zwischen zwei PHP-Skripten muss über die PHP-eigenen globalen<br />
Variablen $_GET und $_POST abgewickelt werden. Wie <strong>in</strong> 2.1.3 erläutert, stehen die Daten<br />
anschliessend als Elemente im Array $_GET[] resp. $_POST[] zur Verfügung.<br />
Werden Daten über e<strong>in</strong> Formular abgeschickt und ist als Ziel e<strong>in</strong> PHP-Skript angegeben,<br />
bestimmt das „method“-Attribut, ob die Methode GET o<strong>der</strong> POST angewendet wird.<br />
Im Unterschied zu POST werden bei GET die Formulardaten über die URL übermittelt,<br />
<strong>in</strong>dem diese an den URL-Str<strong>in</strong>g angehängt werden.<br />
Die GET-Methode vere<strong>in</strong>facht zwar die Handhabung <strong>der</strong> Daten, hat aber den Nachteil, nur<br />
e<strong>in</strong>e beschränkte Anzahl Zeichen übermitteln zu können. Ist die mögliche Anzahl Zeichen<br />
erreicht, wird <strong>der</strong> Rest abgeschnitten und nicht mitgeschickt.<br />
Somit ist für das CMS die Anwendung <strong>der</strong> POST-Methode vorgegeben, da bei Aufruf <strong>der</strong><br />
nächsten Seite jeweils <strong>der</strong> ganze Formular<strong>in</strong>halt mitgeschickt wird. Dies ist nötig, weil bei<br />
Wie<strong>der</strong>aufruf e<strong>in</strong>es Formulars dessen vorheriger Inhalt nicht mehr zur Verfügung steht.<br />
Die Anwendung <strong>der</strong> POST-Methode schränkt gleichzeitig die Layout-Übernahme <strong>der</strong> MIO-<br />
Umgebung <strong>in</strong> das CMS e<strong>in</strong>:<br />
In <strong>der</strong> Umgebung werden Auswahlfel<strong>der</strong> meist als Tabellen dargestellt. Deren rechte Spalten<br />
be<strong>in</strong>halten jeweils L<strong>in</strong>ks zur Manipulation <strong>der</strong> Zeilene<strong>in</strong>träge. Die Datenübergabe mit L<strong>in</strong>ks<br />
kann aber nur über die GET-Methode geschehen.<br />
Somit müssen aufgrund <strong>der</strong> zu verwendenden POST-Methode die Auswahlfel<strong>der</strong> als<br />
Dropdown-Fel<strong>der</strong> implementiert werden.<br />
E<strong>in</strong>e mögliche dritte Alternative wäre, die Daten zwischenzeitlich <strong>in</strong> e<strong>in</strong>em HTTP-Cookie zu<br />
speichern, welches bzgl. <strong>der</strong> Speichergrösse nicht e<strong>in</strong>geschränkt ist.<br />
Cookies ermöglichen die Daten-Speicherung <strong>in</strong>nerhalb <strong>der</strong> jeweiligen Browser-Umgebung.<br />
Da ältere Browser-Versionen mit Cookies teilweise unkorrekt umgehen, wird diese<br />
Alternative wie<strong>der</strong> verworfen.<br />
Anhand e<strong>in</strong>iger Ausschnitte soll nun <strong>der</strong> Skript-Code von „edit_xml.php“ vorgestellt und<br />
erklärt werden.<br />
56
CMS für die MIO-Lernumgebung Implementierung<br />
5.3. edit_xml.php<br />
Das Skript „edit_xml.php“ ist für die Bearbeitung des CMS-Templates zuständig. Es<br />
be<strong>in</strong>haltet die Hauptfunktion „edit_template()“, die Funktionen „select_author()“ und<br />
„select_theme()“, sowie die Funktion „<strong>in</strong>sert_l<strong>in</strong>k()“.<br />
Beim Ausführen von „edit_xml.php“ wird nach Abarbeiten des Hea<strong>der</strong>s („hea<strong>der</strong>.php“)<br />
automatisch die Hauptfunktion „edit_template()“ aufgerufen.<br />
„Edit_template()“ sorgt dafür, dass die mitgelieferten Formular<strong>in</strong>halte des Templates XMLkonform<br />
umgewandelt werden. Der XSLT-Prozessor „Sablotron“ transformiert den<br />
generierten XML-Str<strong>in</strong>g anschliessend mit e<strong>in</strong>em geeigneten XSL-Stylesheet <strong>in</strong> e<strong>in</strong>e HTML-<br />
Seite. Diese kann von jedem Browser e<strong>in</strong>wandfrei dargestellt werden.<br />
Solange das Template o<strong>der</strong> dessen Inhalte bearbeitet werden, verwendet Sablotron das XSL-<br />
Stylesheet „content_form.xsl“, welches die neu generierte HTML-Seite als Formular darstellt.<br />
Erst beim Erstellen e<strong>in</strong>er Version vom Dokument wird das XSL-Stylesheet „content.xsl“ zur<br />
Ansicht des Dokuments verwendet.<br />
Nach je<strong>der</strong> Benutzeraktion im Template (Benutzer drückt Knopf) muss die HTML-Seite neu<br />
generiert und angezeigt werden, d.h. jede Aktion führt zu e<strong>in</strong>er Ausführung des Skripts<br />
„edit_xml.php“. Somit ist <strong>in</strong> „edit_template()“ erst herauszuf<strong>in</strong>den, wo im Template etwas<br />
geän<strong>der</strong>t wurde, d.h. welcher Knopf gedrückt wurde. Dies geschieht mit <strong>der</strong> Abfrage <strong>der</strong><br />
$_POST-Variable:<br />
...<br />
// Folgende Bed<strong>in</strong>gungsanweisungen prüfen, durch welche Aktion (Button) edit_xml.php<br />
// aufgerufen wurde und verarbeiten die jeweiligen <strong>in</strong> $_POST gespeicherten Variablen<br />
// Button "Neue Version" gedrückt<br />
if (isset($_POST['new_version']))<br />
{<br />
...<br />
}<br />
// Button "Autor wählen" gedrückt<br />
elseif (isset($_POST['select_author']))<br />
{<br />
select_author();<br />
exit;<br />
}<br />
//Autor gewählt, Aufruf von edit_xml.php durch Funktion select_author()<br />
elseif (isset($_POST['selected_author']))<br />
{<br />
…<br />
}<br />
// Button "Thema wählen" gedrückt<br />
elseif (isset($_POST['select_theme']))<br />
{<br />
select_theme();<br />
exit;<br />
}<br />
elseif (!empty($_POST['new_theme']))<br />
{<br />
…<br />
}<br />
//Thema gewählt, Aufruf von edit_xml.php durch Funktion select_theme()<br />
elseif (isset($_POST['selected_theme']))<br />
{<br />
…<br />
57
CMS für die MIO-Lernumgebung Implementierung<br />
}<br />
// Button "L<strong>in</strong>k/Bild e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_l<strong>in</strong>k']))<br />
{<br />
<strong>in</strong>sert_l<strong>in</strong>k();<br />
exit;<br />
}<br />
//L<strong>in</strong>k gewählt, Aufruf von edit_xml.php durch Funktion <strong>in</strong>sert_l<strong>in</strong>k()<br />
elseif (!empty($_POST['l<strong>in</strong>k_form']))<br />
{<br />
...<br />
}<br />
// Button "Löschen" gedrückt<br />
elseif (isset($_POST['delete_field']))<br />
{<br />
…<br />
}<br />
// Button "Textarea e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_textarea']))<br />
{<br />
…<br />
}<br />
// Button "Untertitel1 e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_subtitle']))<br />
{<br />
…<br />
}<br />
// Button "Untertitel2 e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_sub_subtitle']))<br />
{<br />
…<br />
}<br />
...<br />
Bei Betätigung <strong>der</strong> Knöpfe „Autor wählen“, „Thema wählen“ o<strong>der</strong> „L<strong>in</strong>k/Bild e<strong>in</strong>fügen“ wird<br />
von „edit_template()“ die entsprechende Funktion („select_author()“, „select_theme()“ o<strong>der</strong><br />
„<strong>in</strong>sert_l<strong>in</strong>k()“) aufgerufen. Diese Funktionen generieren Auswahlfel<strong>der</strong> mit entsprechendem<br />
Inhalt. Nach Bestätigung <strong>der</strong> Wahl durch den Benutzer müssen die Än<strong>der</strong>ungen <strong>in</strong> das<br />
Template übernommen und dieses neu angezeigt werden. Dafür wird erneut die Funktion<br />
„edit_template()“ aufgerufen.<br />
Die überlieferten Template-Inhalte werden jeweils als Elemente <strong>in</strong> <strong>der</strong> globalen PHP-Variable<br />
$_POST gespeicherten. Um die Inhalte weiterverarbeiten zu können, müssen sie zuerst XMLkonform<br />
formatiert (d.h. überflüssige Slashes entfernen, System-Umbruchzeichen durch<br />
-Tags ersetzen) und anschliessend <strong>in</strong> e<strong>in</strong>en Str<strong>in</strong>g umgewandelt werden. Der Str<strong>in</strong>g wird<br />
dann zerlegt und <strong>in</strong> den Array „$vars“ geschrieben.<br />
...<br />
// die <strong>in</strong> $_POST gespeicherten Variablen werden xml-konform formatiert<br />
// dabei werden überflüssige Slashes entfernt und System-Umbruchzeichen <strong>in</strong> Textareas durch<br />
// -Tags ersetzt<br />
// \015 steht für , „Carriage Return“<br />
// anschliessend wird e<strong>in</strong> Str<strong>in</strong>g "$post_str<strong>in</strong>g" mit allen Variablen <strong>in</strong> <strong>der</strong> Form<br />
// "Variablenname=Variablen<strong>in</strong>halt" erstellt<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = stripslashes($key);<br />
$val = stripslashes($val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
58
CMS für die MIO-Lernumgebung Implementierung<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
...<br />
Folgende FOR-Schleife durchläuft das erstellte Array und vergleicht jeweils den<br />
Variablennamen mit den Fel<strong>der</strong>n <strong>der</strong> Switch-Anweisung. Stimmen diese übere<strong>in</strong>, wird <strong>der</strong><br />
XML-Str<strong>in</strong>g um das entsprechende Element mit Inhalt ergänzt. Die Skript-Variable<br />
„$element_count“ sorgt für e<strong>in</strong>e fortlaufende ID-Zuweisung <strong>der</strong> <strong>in</strong>s Template e<strong>in</strong>gefügten<br />
Untertitel- und Textfel<strong>der</strong>. So ist <strong>der</strong>en E<strong>in</strong>deutigkeit garantiert.<br />
Anschliessend wird <strong>der</strong> XML-Str<strong>in</strong>g um die benötigten Abschluss-Elemente ergänzt.<br />
...<br />
// Variable, welche die id-nr <strong>der</strong> Elemente des "Content"-Bereichs festlegt<br />
$element_count = 1;<br />
// Variable, welche den Content für die Datenbank speichert, die Fel<strong>der</strong> ma<strong>in</strong>title, author,<br />
// theme werden <strong>in</strong> <strong>der</strong> DB separat gespeichert (Metadaten)<br />
$content = "";<br />
// <strong>in</strong> <strong>der</strong> folgenden for-Schleife wird e<strong>in</strong> xml-Str<strong>in</strong>g erstellt<br />
for($i=0;$i
CMS für die MIO-Lernumgebung Implementierung<br />
if((!empty($_POST['new_theme']))|isset($_POST['selected_theme']))<br />
{<br />
$xml_str .= "" . $theme . "";<br />
break;<br />
}<br />
else<br />
{<br />
$xml_str .= "" . $item[1] . "";<br />
}<br />
// für DB<br />
$theme = $item[1];<br />
break;<br />
case "theme_id":<br />
// falls neues Thema,Kommentar e<strong>in</strong>gegeben o<strong>der</strong> e<strong>in</strong> Thema gewählt<br />
if((!empty($_POST['new_theme']))|isset($_POST['selected_theme']))<br />
{<br />
$xml_str .= "" . $themes_id . "";<br />
break;<br />
}<br />
else<br />
{<br />
$xml_str .= "" . $item[1] . "";<br />
}<br />
// für DB<br />
$themes_id = $item[1];<br />
break;<br />
case "class_id":<br />
$xml_str .= "" . $item[1] . "";<br />
// für DB<br />
$class_id = $item[1];<br />
break;<br />
case "subtitle_no_".$element_count:<br />
// falls Feld-Nr e<strong>in</strong>es zu löschenden Feldes gegeben und Element-counter<br />
// entsprechendes schon erreicht, wird das zu löschende Feld mit<br />
// demjenigen zur Rechten überschrieben und alle nachfolgenden Fel<strong>der</strong><br />
// e<strong>in</strong>e Position nach l<strong>in</strong>ks verschoben<br />
if(isset($field_no_to_delete)&&($element_count>$field_no_to_delete))<br />
{<br />
$shift_fields_left=1;<br />
}<br />
else<br />
{<br />
$shift_fields_left=0;<br />
}<br />
$xml_str.="" . $item[1] . "";<br />
$content.="" . $item[1] . "";<br />
$element_count++;<br />
break;<br />
case "sub_subtitle_no_".$element_count:<br />
// falls Feld-Nr e<strong>in</strong>es zu löschenden Feldes gegeben und Element-counter<br />
// entsprechendes schon erreicht, wird das zu löschende Feld mit<br />
// demjenigen zur Rechten überschrieben und alle nachfolgenden Fel<strong>der</strong><br />
// e<strong>in</strong>e Position nach l<strong>in</strong>ks verschoben<br />
if(isset($field_no_to_delete)&&($element_count>$field_no_to_delete))<br />
{<br />
$shift_fields_left=1;<br />
}<br />
else<br />
{<br />
$shift_fields_left=0;<br />
}<br />
$xml_str.="" . $item[1] . "";<br />
60
CMS für die MIO-Lernumgebung Implementierung<br />
}<br />
}<br />
$content .= "" . $item[1] . "";<br />
$element_count++;<br />
break;<br />
case "textarea_no_".$element_count:<br />
// die vor <strong>der</strong> switch-Anweisung irrtümlich geteilten Stücke (falls im<br />
// Text <strong>der</strong> Textarea "="-Zeichen vorkommen) werden wie<strong>der</strong> zusammengefügt<br />
$text = $item[1];<br />
for ($j=2;$j$field_no_to_delete))<br />
{<br />
$shift_fields_left=1;<br />
}<br />
else<br />
{<br />
$shift_fields_left=0;<br />
}<br />
// falls e<strong>in</strong> L<strong>in</strong>k e<strong>in</strong>gefügt werden soll und die Feldposition stimmt<br />
if (!empty($l<strong>in</strong>k) && $element_count == $field_pos)<br />
{<br />
$xml_str.="" . $hr_xml . $l<strong>in</strong>k . "";<br />
$content.="" . $hr_xml . $l<strong>in</strong>k . "";<br />
$element_count++;<br />
break;<br />
}<br />
// falls e<strong>in</strong> Bild e<strong>in</strong>gefügt werden soll und die Feldposition stimmt<br />
elseif (!empty($image) && $element_count == $field_pos)<br />
{<br />
$xml_str .= "" . $hr_xml . $image . "";<br />
$content .= "" . $hr_xml . $image . "";<br />
$element_count++;<br />
break;<br />
}<br />
else<br />
{<br />
$xml_str .= "" . $hr_xml . "";<br />
$content .= "" . $hr_xml . "";<br />
$element_count++;<br />
break;<br />
}<br />
case "delete_field":<br />
// falls <strong>der</strong> Zeiger auf das zu löschende Feld zeigt, wird nur <strong>der</strong><br />
// Counter erhöht und beim nächsten switch-Durchgang das nachfolgende<br />
// Feld an die aktuelle Position geschrieben<br />
$element_count++;<br />
break;<br />
// Ergänzen <strong>der</strong> xml-Str<strong>in</strong>gs<br />
$content .= "";<br />
$xml_str = "" . $xml_str . "";<br />
61
CMS für die MIO-Lernumgebung Implementierung<br />
…<br />
Falls „edit_xml.php“ über „Version erstellen“ aufgerufen wurde, wird das Dokument <strong>in</strong> <strong>der</strong><br />
Datenbank gespeichert und <strong>der</strong> XML-Str<strong>in</strong>g von Sablotron zur Ansicht (XSL-Stylesheet<br />
„content.xsl“) und nicht <strong>in</strong> e<strong>in</strong> Formular (XSL-Stylesheet „content_form.xsl“) umgewandelt.<br />
Um Sablotron verwenden zu können, muss zuerst e<strong>in</strong> neuer XSLT-Prozessor alloziiert<br />
werden. Anschliessend kann <strong>der</strong> HTML-Str<strong>in</strong>g mit E<strong>in</strong>bezug des gewünschten XSL-<br />
Stylesheets (im Beispiel „content_form.xsl“) generiert und angezeigt werden. Abschliessend<br />
s<strong>in</strong>d die alloziierten Ressourcen des XSLT-Prozessors wie<strong>der</strong> freizugeben.<br />
Die Anzeige des Templates wird vom Browser gesteuert. Damit nach Bearbeiten des<br />
Template-Formulars die Anzeige automatisch nach unten gescrollt wird, muss auf die Clientseitige<br />
Skriptsprache Java-Script zurückgegriffen werden.<br />
…<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content_form.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content_form.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
// nach Bearbeitung des Templates wird nach unten zum letzten Feld gescrollt<br />
(diese Anweisung ist nur mit e<strong>in</strong>er Browser-basierten Skriptsprache möglich)<br />
echo "";<br />
echo "{";<br />
echo "w<strong>in</strong>dow.scrollTo(0,10000000);";<br />
echo "}";<br />
echo "";<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
…<br />
Die Funktionen „select_author()” und „select_theme()” bedürfen ke<strong>in</strong>er weiteren Erklärung.<br />
Über die Funktion „<strong>in</strong>sert_l<strong>in</strong>k()“ werden <strong>in</strong> e<strong>in</strong>em Formular Auswahlfel<strong>der</strong> für die Personen,<br />
Elemente und Bil<strong>der</strong> <strong>der</strong> MIO-Umgebung generiert. Zusätzlich enthält das Formular e<strong>in</strong> Feld<br />
für die E<strong>in</strong>gabe e<strong>in</strong>er zu verl<strong>in</strong>kenden E-Mail-Adresse.<br />
Im Fall <strong>der</strong> Elemente werden diese dynamisch aus <strong>der</strong> MIO-Datenbank geladen. Pro Element<br />
wird e<strong>in</strong> Auswahlfeld generiert. So ist garantiert, dass die Auswahl jeweils alle zur Zeit<br />
vorhandenen Elemente be<strong>in</strong>haltet.<br />
…<br />
$sql_type = "select type_id, type from type";<br />
$type = $miodb->Execute($sql_type);<br />
$sql ="select elements_id,elements.type_id as<br />
type_id,type,persons_id,groups_id,title,text,forplenum,version,timestamp from elements,type<br />
62
CMS für die MIO-Lernumgebung Implementierung<br />
where elements.type_id=type.type_id";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// L<strong>in</strong>k zu Element e<strong>in</strong>fügen<br />
while (!$type->EOF)<br />
{<br />
echo "L<strong>in</strong>k zu ".$type->fields['type']." e<strong>in</strong>fügen:";<br />
echo "fields['type']."\">";<br />
echo "";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
if ($result->fields['type_id'] == $type->fields['type_id'])<br />
{<br />
echo "fields['elements_id'] . "\">" . $result-<br />
>fields['title']."";<br />
}<br />
}<br />
$result->MoveNext();<br />
$result->MoveFirst();<br />
echo "";<br />
echo "";<br />
$type->MoveNext();<br />
}<br />
echo "";<br />
echo "Bild e<strong>in</strong>fügen:";<br />
echo "";<br />
echo "";<br />
// Bil<strong>der</strong> s<strong>in</strong>d im Verzeichnis ./../files/images gespeichert<br />
$handle = opendir('./../files/images');<br />
while ($file = readdir ($handle))<br />
{<br />
if ($file != "." && $file != "..")<br />
{<br />
echo "".$file."";<br />
}<br />
}<br />
closedir($handle);<br />
…<br />
Der gewählte Inhalt wird als L<strong>in</strong>k <strong>in</strong> das aktuelle Textfeld übernommen und <strong>in</strong> e<strong>in</strong>en<br />
entsprechenden L<strong>in</strong>k-Tag e<strong>in</strong>gefügt.<br />
63
CMS für die MIO-Lernumgebung Implementierung<br />
5.4. XML, XSL und DTD<br />
Die Ausgabe <strong>der</strong> Lehrtexte im Browser basiert auf den Dateien „content.xsl“,<br />
„content_form.xsl“ und „content.dtd“ und auf dem XML-Str<strong>in</strong>g. Der XML-Str<strong>in</strong>g wird nicht<br />
als Datei gespeichert son<strong>der</strong>n „on-the-fly“ im PHP-Skript generiert.<br />
Nachdem im PHP-Skript <strong>der</strong> XML-Str<strong>in</strong>g generiert wurde, transformiert Sablotron diesen mit<br />
dem passenden XSL-Template („content_form.xsl“ für e<strong>in</strong>e Ausgabe im Formular,<br />
„content.xsl“ für e<strong>in</strong>e Anzeige des Dokuments) <strong>in</strong>s HTML-Format. Dabei werden die Regeln<br />
aus „content.dtd“ berücksichtigt. „Content.dtd“ schreibt genau vor, welche Tags wie und <strong>in</strong><br />
welcher Reihenfolge im XML-Str<strong>in</strong>g verwendet werden dürfen.<br />
Werden die Tags nicht regelkonform e<strong>in</strong>gesetzt, gibt <strong>der</strong> XSLT-Prozessor beim transformieren<br />
e<strong>in</strong>e entsprechende Fehlermeldung aus.<br />
Das gewählte XSL-Template sorgt schliesslich für e<strong>in</strong> entsprechendes Layout <strong>der</strong> Ausgabe. In<br />
„content.xsl“ und „content_form.xsl” werden die XML-Tags aus dem XML-Str<strong>in</strong>g<br />
<strong>in</strong>terpretiert und als HTML-Tags ausgegeben.<br />
In den XSL-Dateien können neben XML-Tags beliebige HTML-Tags verwendet werden.<br />
Diese übernimmt Sablotron bei <strong>der</strong> Transformation wie sie s<strong>in</strong>d.<br />
64
CMS für die MIO-Lernumgebung Proof of Concept<br />
6. Proof of Concept<br />
Im S<strong>in</strong>ne e<strong>in</strong>es „Proof of Concept“ soll nun die Implementation des MIO-Content<br />
Management Systems überprüft werden. Dazu wurde <strong>der</strong> Lehrstoff aus <strong>der</strong> Semesterarbeit<br />
von Lukas Haldemann [Hald02] zusammengefasst und für die E<strong>in</strong>gabe <strong>in</strong>s CMS <strong>in</strong> Microsoft<br />
Word aufbereitet.<br />
Die <strong>in</strong> Microsoft Word durchgeführten Formatierungen des Lehrtextes werden <strong>in</strong> den<br />
Textareas des CMS übergangen. Zeilenumbrüche und Leerzeilen werden e<strong>in</strong>s zu e<strong>in</strong>s<br />
übernommen, alle weiteren Formatierungen müssen im CMS manuell mit Hilfe <strong>der</strong><br />
verwendbaren HTML-Tags vorgenommen werden.<br />
Die Wahl des Autors und des Themas über e<strong>in</strong>e Dropdownliste garantiert e<strong>in</strong>e korrekte<br />
Verl<strong>in</strong>kung und schützt so vor falschen E<strong>in</strong>gaben.<br />
Das H<strong>in</strong>zufügen neuer Fel<strong>der</strong> ist nur am Ende <strong>der</strong> Seite möglich, um das Formular möglichst<br />
übersichtlich zu halten. Dies erweist sich nun aber als unpraktisch, da so das E<strong>in</strong>fügen<br />
zwischen an<strong>der</strong>e Fel<strong>der</strong> nicht möglich ist. Wurde e<strong>in</strong> E<strong>in</strong>trag vergessen o<strong>der</strong> soll e<strong>in</strong><br />
zusätzlicher e<strong>in</strong>gefügt werden, müssen entwe<strong>der</strong> alle Inhalte <strong>der</strong> nachfolgenden Fel<strong>der</strong><br />
umkopiert o<strong>der</strong> an den Inhalt e<strong>in</strong>es schon vorhandenen Feldes angehängt werden. Letzteres<br />
führt möglicherweise zu e<strong>in</strong>er Verän<strong>der</strong>ung <strong>der</strong> geplanten Glie<strong>der</strong>ung.<br />
Es empfiehlt sich, die notwendigen Formatierungen sofort bei E<strong>in</strong>gabe des Textes<br />
vorzunehmen.<br />
Das E<strong>in</strong>fügen und Löschen von Fel<strong>der</strong>n und das E<strong>in</strong>fügen von L<strong>in</strong>ks funktioniert tadellos.<br />
Die Normierung <strong>der</strong> Textfel<strong>der</strong>grösse lässt ke<strong>in</strong>e dynamische Anpassung an den Textumfang<br />
zu, was unter Umständen zu fehlen<strong>der</strong> Übersicht führt.<br />
Die mögliche Glie<strong>der</strong>ung mit Untertitel1 und Untertitel2 kann <strong>in</strong>nerhalb <strong>der</strong> Textfel<strong>der</strong> z.B.<br />
mit fetter, kursiver o<strong>der</strong> unterstrichener Formatierung ergänzt werden. Somit ist sie genügend<br />
vielfältig.<br />
Das CMS fügt L<strong>in</strong>ks und Bil<strong>der</strong>n jeweils am Ende des entsprechenden Textfeld<strong>in</strong>halts e<strong>in</strong>.<br />
Werden sie an an<strong>der</strong>er Stelle im Text benötigt, besteht die Möglichkeit, sie mit copy-paste zu<br />
verschieben.<br />
Als Alternative bietet sich die direkte E<strong>in</strong>gabe <strong>der</strong> L<strong>in</strong>k-Tags an. Dazu muss das Ziel-Attribut<br />
korrekt angegeben werden, sonst wird das zu verl<strong>in</strong>kende Element nicht gefunden.<br />
Bei syntaktisch unkorrekter Verwendung <strong>der</strong> verfügbaren HTML-Tags wird vom System e<strong>in</strong>e<br />
entsprechende Fehlermeldung angezeigt.<br />
Falls dies passiert, ist mit dem „Zurück“-Knopf des Browsers die letzte Aktion rückgängig zu<br />
machen und die Syntax zu korrigieren.<br />
Bei Übernahme von Textteilen aus an<strong>der</strong>en Quellen mittels „copy-paste“ mussten Satzzeichen<br />
wie Anführungszeichen und B<strong>in</strong>destrich ersetzt, d.h. direkt über die Tastatur e<strong>in</strong>gegeben<br />
werden.<br />
Diese Zeichen konnten vom XSLT-Prozessor nicht übersetzt werden, was zu e<strong>in</strong>er<br />
Fehlermeldung führte.<br />
E<strong>in</strong>fache Anführungszeichen konnten aufgrund datenbanktechnischer Gründe nicht verwendet<br />
werden, weil sie beim Speichern falsch <strong>in</strong>terpretiert wurden.<br />
65
CMS für die MIO-Lernumgebung Proof of Concept<br />
Der Editier-Modus lässt <strong>in</strong> Textfel<strong>der</strong>n die Tags von Tabellen und Listen jeweils e<strong>in</strong>gerückt<br />
und mit Zeilenumbrüchen darstellen, was systembed<strong>in</strong>gt (Sablotron) ist.<br />
Bei <strong>der</strong> Ausgabe <strong>der</strong> Dokumente werden Tabellen und Listen mit vorangehenden Leerzeilen<br />
dargestellt, was ebenso auf die Interpretation von Sablotron zurückzuführen ist. Dies konnte<br />
nicht umgangen werden.<br />
Ob e<strong>in</strong>e Ergänzung <strong>der</strong> verwendbaren HTML-Tags durch weitere nötig ist, wird sich <strong>in</strong> <strong>der</strong><br />
Praxis zeigen.<br />
Grundsätzlich empfiehlt sich, vor Gebrauch des CMS die Bedienungsanleitung sorgfältig<br />
durchzulesen, um möglichen Fehlerquellen vorzubeugen.<br />
Die kritisierten Punkte beziehen sich mehrheitlich auf die Client-Seite. Deren Lösung könnte<br />
somit nicht mit Hilfe e<strong>in</strong>er Server-seitigen Scriptsprache wie PHP, son<strong>der</strong>n müsste mit e<strong>in</strong>er<br />
Client-seitigen Skriptsprache wie Javascript gefunden werden.<br />
Das Proof of Concept hat gezeigt, dass abgesehen von kle<strong>in</strong>eren Mängeln das MIO-Content<br />
Management System e<strong>in</strong> flexibles, funktionstüchtiges Tool darstellt, welches hält, was es<br />
verspricht.<br />
Aufgrund <strong>der</strong> Flexibilität des CMS-Tools erübrigt sich die Entwicklung weiterer XSL-<br />
Stylesheets zwar weitgehend, doch ist <strong>der</strong> Preis dafür e<strong>in</strong>e mögliche Unübersichtlichkeit <strong>der</strong><br />
Darstellung aufgrund <strong>der</strong> nicht dynamisch verän<strong>der</strong>baren Textfeldgrössen.<br />
66
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
7. Benutzerdokumentation<br />
7.1. E<strong>in</strong>führung<br />
Was ist das Content Management System (CMS)?<br />
Das CMS unterstützt die Verfasser von Lehrtexten (folgend Dokument genannt) für die MIO-<br />
Lernumgebung bei ihrer Arbeit.<br />
Die E<strong>in</strong>gabe <strong>der</strong> Lehrtexte erfolgt über e<strong>in</strong> Formular, welches dynamisch durch den Verfasser<br />
verän<strong>der</strong>t werden kann und so e<strong>in</strong>e flexible Umgebung zur Verfügung stellt.<br />
Die Lehrtexte können ähnlich wie <strong>in</strong> e<strong>in</strong>er Textverarbeitung manipuliert und zusätzlich durch<br />
e<strong>in</strong>e Auswahl an HTML-Tags ergänzt werden.<br />
Was braucht man zur Nutzung?<br />
Je nach vorhandenen Benutzerrechten ist die Auswahl <strong>der</strong> editierbaren Texte mehr o<strong>der</strong><br />
weniger e<strong>in</strong>geschränkt.<br />
Über den Menüpunkt "CMS" <strong>in</strong> <strong>der</strong> Menüleiste <strong>der</strong> MIO-Lernumgebung kann auf das System<br />
zugegriffen werden.<br />
67
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
7.2. Bedienung<br />
7.2.1. Hauptfenster<br />
Nach dem Start des CMS präsentiert sich die Hauptseite als e<strong>in</strong> <strong>in</strong> zwei Frames aufgeteiltes<br />
Fenster, von welchen <strong>der</strong> obere die Navigations- und <strong>der</strong> untere den Contentbereich<br />
be<strong>in</strong>haltet. Im Contentbereich wird jeweils <strong>der</strong> gewünschte Inhalt angezeigt.<br />
Abb. 22: Screenpr<strong>in</strong>t Hauptfenster<br />
68
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
7.2.2. Funktionen<br />
Die Menüleiste des Navigationsbereichs be<strong>in</strong>haltet die Funktionen Ansicht, Erstellen,<br />
Editieren, Prüfen von Content, Verwalten <strong>der</strong> Metadaten und Archiv-Ansicht.<br />
Im Folgenden werden diese Funktionen erklärt.<br />
Funktion Ansicht<br />
Über die Ansicht können die aktuellen Versionen <strong>der</strong> Dokumente angeschaut werden, sofern<br />
die benötigten Rechte vorhanden s<strong>in</strong>d.<br />
Das Anwählen des "Ansicht"-L<strong>in</strong>ks öffnet e<strong>in</strong> Auswahlfenster mit den vorhandenen Klassen.<br />
Nach Auswahl <strong>der</strong> gewünschten Klasse und <strong>der</strong> anschliessenden Bestätigung über den „ok“-<br />
Knopf öffnet sich e<strong>in</strong> weiteres Auswahlfenster, welches die aktuellen Versionen <strong>der</strong><br />
Dokumente zu dieser Klasse auflistet. Jede Zeile enthält Titel, Autor, Thema, Version und<br />
Erstellungsdatum des jeweiligen Dokuments.<br />
Ist e<strong>in</strong>e Wahl getroffen, wird nach Betätigung des "ok"-Knopfs das gewünschte Dokument<br />
angezeigt.<br />
Abb. 23: Screenpr<strong>in</strong>t Ansicht<br />
69
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Funktion Erstellen<br />
Das Erstellen e<strong>in</strong>es neuen Dokuments wird über den Menüpunkt "Erstellen" ermöglicht. Die<br />
E<strong>in</strong>gabe erfolgt <strong>in</strong> e<strong>in</strong>em Standard-Formular, <strong>in</strong> welchem die drei Fel<strong>der</strong> "Haupttitel", "Autor"<br />
und "Thema" vorgegeben s<strong>in</strong>d.<br />
Abb. 24: Screenpr<strong>in</strong>t Erstellen<br />
Die E<strong>in</strong>träge dieser Fel<strong>der</strong> s<strong>in</strong>d Pflicht, wobei die direkte E<strong>in</strong>gabe gesperrt ist. Durch<br />
Betätigung <strong>der</strong> Knöpfe "Autor wählen" resp. "Thema wählen" werden Auswahlfel<strong>der</strong><br />
angezeigt. Diese be<strong>in</strong>halten die vorhandenen E<strong>in</strong>träge für die Fel<strong>der</strong> „Autor“ und „Thema“.<br />
70
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Zusätzlich zur Wahl vorhandener Themen können neue Themen aufgenommen und über den<br />
„Speichern“-Knopf <strong>in</strong> die Datenbank geschrieben werden. E<strong>in</strong> neuer Autor muss über die<br />
Lernumgebung e<strong>in</strong>gegeben werden.<br />
Abb. 25: Screenpr<strong>in</strong>t Thema wählen<br />
Nach Bestätigung über den "ok"-Knopf wird die Wahl <strong>in</strong> das entsprechende Feld übernommen.<br />
71
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Im Formular besteht die Möglichkeit, weitere Fel<strong>der</strong> zu den vorhandenen h<strong>in</strong>zuzufügen:<br />
Untertitel1 (Untertitel <strong>der</strong> Grösse 1, fett),<br />
Untertitel2 (Untertitel <strong>der</strong> Grösse 2) und<br />
Textarea<br />
Diese zusätzlichen Fel<strong>der</strong> können <strong>in</strong> beliebiger Anzahl und Reihenfolge e<strong>in</strong>gefügt werden.<br />
Jedes Feld kann je<strong>der</strong>zeit durch den nebenstehenden Knopf "Löschen" wie<strong>der</strong> entfernt<br />
werden, wobei die E<strong>in</strong>gaben im entsprechenden Feld verloren gehen.<br />
Wurde e<strong>in</strong> "Löschen"-Knopf versehentlich betätigt, besteht die Möglichkeit, über den<br />
"Zurück"-Knopf des Browsers, die Än<strong>der</strong>ung rückgängig zu machen.<br />
Abb. 26: Screenpr<strong>in</strong>t Untertitel1, Untertitel2 und Textarea<br />
72
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Erklärungen zum Feld Textarea:<br />
Die E<strong>in</strong>gabe <strong>in</strong> e<strong>in</strong>e Textarea erfolgt ähnlich wie <strong>in</strong> e<strong>in</strong>er Textverarbeitung. Das Betätigen <strong>der</strong><br />
Enter-Taste bewirkt e<strong>in</strong>en Zeilenumbruch, Leerzeichen und -zeilen können beliebig e<strong>in</strong>gefügt<br />
werden und Umlaute werden als ä, ö und ü und nicht etwa als ü etc. geschrieben.<br />
W I C H T I G:<br />
Bei Übernahme von Textteilen aus e<strong>in</strong>er an<strong>der</strong>en Quelle mittels „copy-paste“ ist darauf zu<br />
achten, dass Satzzeichen wie „Anführungszeichen“ und „B<strong>in</strong>destrich“ ersetzt, d.h. direkt über<br />
die Tastatur e<strong>in</strong>gegeben werden, da diese teilweise vom XSLT-Prozessor nicht <strong>in</strong>terpretiert<br />
werden können. Dies führt zu e<strong>in</strong>er Fehlermeldung.<br />
„E<strong>in</strong>fache Anführungszeichen“ können aufgrund datenbanktechnischer Gründe nicht<br />
verwendet werden.<br />
Um den Text weiter zu formatieren, können HTML-Tags verwendet werden.<br />
Folgende stehen zur Auswahl:<br />
• Tabelle: mit den Tags , und <br />
• Listen: mit dem Tag <br />
mit dem Tag <br />
• Fett: <br />
• Kursiv: <br />
• Unterstrichen: <br />
• Trennstrich: <br />
• Umbruch: (wie Enter-Taste)<br />
Alle verwendbaren HTML-Elemente (ausser und ) bestehen aus e<strong>in</strong>em e<strong>in</strong>leitenden<br />
und e<strong>in</strong>em abschliessenden Tag.<br />
W I C H T I G:<br />
Die Tags dürfen nur mit den hier angegebenen Attributen verwendet werden! Sie müssen<br />
richtig (d.h. syntaktisch korrekt) e<strong>in</strong>gegeben werden! Ansonsten besteht die Gefahr, dass die<br />
Übersetzung des XML-Str<strong>in</strong>gs fehlschlägt und das Dokument fehlerhaft o<strong>der</strong> gar nicht<br />
angezeigt wird. In diesem Fall gibt <strong>der</strong> XML-Parser e<strong>in</strong>e Fehlermeldung aus:<br />
73
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Abb. 27: Screenpr<strong>in</strong>t Syntaktisch unkorrekte Tag-E<strong>in</strong>gabe<br />
Dem Benutzer muss bewusst se<strong>in</strong>, dass sich <strong>der</strong> Text <strong>in</strong> den Textfel<strong>der</strong>n wie <strong>in</strong> <strong>der</strong> Textverarbeitung<br />
verhält, d.h. je<strong>der</strong> Zeilenumbruch nach e<strong>in</strong>em HTML-Tag wird auch als solcher<br />
vom XML-Parser <strong>in</strong>terpretiert und angezeigt.<br />
Der Editier-Modus lässt <strong>in</strong> Textfel<strong>der</strong>n die Tags von Tabellen und Listen jeweils e<strong>in</strong>gerückt<br />
und mit Zeilenumbrüchen darstellen (systembed<strong>in</strong>gt).<br />
74
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Abb. 28: Screenpr<strong>in</strong>t E<strong>in</strong>gerückte Listen- und Tabellen-Tags <strong>in</strong> <strong>der</strong> Textarea<br />
Über den Knopf "L<strong>in</strong>k/Bild e<strong>in</strong>fügen" können L<strong>in</strong>k-Tags e<strong>in</strong>gefügt werden. Zuerst öffnet<br />
sich e<strong>in</strong> Fenster mit folgenden Auswahlfel<strong>der</strong>n:<br />
• L<strong>in</strong>k zu Person e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Mikroartikel e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Autor e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Literaturquelle e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Zitat e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Rezension e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu L<strong>in</strong>k e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Buch e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Teilnehmer e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Mentoren e<strong>in</strong>fügen:<br />
• L<strong>in</strong>k zu Referenten e<strong>in</strong>fügen:<br />
• Bild e<strong>in</strong>fügen:<br />
Zusätzlich ist e<strong>in</strong> E<strong>in</strong>gabefeld für e<strong>in</strong>en E-Mail-Adressen-L<strong>in</strong>k und e<strong>in</strong>es für e<strong>in</strong>en WWW-<br />
L<strong>in</strong>k vorhanden:<br />
• L<strong>in</strong>k zu E-Mail-Adresse e<strong>in</strong>fügen:<br />
(z.B. hans.muster@muster.com)<br />
• WWW-L<strong>in</strong>k e<strong>in</strong>fügen:<br />
(z.B. http://www.muster.com)<br />
75
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Abb. 29: Screenpr<strong>in</strong>t L<strong>in</strong>k/Bild e<strong>in</strong>fügen<br />
Die Inhalte dieser Auswahlfel<strong>der</strong> müssen über die Lernumgebung e<strong>in</strong>gegeben werden.<br />
Die Auswahl aus e<strong>in</strong>em <strong>der</strong> Auswahlfel<strong>der</strong> muss mit Betätigung des entsprechenden "ok"-<br />
Knopfs bestätigt werden.<br />
76
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
L<strong>in</strong>ks wird am Ende des Textfeldes e<strong>in</strong>gefügt und nicht etwa dort, wo <strong>der</strong> Cursor steht.<br />
Es kann gleichzeitig nur e<strong>in</strong> L<strong>in</strong>k übertragen werden. Deshalb muss darauf geachtet werden,<br />
dass nur im gewünschten Feld e<strong>in</strong> E<strong>in</strong>trag ausgewählt wird und die übrigen Fel<strong>der</strong> leer<br />
bleiben. Dieser Vorgang kann beliebig oft wie<strong>der</strong>holt werden.<br />
Abb. 30: Screenpr<strong>in</strong>t Textarea-E<strong>in</strong>trag<br />
Um fehlerhafte Syntax zu vermeiden, sollten die <strong>in</strong> <strong>der</strong> Textarea e<strong>in</strong>gefügten L<strong>in</strong>k-Tags nicht<br />
mehr verän<strong>der</strong>t werden.<br />
Das System erlaubt, die L<strong>in</strong>k-Tags direkt <strong>in</strong> das Textfeld e<strong>in</strong>zugeben. Aufgrund des Risikos<br />
e<strong>in</strong>er falschen Verl<strong>in</strong>kung (falsche Zielangabe o<strong>der</strong> unkorrekte Syntax <strong>der</strong> Tags) ist dies aber<br />
i.a. nicht zu empfehlen.<br />
Ist e<strong>in</strong> L<strong>in</strong>k-Tag im Text nicht mehr erwünscht, kann es wie normaler Text gelöscht werden.<br />
Dabei sollte darauf geachtet werden, dass das End-Tag (z.B. "", erkennbar durch den<br />
vorangestellten Schrägstrich im Tag) mitgelöscht wird.<br />
77
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
S<strong>in</strong>d alle E<strong>in</strong>träge gemacht, wird das Dokument über den Knopf "Version erstellen"<br />
gespeichert und angezeigt.<br />
Abb. 31: Screenpr<strong>in</strong>t Ausgabe<br />
Falls e<strong>in</strong> Dokument mit den gleichen Angaben <strong>in</strong> den Fel<strong>der</strong>n "Haupttitel", "Autor" und<br />
"Thema" schon <strong>in</strong> <strong>der</strong> Datenbank vorhanden ist, wird es durch das aktuelle nicht<br />
überschrieben, son<strong>der</strong>n als neue Version abgespeichert. Ansonsten wird e<strong>in</strong>e Version 1<br />
erstellt.<br />
Die neue Version erhält automatisch den Vermerk "zu prüfen".<br />
Jedes Betätigen e<strong>in</strong>es Knopfs bewirkt, dass die aktuelle Seite neu übersetzt und wie<strong>der</strong><br />
angezeigt wird. Schlägt die Transformation fehl (z.B. aufgrund <strong>der</strong> Verwendung fehlerhafter<br />
Tags), wird die neu übersetzte Seite fehlerhaft o<strong>der</strong> gar nicht angezeigt. Durch Betätigung<br />
des „Zurück“-Knopfs des Browsers kann die Aktion rückgängig gemacht und die Ursache<br />
des Fehlschlagens eruiert werden. Nachdem <strong>der</strong> Fehler korrigiert wurde, kann die gewünschte<br />
Aktion erneut ausgeführt werden.<br />
78
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Funktion Editieren<br />
Schon erstellte Dokumente können über den Menüpunkt "Editieren" neu bearbeitet werden.<br />
Nachdem zuerst wie<strong>der</strong>um die gewünschte Klasse ausgewählt wurde, werden<br />
im Auswahlfenster alle aktuellen Dokumente aufgelistet. Jede Zeile enthält Titel, Autor,<br />
Thema, Version und Erstellungsdatum des jeweiligen Dokuments. Diejenigen Dokumente,<br />
die gerade von an<strong>der</strong>en Benutzern bearbeitet werden, ersche<strong>in</strong>en <strong>in</strong> <strong>der</strong> Auswahlliste mit dem<br />
Vermerk "gesperrt" und können zur Zeit nicht editiert werden.<br />
Ist e<strong>in</strong>e Wahl getroffen, wird nach Betätigung des "ok"-Knopfs das gewünschte Dokument als<br />
Formular angezeigt. Gleichzeitig wird es für an<strong>der</strong>e Benutzer gesperrt.<br />
Die Seite des Dokuments be<strong>in</strong>haltet die Standardfel<strong>der</strong> „Haupttitel“, „Autor“ und „Thema“<br />
mit etwaigen zusätzlich e<strong>in</strong>gefügten Fel<strong>der</strong>n und <strong>der</strong>en Inhalt, welcher wie gehabt bearbeitet<br />
werden kann.<br />
Für Erklärungen zur Bedienung dieser Seite siehe 2.2.2. Erstellen.<br />
Die Sperrung e<strong>in</strong>es Dokuments für an<strong>der</strong>e wird erst aufgehoben, wenn es vom Benutzer als<br />
neue Version abgespeichert wird. Falls dieser also vor dem Abspeichern e<strong>in</strong> weiteres<br />
Dokument o<strong>der</strong> e<strong>in</strong>e Seite ausserhalb des CMS aufrufen würde, müsste er mit dem „Zurück“-<br />
Knopf des Browsers zurückspr<strong>in</strong>gen und die Bearbeitung korrekt abschliessen.<br />
An<strong>der</strong>nfalls bliebe dieses Dokument <strong>in</strong> <strong>der</strong> Datenbank als „gesperrt“ gekennzeichnet<br />
und könnte nicht mehr editiert werden. In diesem Fall müsste <strong>der</strong> Adm<strong>in</strong>istrator<br />
benachrichtigt werden.<br />
79
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Funktion Prüfen<br />
Soll e<strong>in</strong> erstelltes o<strong>der</strong> verän<strong>der</strong>tes Dokument veröffentlicht werden, ist es notwendig, dieses<br />
vorher durch kompetente Stellen prüfen zu lassen. Der Prüfer entscheidet, ob das Dokument<br />
freigegeben wird o<strong>der</strong> nochmals überarbeitet werden muss. Im letzteren Fall benachrichtigt er<br />
den Redakteur des Dokuments und teilt ihm die notwendigen Än<strong>der</strong>ungen mit.<br />
Nach Auswahl <strong>der</strong> Klasse stehen <strong>in</strong> <strong>der</strong> Auswahlliste diejenigen Dokumente, welche als "zu<br />
prüfen" markiert s<strong>in</strong>d. Wie beim "Editieren" (siehe 2.2.3. Funktion Editieren) s<strong>in</strong>d diejenigen<br />
Dokumente, die gerade von an<strong>der</strong>en Benutzern bearbeitet werden, als "gesperrt" gekennzeichnet<br />
und stehen im Moment nicht zur Verfügung.<br />
Nach Betätigen des "ok"-Knopfs wird das gewählte Dokument angezeigt.<br />
Am Ende <strong>der</strong> Seite kann über e<strong>in</strong>e Radio-Box-Auswahl das Dokument zur Veröffentlichung<br />
freigegeben o<strong>der</strong> abgelehnt werden. Zur Bestätigung wird <strong>der</strong> "ok"-Knopf gedrückt.<br />
Abb. 32: Screenpr<strong>in</strong>t Genehmigen/Ablehnen<br />
80
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Metadaten verwalten<br />
Metadaten s<strong>in</strong>d Informationen über e<strong>in</strong> Dokument. Sie beschreiben es nach formalen und<br />
<strong>in</strong>haltlichen Aspekten. Dazu gehören <strong>in</strong> unserem Fall:<br />
• Haupttitel<br />
• Autor<br />
• Thema<br />
• Version<br />
• Status<br />
• Erstellungsdatum<br />
• Gruppe mit Editierberechtigung<br />
• Gruppe mit Leseberechtigung<br />
• Klasse<br />
Diese Angaben können unabhängig vom Content (Inhalt) des Dokuments je<strong>der</strong>zeit angeschaut<br />
und bearbeitet werden.<br />
S<strong>in</strong>d die notwendigen Berechtigungen vorhanden, können über die Auswahlliste und<br />
anschliessendes Betätigen des "ok"-Knopfs die Metadaten des gewünschten Dokuments <strong>der</strong><br />
zuvor gewählten Klasse aufgerufen werden.<br />
Auch hier s<strong>in</strong>d diejenigen Dokumente, die zur Zeit von an<strong>der</strong>en Benutzern bearbeitet werden,<br />
als "gesperrt" gekennzeichnet und stehen nicht zur Verfügung. Die Metadaten älterer<br />
Versionen <strong>der</strong> Dokumente können nicht mehr bearbeitet werden.<br />
81
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Das sich öffnende Formular enthält die weiter oben aufgelisteten Informationen über das<br />
gewählte Dokument.<br />
Abb. 33: Screenpr<strong>in</strong>t Metadaten<br />
Mit dem Manipulieren von Metadaten sollte vorsichtig umgegangen werden. Um Inkonsistenz<br />
zwischen verschiedenen Versionen <strong>der</strong> Dokumente zu vermeiden, s<strong>in</strong>d die Fel<strong>der</strong> „Version“<br />
und „Erstellungsdatum“ schreibgeschützt.<br />
Über den "ok"-Knopf werden die Än<strong>der</strong>ungen zurück <strong>in</strong> die Datenbank geschrieben.<br />
82
CMS für die MIO-Lernumgebung Benutzerdokumentation<br />
Archiv<br />
Über den Menüpunkt "Archiv" werden dem Benutzer sämtliche archivierte Versionen <strong>der</strong><br />
Dokumente e<strong>in</strong>er gewählten Klasse zur Verfügung gestellt.<br />
Die Versionierung dokumentiert die Verän<strong>der</strong>ungen <strong>der</strong> Dokumente, da diese nach jedem<br />
Editieren als neue Version abgespeichert werden (siehe 2.2.1. Erstellen).<br />
Ist das gewünschte Dokument ausgewählt, wird es nach Betätigung des "ok"-Knopfs angezeigt.<br />
83
CMS für die MIO-Lernumgebung Zusammenfassung und Ausblick<br />
8. Zusammenfassung und Ausblick<br />
In <strong>der</strong> folgenden Zusammenfassung werden die wichtigsten Ergebnisse aufgeführt und die<br />
aufgetretenen Probleme erörtert.<br />
Der anschliessende Ausblick soll zu Überlegungen für etwaige zukünftige Erweiterungen des<br />
Tools anregen.<br />
8.1. Zusammenfassung<br />
Die Ergebnisse <strong>der</strong> Arbeit s<strong>in</strong>d e<strong>in</strong>e funktionstüchtige Implementation e<strong>in</strong>es Content<br />
Management Systems, e<strong>in</strong>e Ausarbeitung e<strong>in</strong>er Dokumentation und e<strong>in</strong>er beispielhaften<br />
Lehre<strong>in</strong>heit sowie e<strong>in</strong>er Bedienungsanleitung.<br />
Die Implementation des CMS erfüllt die Erwartungen bzgl. Funktionalität und Flexibilität.<br />
Die Ausarbeitung <strong>der</strong> Dokumentation führt genügend <strong>in</strong> die Thematik und die verwendeten<br />
Technologien e<strong>in</strong>, so dass sie für das Verständnis des Projekts und <strong>der</strong> Funktionsweise, die<br />
Wartung und die Erweiterung des Systems ausreicht.<br />
Die Bedienungsanleitung ist klar verständlich und bedarf ke<strong>in</strong>en Vorkenntnissen über das<br />
System.<br />
Das Ziel <strong>der</strong> Arbeit ist somit erreicht worden.<br />
Zu Problemen führte das E<strong>in</strong>richten <strong>der</strong> Arbeitsumgebung auf e<strong>in</strong>em W<strong>in</strong>dows 2000 System.<br />
Bis zum Schluss war es nicht möglich, die Konfiguration <strong>der</strong> verwendeten PHP-Version auf<br />
die <strong>in</strong>stallierte MIO-Umgebung abzustimmen.<br />
Somit musste das CMS ohne E<strong>in</strong>bezug <strong>der</strong> Umgebung entwickelt und am Ende auf dem MIO-<br />
Server am Institut für Informatik <strong>in</strong> die MIO-Umgebung e<strong>in</strong>gebunden werden. Dies führte<br />
dazu, dass jegliche Überlegungen bzgl. Zugangsberechtigung erst am Schluss umgesetzt und<br />
auf dem MIO-Server <strong>in</strong>tegriert und getestet werden konnten, was schliesslich aufgrund<br />
unvorhergesehener Probleme mit dem auf dem MIO-Server <strong>in</strong>stallierten XSLT-Prozessor<br />
Sablotron zu erheblichem Zeitdruck führte.<br />
Sablotron <strong>in</strong>terpretierte den XSL-Code teilweise an<strong>der</strong>s wie <strong>der</strong> auf <strong>der</strong> eigenen Umgebung<br />
<strong>in</strong>stallierte XT [Javaxt]. Somit mussten die XSL-Templates nochmals überarbeitet werden.<br />
8.2. Ausblick<br />
Das CMS-Tool kann <strong>in</strong> se<strong>in</strong>er Funktionalität beliebig erweitert werden.<br />
Weitere Anfor<strong>der</strong>ungen des „state of the art“ können realisiert und e<strong>in</strong>gebunden werden.<br />
So wäre z.B. die Erweiterung um e<strong>in</strong>e L<strong>in</strong>k-Management-Funktion weitere Überlegungen<br />
wert.<br />
Weitere Ausgabe-Formate neben HTML s<strong>in</strong>d zukünftig wahrsche<strong>in</strong>lich notwendig (z.B. PDF,<br />
WML etc.), was sich durch ger<strong>in</strong>gfügige Än<strong>der</strong>ungen <strong>der</strong> Skripte leicht realisieren lässt.<br />
Ebenso besteht die Möglichkeit das vorhandene Template durch weitere zu ergänzen.<br />
Bezüglich Formatierungsmöglichkeiten <strong>der</strong> Lehrtexte ist zu überlegen, ob weitere Tags<br />
e<strong>in</strong>geführt werden sollten.<br />
84
CMS für die MIO-Lernumgebung Zusammenfassung und Ausblick<br />
Eventuell ist e<strong>in</strong> Parser e<strong>in</strong>zub<strong>in</strong>den, <strong>der</strong> den vom Benutzer formatierten Text auf XML-<br />
Konformität prüft und automatisch korrigiert.<br />
Bil<strong>der</strong> werden vorerst aus e<strong>in</strong>em Bildverzeichnis geladen. In e<strong>in</strong>er weiteren Version sollte es<br />
<strong>in</strong> die Datenbank <strong>in</strong>tegriert werden.<br />
85
CMS für die MIO-Lernumgebung Literaturverzeichnis<br />
9. Literaturverzeichnis<br />
[Apache] Apache: http://www.apache.org<br />
[Cmseva] Content Management System Evaluation:<br />
http://www.atnf.csiro.au/comput<strong>in</strong>g/web/cms_eval.html<br />
[Contma] Contentmanager.de: Content Management, www.contentmanager.de<br />
[Ditt99] Dittrich Prof.Dr.K.: Datenbanksysteme - Skript zur Vorlesung, Institut für<br />
Informatik, <strong>Universität</strong> <strong>Zürich</strong>, WS 99/00<br />
[Ecks00] Eckste<strong>in</strong> R.:XML-kurz und gut, O’Reilly, 2000<br />
[Gl<strong>in</strong>00] Gl<strong>in</strong>z, Prof.Dr.M.: Requirements Eng<strong>in</strong>eer<strong>in</strong>g - Skript zur Vorlesung,<br />
Institut für Informatik, <strong>Universität</strong> <strong>Zürich</strong>, WS 00/01<br />
[Gl<strong>in</strong>98] Gl<strong>in</strong>z, Prof.Dr.M.: Software Eng<strong>in</strong>eer<strong>in</strong>g I – Skript zur Vorlesung,<br />
Institut für Informatik,<strong>Universität</strong> <strong>Zürich</strong>, WS 98/99<br />
[Hald02] Haldemann L.: <strong>Metaphern</strong> <strong>in</strong> <strong>der</strong> <strong>Führung</strong> von komplexen IT-Projekten –<br />
Semesterarbeit, Institut für Informatik, <strong>Universität</strong> <strong>Zürich</strong>, 2002<br />
[Idccom] IDC: The Learn<strong>in</strong>g Content Management System -<br />
White Paper http://www.idc.com<br />
[Intern] InternetTime: http://www.<strong>in</strong>ternettime.com<br />
[Javaxt] Java XSLT-Prozessor: http://jclark.com/xml/xt.html<br />
[Kaeg02] Kägi U.: Entwicklung e<strong>in</strong>es Tools für die Kundenadm<strong>in</strong>istration <strong>in</strong> <strong>der</strong> MIO -<br />
Lernumgebung - Semesterarbeit, Institut für Informatik, <strong>Universität</strong> <strong>Zürich</strong>, 2002<br />
[KrKo02] Krüger J. D., Kopp M.: Web Content managen, Markt u.Technik, 2002<br />
[Lagl02] Lagler S.: MIO-Lernlandschaft – Semesterarbeit, Institut für Informatik,<br />
<strong>Universität</strong> <strong>Zürich</strong>, 2002<br />
[Mahl02] Mahler M.: MIO-Lernlandschaft – Semesterarbeit, Institut für Informatik,<br />
<strong>Universität</strong> <strong>Zürich</strong>, 2002<br />
[Midgar] Midgard – Open Source Content Management System:<br />
http://www.midgard-project.org<br />
[Mysqlc] MySQL: http://www.mysql.com<br />
[Netcra] Netcraft: http://www.netcraft.com<br />
[Nier02] Nierlich M.: Authorisationskonzept <strong>der</strong> MIO-Lernumgebung –<br />
Semesterarbeit Institut für Informatik, <strong>Universität</strong> <strong>Zürich</strong>, 2002<br />
86
CMS für die MIO-Lernumgebung Literaturverzeichnis<br />
[Nohr00] Nohr H.: Content Management – Die E<strong>in</strong>führung von Content<br />
Management Systemen, Fachhochschule Stuttgart, 2000<br />
http://www.hbi-stuttgart.de/nohr<br />
[P<strong>in</strong>uts] P<strong>in</strong>uts.de: Content Management,<br />
http://www.p<strong>in</strong>uts.de/ie/cms/content_management_systeme/<strong>in</strong>dex.html,<br />
White Paper http://www.p<strong>in</strong>uts.de/ie/WP_CMS_E<strong>in</strong>fuehrung.pdf<br />
[Phpcen] Onl<strong>in</strong>e-Tutorial: http://www.php-center.de<br />
[Phpmya] PhpMyAdm<strong>in</strong>: http://www.phpmyadm<strong>in</strong>.org<br />
[Phpnet] Onl<strong>in</strong>e-Tutorial: http://www.php.net<br />
[RoRi01] Rothfuss G., Ried C.: Content Management mit XML - Grundlagen und<br />
Anwendungen, Spr<strong>in</strong>ger, 2001<br />
[Selfxm] Onl<strong>in</strong>e-Tutorial: http://www.selfxml.de<br />
[Shep02] Shepherd, Devan: XML, Markt u.Technik, 2002<br />
[Typo3c] Typo3 - Open Source Content Management System:<br />
http://www.typo3.com<br />
[We<strong>in</strong>00] Internet Professionell, Ausgabe 07/2000, We<strong>in</strong>ste<strong>in</strong> A.:<br />
Inhalte effektiv verwalten<br />
[Xmlgur] Onl<strong>in</strong>e-Tutorial: http://www.xmlguru.de<br />
[Zoporg] Zope – Open Source Content Management System: http://www.zope.org<br />
[ZsTr01] Zschau O., Traub D., et al.: Web Content Management –<br />
Websites professionell planen und betreiben, Galileo Bus<strong>in</strong>ess, 2002<br />
87
CMS für die MIO-Lernumgebung <strong>Anhang</strong> A<br />
<strong>Anhang</strong> A: Tabellen<br />
metadata<br />
metadata_id <strong>in</strong>t<br />
title text<br />
lock <strong>in</strong>t<br />
version <strong>in</strong>t<br />
date date<br />
*content_type text<br />
persons_id <strong>in</strong>t<br />
themes_id <strong>in</strong>t<br />
classes_id <strong>in</strong>t<br />
state_id <strong>in</strong>t<br />
edit_group_id <strong>in</strong>t<br />
check_group_id <strong>in</strong>t<br />
Tab. 12: Metadata<br />
content<br />
content_id <strong>in</strong>t<br />
content text<br />
metadata_id <strong>in</strong>t<br />
Tab. 13: Content<br />
state<br />
state_id <strong>in</strong>t<br />
state text<br />
Tab. 14: State<br />
groups_persons<br />
groups_persons_id <strong>in</strong>t<br />
groups_id <strong>in</strong>t<br />
persons_id <strong>in</strong>t<br />
Tab. 15: Groups_persons [Lagl02]<br />
classes_groups<br />
classes_groups_id <strong>in</strong>t<br />
classes_id <strong>in</strong>t<br />
groups_id <strong>in</strong>t<br />
Tab. 16: Classes_groups [Lagl02]<br />
88
CMS für die MIO-Lernumgebung <strong>Anhang</strong> A<br />
classes<br />
classes _id <strong>in</strong>t<br />
classname varchar<br />
classdesc text<br />
Tab. 17: Classes [Lagl02]<br />
groups<br />
groups_id <strong>in</strong>t<br />
groupname varchar<br />
groupsdesc text<br />
Tab. 18: Groups [Lagl02]<br />
themes<br />
themes_id <strong>in</strong>t<br />
*comment text<br />
theme varchar<br />
Tab. 19: Themes [Lagl02]<br />
persons<br />
persons_id <strong>in</strong>t<br />
person_firstname varchar<br />
person_name varchar<br />
password varchar<br />
street varchar<br />
areacode varchar<br />
city varchar<br />
email_address varchar<br />
phone_number varchar<br />
fax_number varchar<br />
birthday date<br />
Tab. 20: Persons [Lagl02]<br />
89
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
<strong>Anhang</strong> B: <strong>Metaphern</strong> <strong>in</strong> <strong>der</strong> <strong>Führung</strong> <strong>komplexer</strong> IT-Projekte<br />
[Hald02] aufbereitet als Lehre<strong>in</strong>heit<br />
<strong>Metaphern</strong> <strong>in</strong> <strong>der</strong> <strong>Führung</strong> <strong>komplexer</strong> IT-Projekte<br />
1. E<strong>in</strong>leitung<br />
In <strong>der</strong> Praxis ist vielfach zu beobachten, dass Informatikprojekte verzögert werden o<strong>der</strong> sogar<br />
scheitern, weil zwischenmenschliche Probleme im Projektteam auftreten.<br />
Im Folgenden soll die aktuelle Situation bzgl. <strong>der</strong> <strong>Führung</strong> von komplexen IT-Projekten aus<br />
Sicht <strong>der</strong> Praxis analysiert und sich stellende Probleme aufgezeigt werden. Des weiteren<br />
werden <strong>Führung</strong>sansätze untersucht, welche IT-Projekte als soziale Systeme betrachten. Vor<br />
diesem H<strong>in</strong>tergrund werden <strong>Metaphern</strong> vorgestellt und bzgl. <strong>der</strong>en situationsbezogener<br />
Anwendung bewertet.<br />
2. Analyse <strong>der</strong> Situation <strong>der</strong> <strong>Führung</strong> <strong>komplexer</strong> IT-Projekte<br />
2.1. Aktuelle Situation<br />
E<strong>in</strong>e Umfrage bei vier Projektverantwortlichen <strong>in</strong> drei Schweizer Unternehmen ergab<br />
Aufschluss über die aktuelle Situation:<br />
Die Erfolgsquote <strong>der</strong> IT-Projekte genügt nicht, da die Investitionen nicht den erwarteten<br />
Nutzen br<strong>in</strong>gen. Die Komplexität <strong>der</strong> Entwicklungsprozesse nimmt stark zu.<br />
Die time-to-market wird kürzer, was zu e<strong>in</strong>em immer grösseren Zeitdruck führt.<br />
Unrealistische Zeitpläne s<strong>in</strong>d die Konsequenz. IT-Bus<strong>in</strong>ess-Lösungen s<strong>in</strong>d zunehmend<br />
kont<strong>in</strong>uierlichem Wandel unterworfen.<br />
Die Diskrepanz des Verständnisses zwischen den Entwicklern und den Anwen<strong>der</strong>n mit ihren<br />
sehr vagen Vorstellungen erschwert die Zusammenarbeit. Die unterschiedlichen Sichtweisen<br />
von Managern, Benutzern/Kunden und Entwicklern führen häufig zu Problemen, die durch<br />
ungenügende und unklare Kommunikation noch verstärkt werden.<br />
Die Unsicherheit des Marktes wirkt sich via Unternehmensleitung bis auf die IT-Projektebene<br />
aus. Verantwortung wird ungern übernommen.<br />
Der Nutzen <strong>der</strong> IT ist nur schwer quantifizierbar.<br />
Aufgrund <strong>der</strong> auf Unternehmensebene herrschenden Primärorganisation und <strong>der</strong> auf<br />
Projektebene herrschenden Sekundärorganisation kann die Doppelunterstellung zu<br />
Interessenkonflikten führen.<br />
90
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
2.2. Erwartungen an die <strong>Führung</strong><br />
Motivation ist Teil <strong>der</strong> <strong>Führung</strong>saufgabe. Den Mitarbeitern werden Rolle, Aufgabe und Ziel<br />
vorgegeben, was nach Ansicht vieler Praktiker e<strong>in</strong>e motivierende Wirkung hat. Hohe<br />
Eigenverantwortung wirkt ebenso motivierend.<br />
„Nach Fredmund Malik gründet e<strong>in</strong> schlechtes Arbeitsklima weniger auf e<strong>in</strong>em Motivations-<br />
son<strong>der</strong>n vielmehr auf e<strong>in</strong>em Vertrauensproblem“ [Baz02].<br />
Die Unternehmenskultur als Leitbild kann ebenso motivierend auf die Mitarbeiter wirken.<br />
Gemäss den Aussagen <strong>der</strong> befragten Firmenvertreter liegen die Probleme vorwiegend im<br />
zwischenmenschlichen Bereich (soft factors) und weniger im technischen Bereich (hard<br />
factors).<br />
Zwischenmenschliche Probleme werden mehr und mehr zum Stolperste<strong>in</strong>. Es fehlt an <strong>der</strong><br />
Fähigkeit Konflikte zu lösen.<br />
Nach Aussagen <strong>der</strong> Interview-Partner wird zukünftig Folgendes von Führenden erwartet:<br />
„Menschenkenntnis.“<br />
„Erkennen, ob e<strong>in</strong>e Person am richtigen Ort e<strong>in</strong>gesetzt ist“<br />
„Bewusstse<strong>in</strong> für soft factors“<br />
„Verschiedene Kulturen prallen aufe<strong>in</strong>an<strong>der</strong> – e<strong>in</strong> Projektleiter muss damit umgehen<br />
können“<br />
„Erkennen von verdeckten Konflikten“<br />
„Know<strong>in</strong>g your limitations.“<br />
3. Konzeptionelle Ansätze zur <strong>Führung</strong> <strong>komplexer</strong> IT-Projekte<br />
3.1. Abgrenzung <strong>Führung</strong>, Lea<strong>der</strong>ship und Management<br />
Die Begriffe „<strong>Führung</strong>“, „Lea<strong>der</strong>ship“ und „Management“ werden gerne verwechselt o<strong>der</strong><br />
verschieden <strong>in</strong>terpretiert.<br />
Folgend werden die Def<strong>in</strong>itionen nach H<strong>in</strong>terhuber [H<strong>in</strong>t97] verwendet:<br />
Lea<strong>der</strong>ship heisst, neue Möglichkeiten erschliessen und umsetzen (o<strong>der</strong> umsetzen lassen)<br />
sowie die unternehmerischen Verän<strong>der</strong>ungsprozesse so gestalten, dass Werte für die Kunden<br />
geschaffen und dadurch auch die übrigen Partner <strong>der</strong> Unternehmung zufrieden gestellt<br />
werden.<br />
Management heisst, Probleme auf kreative Art und Weise zu lösen mittels e<strong>in</strong>er Vielzahl von<br />
Instrumenten, Methoden und E<strong>in</strong>stellungen, mit welchen das Unternehmen<br />
Wettbewerbsvorteile gew<strong>in</strong>nen kann.<br />
Der Begriff „<strong>Führung</strong>“ umfasst Lea<strong>der</strong>ship und Management.<br />
91
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
Lea<strong>der</strong>ship als Management als<br />
Entdecken neuer Möglichkeiten, Kreatives Lösen von Aufgaben<br />
verbunden mit <strong>der</strong> Fähigkeit, diese<br />
umzusetzen<br />
Schaffen von neuen Paradigmen Arbeit <strong>in</strong>nerhalb e<strong>in</strong>es Paradigmas<br />
Arbeit am System Arbeit im System<br />
Mitarbeiter anregen und <strong>in</strong> die Lage D<strong>in</strong>ge und Menschen <strong>in</strong> Bewegung<br />
versetzen,<br />
erbr<strong>in</strong>gen<br />
Spitzenleistungen zu setzen mit Methoden und Techniken<br />
Ehrfurcht vor dem Menschen Der Mensch als Hilfe<br />
E<strong>in</strong>stellung des Dienens E<strong>in</strong>stellung des Machens<br />
Das Kommende vorbereiten und Die vere<strong>in</strong>barten Ziele <strong>in</strong>novativ<br />
Verän<strong>der</strong>ung<br />
herbeiführen<br />
antizipieren und erreichen und Bestehendes optimieren<br />
Führen mit Wünschen Führen mit konkreten, mess- und<br />
kontrollierbaren Zielen<br />
Vorausdenken und Handeln Denken und Handeln (operationell)<br />
(evolutionell-revolutionär)<br />
Tab. 21: Begriff Lea<strong>der</strong>ship vs. Management [Hald02]<br />
3.2. Komplexität<br />
Es gibt verschiedene Def<strong>in</strong>itionen von Komplexität:<br />
• Nach Duden ist Komplexität die „Gesamtheit aller Merkmale und Möglichkeiten o<strong>der</strong><br />
Vielschichtigkeit“ [DuBa5].<br />
• Ulrich/Probst [UlPr91] def<strong>in</strong>ieren die Komplexität als „die Fähigkeit e<strong>in</strong>es Systems, <strong>in</strong><br />
e<strong>in</strong>er gegebenen Zeitspanne e<strong>in</strong>e grosse Zahl von verschiedenen Zuständen annehmen<br />
zu können“.<br />
• Willke [Will00] bezeichnet Komplexität als den „Grad <strong>der</strong> Vielschichtigkeit,<br />
Vernetzung und Folgelastigkeit e<strong>in</strong>es Entscheidungsfeldes“.<br />
• Nach Neis [Neis] werden Systeme erst durch ihre Komplexität lebendig. Wird diese<br />
reduziert, fällt das System <strong>in</strong> sich zusammen. Man kann niemals Komplexität<br />
reduzieren, ohne destruktiv zu se<strong>in</strong>.<br />
In komplexen IT-Projekten verstehen wir <strong>Führung</strong> folglich als Komb<strong>in</strong>ation von<br />
• Management (kreativen Lösen von Aufgaben und Problemen e<strong>in</strong>es Systems mittels<br />
e<strong>in</strong>er Vielzahl von Instrumenten, Methoden und Techniken)<br />
und<br />
• Lea<strong>der</strong>ship (Erarbeitung und Erhaltung e<strong>in</strong>es Projektumfelds, das für alle Beteiligten<br />
motivierend wirkt und die Kommunikation und das Engagement aller Beteiligten<br />
för<strong>der</strong>t).<br />
92
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
Die folgenden Ausführungen beschränken sich auf den Lea<strong>der</strong>ship-Aspekt.<br />
3.3. <strong>Führung</strong>smodelle als soziale Systeme<br />
3.3.1. Willke -Systemtheorie<br />
In Willke’s Systemtheorie hat e<strong>in</strong> System (und damit auch komplexe IT-Projekte) e<strong>in</strong><br />
Eigenleben und lässt sich somit nicht wie Masch<strong>in</strong>enmodelle mit „Wenn-dann-Programmen“<br />
steuern. Willke geht von e<strong>in</strong>er „Logik des Missl<strong>in</strong>gens“ aus, d.h. dass Interventionsvorhaben<br />
an <strong>der</strong> Komplexität, Eigenlogik und Wi<strong>der</strong>ständigkeit <strong>der</strong> Probleme scheitern. Zum<br />
Normalfall wird die „Unwahrsche<strong>in</strong>lichkeit gel<strong>in</strong>gen<strong>der</strong> Intervention“ [Will99], was vor allem<br />
bei komplexen sozialen Systemen zutrifft.<br />
Nach Willke muss e<strong>in</strong> System zuerst beobachtet werden, bevor es bee<strong>in</strong>flusst und verän<strong>der</strong>t<br />
und damit gesteuert werden kann.<br />
Dieser Steuerung des Systems stellt sich aber die entwickelte Eigenidentität <strong>der</strong> Teams <strong>in</strong> den<br />
Weg, welche durch e<strong>in</strong>e Vere<strong>in</strong>fachung, d.h. Reduktion <strong>der</strong> Komplexität des Systems, wie<strong>der</strong><br />
zerstört werden würde.<br />
Aus systemtheoretischer Perspektive heisst dies für Manager und IT-Projektleiter, dass es sich<br />
bei Personen und Teams um nichttriviale Systeme handelt, die nicht e<strong>in</strong>fach von aussen<br />
umgepolt, verän<strong>der</strong>t o<strong>der</strong> umstrukturiert werden können, es sei denn, um den Preis Ihrer<br />
Identität und Autonomie. Das System kann sich nur selbst än<strong>der</strong>n, <strong>der</strong> Intervenierende kann<br />
die Verän<strong>der</strong>ung höchstens anstossen.<br />
3.3.2. Visionäre <strong>Führung</strong>smodelle<br />
E<strong>in</strong>e vorhandene Vision ist e<strong>in</strong> gutes Mittel ist, Teammitglie<strong>der</strong> zu motivieren, zu überzeugen<br />
und zu Höchstleistungen anzuspornen. Der Lea<strong>der</strong> ist Vorbild, <strong>in</strong>dem er zwar authentisch<br />
vorlebt was er predigt, aber auch Verantwortung abgeben kann.<br />
Hendriks/Ludemann [Hend97] stellen die Vision <strong>in</strong>s Zentrum und entwickeln e<strong>in</strong> "Visionäres<br />
Management". Im S<strong>in</strong>ne e<strong>in</strong>es ganzheitlichen Managers sollten <strong>Führung</strong>skräfte folgende<br />
Eigenschaften besitzen:<br />
• Absolute Ehrlichkeit<br />
• Fairness<br />
• Selbsterkenntnis<br />
• Beitrag, <strong>der</strong> zählt<br />
• Undogmatische Spiritualität<br />
• Weniger tun, mehr erreichen<br />
• Das Beste aus sich und an<strong>der</strong>en herausholen<br />
• Aufgeschlossenheit für Verän<strong>der</strong>ungen<br />
• Spezieller Humor<br />
• Selbstdiszipl<strong>in</strong><br />
• Gleichgewicht<br />
• Integrität<br />
93
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
Coll<strong>in</strong>s/Porras [CoPo97] stellen aufgrund ihrer Untersuchung von zeitlosen und<br />
mo<strong>der</strong>esistenten Managementpr<strong>in</strong>zipien den Grundsatz auf:<br />
Core ideology = core values + purpose<br />
Core values = a small set of general<br />
guid<strong>in</strong>g pr<strong>in</strong>ciples, not to be confused<br />
with specific cultural or operat<strong>in</strong>g<br />
practices, not to be compromised for<br />
f<strong>in</strong>ancial ga<strong>in</strong> or short term expediency.<br />
94<br />
Purpose = the organization’s<br />
fundamental reasons for existence<br />
beyond just mak<strong>in</strong>g money<br />
Dieser Grundsatz kann auf e<strong>in</strong> zeitlich begrenztes Projektteam übertragen werden. E<strong>in</strong>e<br />
Ideologie und damit auch S<strong>in</strong>n und Zweck e<strong>in</strong>es Projektteams sollte demnach e<strong>in</strong>erseits auf<br />
grundlegenden Werten <strong>der</strong> Organisation (o<strong>der</strong> falls nicht vorhanden vom Team selbst<br />
entwickelt), an<strong>der</strong>erseits auf e<strong>in</strong>em übergeordneten Zweck basieren. Die Studie zeigt, dass<br />
e<strong>in</strong>e Unternehmung mit - auf Werten basieren<strong>der</strong> und gelebter - Vision durchwegs erfolgreich<br />
ist.<br />
E<strong>in</strong>e geme<strong>in</strong>sam entwickelte und gelebte Vision, mit welcher sich das ganze Team<br />
identifiziert, bildet e<strong>in</strong>e geme<strong>in</strong>same Basis und ist somit <strong>in</strong> e<strong>in</strong>em IT-Projekt äusserst<br />
hilfreich, das übergeordnete Ziel des Projekts nicht aus den Augen zu verlieren.<br />
3.3.3. Menschenorientierte <strong>Führung</strong><br />
<strong>Führung</strong>smodelle konzentrieren sich nach Steiger auf die kommunikativen Aspekte <strong>der</strong><br />
<strong>Führung</strong> [Stei99]. Im Zentrum steht immer <strong>der</strong> Mensch.<br />
Maxwell beleuchtet den Unterschied zwischen den Idealvorstellungen e<strong>in</strong>es Projektverlaufs<br />
und <strong>der</strong> Realität: „Lea<strong>der</strong>ship, everyth<strong>in</strong>g rises and falls on lea<strong>der</strong>ship“. Eigenschaften wie<br />
Mut, Charakter, Charisma, Kompetenz o<strong>der</strong> Grosszügigkeit sprechen se<strong>in</strong>er Me<strong>in</strong>ung nach für<br />
e<strong>in</strong>e starke <strong>Führung</strong>spersönlichkeit [Maxw99].<br />
3.3.4. Kommunikation und Kooperation im Projekt<br />
Hamsel misst <strong>der</strong> Kommunikation und Kooperation für den Projekterfolg grosse Bedeutung<br />
bei. Soziale Kompetenz spielt neben fachlichen Qualifikationen e<strong>in</strong>e wesentliche Rolle.<br />
Kürzeres time-to-market und die Verkürzung <strong>der</strong> Entwicklungszeiten führen zu noch<br />
grösserem Zeitdruck. Deshalb müssen die Grenzen des Machbaren klar kommuniziert<br />
werden.
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
3.3.5. Vertrauen<br />
Für Fredmund Malik bildet das Vertrauen die Grundlage <strong>der</strong> Organisation. Fehlt es, bleiben<br />
alle Massnahmen zur För<strong>der</strong>ung <strong>der</strong> Motivation und zur Verbesserung des Betriebsklimas und<br />
<strong>der</strong> Unternehmenskultur wirkungslos [Baz02].<br />
3.3.6. Situatives <strong>Führung</strong>sverhalten<br />
<strong>Führung</strong>sverhalten soll nach Jenny entsprechend <strong>der</strong> Situation bestimmt werden. Diese wird<br />
von den vier Elementen „Aufgabe“, „<strong>Führung</strong>sperson“, „Mitarbeiter“ und „Situation“<br />
bee<strong>in</strong>flusst.<br />
Abb. 34: E<strong>in</strong>flüsse auf das <strong>Führung</strong>sverhalten [Hald02]<br />
4. <strong>Führung</strong>skonzept im MIO-Ansatz<br />
4.1. <strong>Metaphern</strong><br />
Die Verwendung von <strong>Metaphern</strong> för<strong>der</strong>t oft die Kreativität [RhPo72]. Da durch sie D<strong>in</strong>ge<br />
an<strong>der</strong>s wahrgenommen werden, bieten <strong>Metaphern</strong> Chancen für neue Ideen und Lösungen.<br />
Im Folgenden werden vier <strong>Metaphern</strong> von verschiedenen <strong>Führung</strong>sverhalten vorgestellt.<br />
Diese basieren auf dem MIO-Ansatz (Institut für Informatik, <strong>Universität</strong> <strong>Zürich</strong>) <strong>der</strong> IT-<br />
Projekte als soziale Systeme betrachtet [Hube00].<br />
95
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
Der Meister<br />
Der Meister führt se<strong>in</strong>e Lehrl<strong>in</strong>ge und Gesellen <strong>in</strong> e<strong>in</strong>em <strong>in</strong>novativen und langsamen Prozess<br />
<strong>in</strong> se<strong>in</strong> Metier e<strong>in</strong>. Der Meister gestaltet aus sich selbst heraus. Er erwirbt se<strong>in</strong>en Meister <strong>in</strong><br />
langen Jahren als Lehrl<strong>in</strong>g und Geselle. Als Ausweis dient ihm die Meisterprüfung. Er ist e<strong>in</strong><br />
Vorbild, aber se<strong>in</strong> sozialer E<strong>in</strong>fluss weist e<strong>in</strong>e beschränkte Reichweite auf.<br />
Der Feldherr<br />
Der Feldherr schickt se<strong>in</strong>e Heerscharen <strong>in</strong> den Kampf. Er entscheidet e<strong>in</strong>sam. Se<strong>in</strong> Überblick<br />
verschafft dem Feldherrn e<strong>in</strong> Informationsmonopol. Er dirigiert das Geschehen aufgrund<br />
se<strong>in</strong>es überlegenen Wissens und Informationsvorsprungs. Er verkörpert den Auftrag se<strong>in</strong>es<br />
Vorgesetzten, se<strong>in</strong> Commitment geht bis <strong>in</strong> den Tod. Se<strong>in</strong> sozialer E<strong>in</strong>fluss ist <strong>in</strong> se<strong>in</strong>er<br />
Funktion begründet.<br />
Der Raumschiff-Kapitän<br />
Der Raumschiff-Kapitän pflegt e<strong>in</strong>en partizipativen <strong>Führung</strong>sstil. Er nutzt und för<strong>der</strong>t die<br />
Innovationskraft se<strong>in</strong>es Teams. Der Kapitän koord<strong>in</strong>iert se<strong>in</strong> Team. Jedes Teammitglied<br />
verfügt über eigene Kompetenzen und e<strong>in</strong> e<strong>in</strong>geschränktes Vetorecht. Der Raumschiff-<br />
Kapitän ist deshalb <strong>in</strong> gewisser Weise von se<strong>in</strong>em Team abhängig. Bei strittigen Fragen<br />
entscheidet er. Er besitzt wenig fachliches Wissen. Die Loyalität se<strong>in</strong>er Mitarbeiter bestimmt<br />
se<strong>in</strong>en E<strong>in</strong>fluss.<br />
Der Gärtner<br />
Der Gärtner führt als oberster Diener, <strong>in</strong>dem er se<strong>in</strong>em Team optimale Bed<strong>in</strong>gungen schafft<br />
und auf das spontane Entstehen von Innovation vertraut. Der Gärtner verfährt nach dem<br />
Motto „E<strong>in</strong>e gute Vorbereitung ist die halbe Arbeit“ und bereitet se<strong>in</strong>en Pflanzen optimale<br />
Rahmenbed<strong>in</strong>gungen. Er schützt se<strong>in</strong> Projekt vor negativen äusseren E<strong>in</strong>flüssen, positive<br />
E<strong>in</strong>flüsse verstärkt er. Er <strong>in</strong>terveniert bei Schwierigkeiten und Problemen, ansonsten lässt er<br />
den D<strong>in</strong>gen freien Lauf. Er kontrolliert den Fortschritt und bestimmt den Zeitpunkt <strong>der</strong> Ernte.<br />
Se<strong>in</strong>e Autorität fusst auf e<strong>in</strong>er heiklen Balance von Vertrauen und Distanz gegenüber se<strong>in</strong>em<br />
Team.<br />
4.2. Projektphasen<br />
Das systemische Projektmanagement [HuKu03] schlägt vier Phasen zur Abwicklung e<strong>in</strong>es IT-<br />
Projekts vor, <strong>in</strong> welchem es neben <strong>der</strong> fachlichen Ebene um das Zusammenspiel von Personen<br />
<strong>in</strong> e<strong>in</strong>em neu zu gründenden sozialen System auf Zeit geht.<br />
Im systemischen Projektmanagement werden <strong>in</strong> den Phasen Projektetablierung und<br />
Projektkonstituierung Interessenkonflikte frühzeitig transparent gemacht, was zu e<strong>in</strong>er<br />
Zeite<strong>in</strong>sparung <strong>in</strong> <strong>der</strong> Durchführungsphase führen soll.<br />
96
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
Projektetablierung<br />
In <strong>der</strong> Etablierungsphase wird das soziale System gegründet. Oberste Aufgabe <strong>der</strong><br />
Etablierung ist die Kontextanalyse, d.h. das Aufzeigen <strong>der</strong> relevanten Umwelt des Projekts<br />
mit dem E<strong>in</strong>bezug von Sponsor, Auftraggeber und an<strong>der</strong>en bedeutenden Stakehol<strong>der</strong>n.<br />
Mögliche Methoden können e<strong>in</strong>e Projektumfeld-Analyse, die Analyse potentieller Probleme,<br />
systemische Interviews o<strong>der</strong> Teamdesign se<strong>in</strong>.<br />
Projektkonstituierung<br />
In <strong>der</strong> Konstituierungsphase werden die Projektgrenze, <strong>der</strong> Projektkontext und das<br />
Projektteam konstituiert. Bei <strong>der</strong> Bildung des Projektteams wird auf eventuell mitgebrachte<br />
Altlasten, Regeln <strong>der</strong> Zusammenarbeit, Rollenklärung und Commitment fokussiert. Als<br />
Methode bietet sich das bekannte Kick-Off-Meet<strong>in</strong>g an, das <strong>in</strong>sbeson<strong>der</strong>e <strong>der</strong> Teambildung<br />
und Auftragklärung dient.<br />
Projektdurchführung<br />
In <strong>der</strong> Durchführungsphase wird <strong>der</strong> Projektauftrag realisiert. Aus systemischer Perspektive<br />
ist hier mit Störungen, Än<strong>der</strong>ungen und Unvorhergesehenem adäquat und konstruktiv<br />
umzugehen. Wichtig s<strong>in</strong>d hierbei das Management <strong>der</strong> Projektgrenze, das Monitor<strong>in</strong>g<br />
schwacher Signale und, falls notwendig, die Intervention. Es lassen sich neun Funktionen auf<br />
den drei Systemebenen unterscheiden:<br />
Systemkontext Systemgrenze System<strong>in</strong>nenwelt<br />
Sensibilisieren<br />
Analysieren<br />
Mediieren<br />
Tab. 22: Systemebenen [Hald02]<br />
Projektabschluss<br />
Repräsentieren<br />
Integrieren<br />
Informieren<br />
97<br />
Kooperieren<br />
Kommunizieren<br />
Mo<strong>der</strong>ieren<br />
Ziel <strong>der</strong> Auflösung ist die Evaluation <strong>der</strong> Projektarbeit. Die Abschlussphase wird <strong>in</strong> <strong>der</strong> Praxis<br />
selten sauber durchgeführt. Doch gerade diese Phase bietet für alle Beteiligten die Chance,<br />
den Umgang mit Unvorhergesehenem, dynamischen und chaotischen Prozessen,<br />
Zielverän<strong>der</strong>ungen, Zeit- und Budgetüberschreitungen und Konflikten zu lernen.<br />
4.3. Situativer E<strong>in</strong>satz von <strong>Metaphern</strong><br />
Situatives <strong>Führung</strong>sverhalten ist <strong>in</strong> IT-Projekten typischerweise <strong>in</strong> den e<strong>in</strong>zelnen<br />
Projektphasen gefragt.
CMS für die MIO-Lernumgebung <strong>Anhang</strong> B<br />
Folgende Tabelle soll Aufschluss über die Verwendung <strong>der</strong> vorgestellten <strong>Metaphern</strong> <strong>in</strong> den<br />
e<strong>in</strong>zelnen Projektphasen geben:<br />
Meister Feldherr Kapitän Gärtner<br />
Etablierung - + ++ ++<br />
Konstituierung - +/- ++ +<br />
Durchführung +/- -- + +<br />
Auflösung - - + ++<br />
Tab. 23: Situativer E<strong>in</strong>satz von <strong>Metaphern</strong> [Hald02]<br />
5. Literaturverzeichnis<br />
[Baz02] Basler Zeitung vom 24. Juni 2002<br />
[CoPo97] James C. Coll<strong>in</strong>s, Jerry I. Porras: Bulit to Last – successful habits of visionary<br />
companies, New York, 1997<br />
[DuBa5] Duden Band 5<br />
[Hend97] Gay Hendricks, Kate Ludeman: Visionäres Management als <strong>Führung</strong>skonzept <strong>der</strong><br />
Zukunft, Delphi Verlag München 1997<br />
[H<strong>in</strong>t97] Hans H<strong>in</strong>terhuber, Eric Krauthammer: Lea<strong>der</strong>ship – mehr als Management,<br />
Wiesbaden 1997<br />
[Hube00] Andreas Huber: IT-Projekte und HR-Management, Konferenz mo<strong>der</strong>ne<br />
Informationstechnologie im HR-Management, 12.9.2000, Rüschlikon<br />
[HuKu03] Andreas Huber, Beathe Kuhnt: <strong>Führung</strong> und Management <strong>komplexer</strong> IT-Projekte,<br />
<strong>Zürich</strong> 2003 (geplant)<br />
[Maxw99] John C. Maxwell: The 21 irrefutable qualities of a lea<strong>der</strong>, Nashville 1999<br />
[Neis] Wilhelm Neis, Komplexitätstheorie und Komplexität im Management,<br />
Diplomarbeit FH Köln<br />
http://www.gm.fh-koeln.de/~bundschu/dokumente/komplex.doc<br />
[RhPo72] Rhe<strong>in</strong>ische Post vom 17. Juni 1972<br />
[Steig99] Rudolf Steiger, Menschenorientierte <strong>Führung</strong> – Anregungen für zivile und<br />
militärische <strong>Führung</strong>skräfte, Frauenfeld 1999, 11. Auflage<br />
[UlPr91] Hans Ulrich und Gilbert J.B. Probst, Anleitung zum ganzheitlichen Denken und<br />
Handeln: e<strong>in</strong> Brevier für <strong>Führung</strong>skräfte, Bern/Stuttgart, 1991, 3. Auflage<br />
[Will00] Helmut Willke, Systemtheorie 1: Grundlagen, Stuttgart 2000, 6. Auflage<br />
[Will99] Helmut Willke, Systemtheorie 2: Interventionstheorie, Stuttgart 1999, 3. Auflage<br />
98
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
<strong>Anhang</strong> C: e<strong>in</strong>gerichtete Umgebung<br />
1. Microsoft W<strong>in</strong>dows 2000<br />
2. Apache Webserver Version 1.3.26-w<strong>in</strong>32-src<br />
Folgend ist die an die Umgebung angepasste Konfigurationsdatei „httpd.conf“ abgedruckt:<br />
2.1. httpd.conf<br />
#<br />
# Based upon the NCSA server configuration files orig<strong>in</strong>ally by Rob McCool.<br />
#<br />
# This is the ma<strong>in</strong> Apache server configuration file. It conta<strong>in</strong>s the<br />
# configuration directives that give the server its <strong>in</strong>structions.<br />
# See for detailed <strong>in</strong>formation about<br />
# the directives.<br />
#<br />
# Do NOT simply read the <strong>in</strong>structions <strong>in</strong> here without un<strong>der</strong>stand<strong>in</strong>g<br />
# what they do. They're here only as h<strong>in</strong>ts or rem<strong>in</strong><strong>der</strong>s. If you are unsure<br />
# consult the onl<strong>in</strong>e docs. You have been warned.<br />
#<br />
# After this file is processed, the server will look for and process<br />
# C:/Programme/Apache Group/Apache/conf/srm.conf and then C:/Programme/Apache Group/Apache/conf/access.conf<br />
# unless you have overridden these with ResourceConfig and/or<br />
# AccessConfig directives here.<br />
#<br />
# The configuration directives are grouped <strong>in</strong>to three basic sections:<br />
# 1. Directives that control the operation of the Apache server process as a<br />
# whole (the 'global environment').<br />
# 2. Directives that def<strong>in</strong>e the parameters of the 'ma<strong>in</strong>' or 'default' server,<br />
# which responds to requests that aren't handled by a virtual host.<br />
# These directives also provide default values for the sett<strong>in</strong>gs<br />
# of all virtual hosts.<br />
# 3. Sett<strong>in</strong>gs for virtual hosts, which allow Web requests to be sent to<br />
# different IP addresses or hostnames and have them handled by the<br />
# same Apache server process.<br />
#<br />
# Configuration and logfile names: If the filenames you specify for many<br />
# of the server's control files beg<strong>in</strong> with "/" (or "drive:/" for W<strong>in</strong>32), the<br />
# server will use that explicit path. If the filenames do *not* beg<strong>in</strong><br />
# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"<br />
# with ServerRoot set to "/usr/local/apache" will be <strong>in</strong>terpreted by the<br />
# server as "/usr/local/apache/logs/foo.log".<br />
#<br />
# NOTE: Where filenames are specified, you must use forward slashes<br />
# <strong>in</strong>stead of backslashes (e.g., "c:/apache" <strong>in</strong>stead of "c:\apache").<br />
# If a drive letter is omitted, the drive on which Apache.exe is located<br />
# will be used by default. It is recommended that you always supply<br />
# an explicit drive letter <strong>in</strong> absolute paths, however, to avoid<br />
# confusion.<br />
#<br />
### Section 1: Global Environment<br />
#<br />
# The directives <strong>in</strong> this section affect the overall operation of Apache,<br />
# such as the number of concurrent requests it can handle or where it<br />
# can f<strong>in</strong>d its configuration files.<br />
#<br />
#<br />
# ServerType is either <strong>in</strong>etd, or standalone. Inetd mode is only supported on<br />
# Unix platforms.<br />
#<br />
ServerType standalone<br />
#<br />
# ServerRoot: The top of the directory tree un<strong>der</strong> which the server's<br />
# configuration, error, and log files are kept.<br />
#<br />
ServerRoot "C:/Programme/Apache Group/Apache"<br />
#<br />
# PidFile: The file <strong>in</strong> which the server should record its process<br />
# identification number when it starts.<br />
#<br />
PidFile logs/httpd.pid<br />
#<br />
# ScoreBoardFile: File used to store <strong>in</strong>ternal server process <strong>in</strong>formation.<br />
# Not all architectures require this. But if yours does (you'll know because<br />
# this file will be created when you run Apache) then you *must* ensure that<br />
# no two <strong>in</strong>vocations of Apache share the same scoreboard file.<br />
#<br />
ScoreBoardFile logs/apache_runtime_status<br />
#<br />
# In the standard configuration, the server will process httpd.conf (this<br />
# file, specified by the -f command l<strong>in</strong>e option), srm.conf, and access.conf<br />
# <strong>in</strong> that or<strong>der</strong>. The latter two files are now distributed empty, as it is<br />
99
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
# recommended that all directives be kept <strong>in</strong> a s<strong>in</strong>gle file for simplicity.<br />
# The commented-out values below are the built-<strong>in</strong> defaults. You can have the<br />
# server ignore these files altogether by us<strong>in</strong>g "/dev/null" (for Unix) or<br />
# "nul" (for W<strong>in</strong>32) for the arguments to the directives.<br />
#<br />
#ResourceConfig conf/srm.conf<br />
#AccessConfig conf/access.conf<br />
#<br />
# Timeout: The number of seconds before receives and sends time out.<br />
#<br />
Timeout 300<br />
#<br />
# KeepAlive: Whether or not to allow persistent connections (more than<br />
# one request per connection). Set to "Off" to deactivate.<br />
#<br />
KeepAlive On<br />
#<br />
# MaxKeepAliveRequests: The maximum number of requests to allow<br />
# dur<strong>in</strong>g a persistent connection. Set to 0 to allow an unlimited amount.<br />
# We recommend you leave this number high, for maximum performance.<br />
#<br />
MaxKeepAliveRequests 100<br />
#<br />
# KeepAliveTimeout: Number of seconds to wait for the next request from the<br />
# same client on the same connection.<br />
#<br />
KeepAliveTimeout 15<br />
#<br />
# Apache on W<strong>in</strong>32 always creates one child process to handle requests. If it<br />
# dies, another child process is created automatically. With<strong>in</strong> the child<br />
# process multiple threads handle <strong>in</strong>com<strong>in</strong>g requests. The next two<br />
# directives control the behaviour of the threads and processes.<br />
#<br />
#<br />
# MaxRequestsPerChild: the number of requests each child process is<br />
# allowed to process before the child dies. The child will exit so<br />
# as to avoid problems after prolonged use when Apache (and maybe the<br />
# libraries it uses) leak memory or other resources. On most systems, this<br />
# isn't really needed, but a few (such as Solaris) do have notable leaks<br />
# <strong>in</strong> the libraries. For W<strong>in</strong>32, set this value to zero (unlimited)<br />
# unless advised otherwise.<br />
#<br />
# NOTE: This value does not <strong>in</strong>clude keepalive requests after the <strong>in</strong>itial<br />
# request per connection. For example, if a child process handles<br />
# an <strong>in</strong>itial request and 10 subsequent "keptalive" requests, it<br />
# would only count as 1 request towards this limit.<br />
#<br />
MaxRequestsPerChild 0<br />
#<br />
# Number of concurrent threads (i.e., requests) the server will allow.<br />
# Set this value accord<strong>in</strong>g to the responsiveness of the server (more<br />
# requests active at once means they're all handled more slowly) and<br />
# the amount of system resources you'll allow the server to consume.<br />
#<br />
ThreadsPerChild 50<br />
#<br />
# Listen: Allows you to b<strong>in</strong>d Apache to specific IP addresses and/or<br />
# ports, <strong>in</strong> addition to the default. See also the <br />
# directive.<br />
#<br />
#Listen 3000<br />
#Listen 12.34.56.78:80<br />
#<br />
# B<strong>in</strong>dAddress: You can support virtual hosts with this option. This directive<br />
# is used to tell the server which IP address to listen to. It can either<br />
# conta<strong>in</strong> "*", an IP address, or a fully qualified Internet doma<strong>in</strong> name.<br />
# See also the and Listen directives.<br />
#<br />
#B<strong>in</strong>dAddress *<br />
#<br />
# Dynamic Shared Object (DSO) Support<br />
#<br />
# To be able to use the functionality of a module which was built as a DSO you<br />
# have to place correspond<strong>in</strong>g `LoadModule' l<strong>in</strong>es at this location so the<br />
# directives conta<strong>in</strong>ed <strong>in</strong> it are actually available _before_ they are used.<br />
# Please read the file README.DSO <strong>in</strong> the Apache 1.3 distribution for more<br />
# details about the DSO mechanism and run `apache -l' for the list of already<br />
# built-<strong>in</strong> (statically l<strong>in</strong>ked and thus always available) modules <strong>in</strong> your Apache<br />
# b<strong>in</strong>ary.<br />
#<br />
# Note: The or<strong>der</strong> <strong>in</strong> which modules are loaded is important. Don't change<br />
# the or<strong>der</strong> below without expert advice.<br />
#<br />
# Example:<br />
# LoadModule foo_module modules/mod_foo.so<br />
#<br />
#LoadModule vhost_alias_module modules/mod_vhost_alias.so<br />
#LoadModule mime_magic_module modules/mod_mime_magic.so<br />
#LoadModule status_module modules/mod_status.so<br />
#LoadModule <strong>in</strong>fo_module modules/mod_<strong>in</strong>fo.so<br />
#LoadModule spel<strong>in</strong>g_module modules/mod_spel<strong>in</strong>g.so<br />
#LoadModule rewrite_module modules/mod_rewrite.so<br />
#LoadModule anon_auth_module modules/mod_auth_anon.so<br />
#LoadModule dbm_auth_module modules/mod_auth_dbm.so<br />
#LoadModule digest_auth_module modules/mod_auth_digest.so<br />
100
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
#LoadModule digest_module modules/mod_digest.so<br />
#LoadModule proxy_module modules/mod_proxy.so<br />
#LoadModule cern_meta_module modules/mod_cern_meta.so<br />
#LoadModule expires_module modules/mod_expires.so<br />
#LoadModule hea<strong>der</strong>s_module modules/mod_hea<strong>der</strong>s.so<br />
#LoadModule usertrack_module modules/mod_usertrack.so<br />
#LoadModule unique_id_module modules/mod_unique_id.so<br />
LoadModule php4_module modules/php4apache.dll<br />
#<br />
# Reconstruction of the complete module list from all available modules<br />
# (static and shared ones) to achieve correct module execution or<strong>der</strong>.<br />
#<br />
# The modules listed below, without a correspond<strong>in</strong>g LoadModule directive,<br />
# are static bound <strong>in</strong>to the standard Apache b<strong>in</strong>ary distribution for W<strong>in</strong>dows.<br />
#<br />
# Note: The or<strong>der</strong> <strong>in</strong> which modules are loaded is important. Don't change<br />
# the or<strong>der</strong> below without expert advice.<br />
#<br />
# [WHENEVER YOU CHANGE THE LOADMODULE SECTION ABOVE, UPDATE THIS TOO!]<br />
#ClearModuleList<br />
#AddModule mod_vhost_alias.c<br />
#AddModule mod_env.c<br />
#AddModule mod_log_config.c<br />
#AddModule mod_mime_magic.c<br />
#AddModule mod_mime.c<br />
#AddModule mod_negotiation.c<br />
#AddModule mod_status.c<br />
#AddModule mod_<strong>in</strong>fo.c<br />
#AddModule mod_<strong>in</strong>clude.c<br />
#AddModule mod_auto<strong>in</strong>dex.c<br />
#AddModule mod_dir.c<br />
#AddModule mod_isapi.c<br />
#AddModule mod_cgi.c<br />
#AddModule mod_asis.c<br />
#AddModule mod_imap.c<br />
#AddModule mod_actions.c<br />
#AddModule mod_spel<strong>in</strong>g.c<br />
#AddModule mod_userdir.c<br />
#AddModule mod_alias.c<br />
#AddModule mod_rewrite.c<br />
#AddModule mod_access.c<br />
#AddModule mod_auth.c<br />
#AddModule mod_auth_anon.c<br />
#AddModule mod_auth_dbm.c<br />
#AddModule mod_auth_digest.c<br />
#AddModule mod_digest.c<br />
#AddModule mod_proxy.c<br />
#AddModule mod_cern_meta.c<br />
#AddModule mod_expires.c<br />
#AddModule mod_hea<strong>der</strong>s.c<br />
#AddModule mod_usertrack.c<br />
#AddModule mod_unique_id.c<br />
#AddModule mod_so.c<br />
#AddModule mod_setenvif.c<br />
#<br />
# ExtendedStatus controls whether Apache will generate "full" status<br />
# <strong>in</strong>formation (ExtendedStatus On) or just basic <strong>in</strong>formation (ExtendedStatus<br />
# Off) when the "server-status" handler is called. The default is Off.<br />
#<br />
#ExtendedStatus On<br />
### Section 2: 'Ma<strong>in</strong>' server configuration<br />
#<br />
# The directives <strong>in</strong> this section set up the values used by the 'ma<strong>in</strong>'<br />
# server, which responds to any requests that aren't handled by a<br />
# def<strong>in</strong>ition. These values also provide defaults for<br />
# any conta<strong>in</strong>ers you may def<strong>in</strong>e later <strong>in</strong> the file.<br />
#<br />
# All of these directives may appear <strong>in</strong>side conta<strong>in</strong>ers,<br />
# <strong>in</strong> which case these default sett<strong>in</strong>gs will be overridden for the<br />
# virtual host be<strong>in</strong>g def<strong>in</strong>ed.<br />
#<br />
#<br />
# Port: The port to which the standalone server listens. Certa<strong>in</strong> firewall<br />
# products must be configured before Apache can listen to a specific port.<br />
# Other runn<strong>in</strong>g httpd servers will also <strong>in</strong>terfere with this port. Disable<br />
# all firewall, security, and other services if you encounter problems.<br />
# To help diagnose problems use the W<strong>in</strong>dows NT command NETSTAT -a<br />
#<br />
Port 80<br />
#<br />
# ServerAdm<strong>in</strong>: Your address, where problems with the server should be<br />
# e-mailed. This address appears on some server-generated pages, such<br />
# as error documents.<br />
#<br />
ServerAdm<strong>in</strong> mail@doma<strong>in</strong><br />
#<br />
# ServerName allows you to set a host name which is sent back to clients for<br />
# your server if it's different than the one the program would get (i.e., use<br />
# "www" <strong>in</strong>stead of the host's real name).<br />
#<br />
# Note: You cannot just <strong>in</strong>vent host names and hope they work. The name you<br />
# def<strong>in</strong>e here must be a valid DNS name for your host. If you don't un<strong>der</strong>stand<br />
# this, ask your network adm<strong>in</strong>istrator.<br />
# If your host doesn't have a registered DNS name, enter its IP address here.<br />
# You will have to access it by its address (e.g., http://123.45.67.89/)<br />
# anyway, and this will make redirections work <strong>in</strong> a sensible way.<br />
#<br />
# 127.0.0.1 is the TCP/IP local loop-back address, often named localhost. Your<br />
# mach<strong>in</strong>e always knows itself by this address. If you use Apache strictly for<br />
101
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
# local test<strong>in</strong>g and development, you may use 127.0.0.1 as the server name.<br />
#<br />
ServerName 127.0.0.1<br />
#<br />
# DocumentRoot: The directory out of which you will serve your<br />
# documents. By default, all requests are taken from this directory, but<br />
# symbolic l<strong>in</strong>ks and aliases may be used to po<strong>in</strong>t to other locations.<br />
#<br />
DocumentRoot "C:/Programme/Apache Group/Apache/htdocs"<br />
#<br />
# Each directory to which Apache has access, can be configured with respect<br />
# to which services and features are allowed and/or disabled <strong>in</strong> that<br />
# directory (and its subdirectories).<br />
#<br />
# First, we configure the "default" to be a very restrictive set of<br />
# permissions.<br />
#<br />
<br />
Options FollowSymL<strong>in</strong>ks<br />
AllowOverride None<br />
<br />
#<br />
# Note that from this po<strong>in</strong>t forward you must specifically allow<br />
# particular features to be enabled - so if someth<strong>in</strong>g's not work<strong>in</strong>g as<br />
# you might expect, make sure that you have specifically enabled it<br />
# below.<br />
#<br />
#<br />
# This should be changed to whatever you set DocumentRoot to.<br />
#<br />
<br />
#<br />
# This may also be "None", "All", or any comb<strong>in</strong>ation of "Indexes",<br />
# "Includes", "FollowSymL<strong>in</strong>ks", "ExecCGI", or "MultiViews".<br />
#<br />
# Note that "MultiViews" must be named *explicitly* --- "Options All"<br />
# doesn't give it to you.<br />
#<br />
Options Indexes FollowSymL<strong>in</strong>ks MultiViews<br />
#<br />
# This controls which options the .htaccess files <strong>in</strong> directories can<br />
# override. Can also be "All", or any comb<strong>in</strong>ation of "Options", "FileInfo",<br />
# "AuthConfig", and "Limit"<br />
#<br />
AllowOverride None<br />
#<br />
# Controls who can get stuff from this server.<br />
#<br />
Or<strong>der</strong> allow,deny<br />
Allow from all<br />
<br />
#<br />
# UserDir: The name of the directory which is appended onto a user's home<br />
# directory if a ~user request is received.<br />
#<br />
# Un<strong>der</strong> W<strong>in</strong>32, we do not currently try to determ<strong>in</strong>e the home directory of<br />
# a W<strong>in</strong>dows log<strong>in</strong>, so a format such as that below needs to be used. See<br />
# the UserDir documentation for details.<br />
#<br />
<br />
UserDir "C:/Programme/Apache Group/Apache/users/"<br />
<br />
#<br />
# Control access to UserDir directories. The follow<strong>in</strong>g is an example<br />
# for a site where these directories are restricted to read-only.<br />
#<br />
#<br />
# AllowOverride FileInfo AuthConfig Limit<br />
# Options MultiViews Indexes SymL<strong>in</strong>ksIfOwnerMatch IncludesNoExec<br />
# <br />
# Or<strong>der</strong> allow,deny<br />
# Allow from all<br />
# <br />
# <br />
# Or<strong>der</strong> deny,allow<br />
# Deny from all<br />
# <br />
#<br />
#<br />
# DirectoryIndex: Name of the file or files to use as a pre-written HTML<br />
# directory <strong>in</strong>dex. Separate multiple entries with spaces.<br />
#<br />
<br />
DirectoryIndex <strong>in</strong>dex.html <strong>in</strong>dex.htm <strong>in</strong>dex.php <strong>in</strong>dex.php3 <strong>in</strong>dex.php4 <strong>in</strong>dex.phtml<br />
<br />
#<br />
# AccessFileName: The name of the file to look for <strong>in</strong> each directory<br />
# for access control <strong>in</strong>formation.<br />
#<br />
AccessFileName .htaccess<br />
#<br />
# The follow<strong>in</strong>g l<strong>in</strong>es prevent .htaccess files from be<strong>in</strong>g viewed by<br />
102
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
# Web clients. S<strong>in</strong>ce .htaccess files often conta<strong>in</strong> authorization<br />
# <strong>in</strong>formation, access is disallowed for security reasons. Comment<br />
# these l<strong>in</strong>es out if you want Web visitors to see the contents of<br />
# .htaccess files. If you change the AccessFileName directive above,<br />
# be sure to make the correspond<strong>in</strong>g changes here.<br />
#<br />
# Also, folks tend to use names such as .htpasswd for password<br />
# files, so this will protect those as well.<br />
#<br />
<br />
Or<strong>der</strong> allow,deny<br />
Deny from all<br />
Satisfy All<br />
<br />
#<br />
# CacheNegotiatedDocs: By default, Apache sends "Pragma: no-cache" with each<br />
# document that was negotiated on the basis of content. This asks proxy<br />
# servers not to cache the document. Uncomment<strong>in</strong>g the follow<strong>in</strong>g l<strong>in</strong>e disables<br />
# this behavior, and proxies will be allowed to cache the documents.<br />
#<br />
#CacheNegotiatedDocs<br />
#<br />
# UseCanonicalName: (new for 1.3) With this sett<strong>in</strong>g turned on, whenever<br />
# Apache needs to construct a self-referenc<strong>in</strong>g URL (a URL that refers back<br />
# to the server the response is com<strong>in</strong>g from) it will use ServerName and<br />
# Port to form a "canonical" name. With this sett<strong>in</strong>g off, Apache will<br />
# use the hostname:port that the client supplied, when possible. This<br />
# also affects SERVER_NAME and SERVER_PORT <strong>in</strong> CGI scripts.<br />
#<br />
UseCanonicalName On<br />
#<br />
# TypesConfig describes where the mime.types file (or equivalent) is<br />
# to be found.<br />
#<br />
<br />
TypesConfig conf/mime.types<br />
<br />
#<br />
# DefaultType is the default MIME type the server will use for a document<br />
# if it cannot otherwise determ<strong>in</strong>e one, such as from filename extensions.<br />
# If your server conta<strong>in</strong>s mostly text or HTML documents, "text/pla<strong>in</strong>" is<br />
# a good value. If most of your content is b<strong>in</strong>ary, such as applications<br />
# or images, you may want to use "application/octet-stream" <strong>in</strong>stead to<br />
# keep browsers from try<strong>in</strong>g to display b<strong>in</strong>ary files as though they are<br />
# text.<br />
#<br />
DefaultType text/pla<strong>in</strong><br />
#<br />
# The mod_mime_magic module allows the server to use various h<strong>in</strong>ts from the<br />
# contents of the file itself to determ<strong>in</strong>e its type. The MIMEMagicFile<br />
# directive tells the module where the h<strong>in</strong>t def<strong>in</strong>itions are located.<br />
# mod_mime_magic is not part of the default server (you have to add<br />
# it yourself with a LoadModule [see the DSO paragraph <strong>in</strong> the 'Global<br />
# Environment' section], or recompile the server and <strong>in</strong>clude mod_mime_magic<br />
# as part of the configuration), so it's enclosed <strong>in</strong> an conta<strong>in</strong>er.<br />
# This means that the MIMEMagicFile directive will only be processed if the<br />
# module is part of the server.<br />
#<br />
<br />
MIMEMagicFile conf/magic<br />
<br />
#<br />
# HostnameLookups: Log the names of clients or just their IP addresses<br />
# e.g., www.apache.org (on) or 204.62.129.132 (off).<br />
# The default is off because it'd be overall better for the net if people<br />
# had to know<strong>in</strong>gly turn this feature on, s<strong>in</strong>ce enabl<strong>in</strong>g it means that<br />
# each client request will result <strong>in</strong> AT LEAST one lookup request to the<br />
# nameserver.<br />
#<br />
HostnameLookups Off<br />
#<br />
# ErrorLog: The location of the error log file.<br />
# If you do not specify an ErrorLog directive with<strong>in</strong> a <br />
# conta<strong>in</strong>er, error messages relat<strong>in</strong>g to that virtual host will be<br />
# logged here. If you *do* def<strong>in</strong>e an error logfile for a <br />
# conta<strong>in</strong>er, that host's errors will be logged there and not here.<br />
#<br />
ErrorLog logs/error.log<br />
#<br />
# LogLevel: Control the number of messages logged to the error.log.<br />
# Possible values <strong>in</strong>clude: debug, <strong>in</strong>fo, notice, warn, error, crit,<br />
# alert, emerg.<br />
#<br />
LogLevel warn<br />
#<br />
# The follow<strong>in</strong>g directives def<strong>in</strong>e some format nicknames for use with<br />
# a CustomLog directive (see below).<br />
#<br />
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" comb<strong>in</strong>ed<br />
LogFormat "%h %l %u %t \"%r\" %>s %b" common<br />
LogFormat "%{Referer}i -> %U" referer<br />
LogFormat "%{User-agent}i" agent<br />
#<br />
# The location and format of the access logfile (Common Logfile Format).<br />
# If you do not def<strong>in</strong>e any access logfiles with<strong>in</strong> a <br />
103
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
# conta<strong>in</strong>er, they will be logged here. Contrariwise, if you *do*<br />
# def<strong>in</strong>e per- access logfiles, transactions will be<br />
# logged there<strong>in</strong> and *not* <strong>in</strong> this file.<br />
#<br />
CustomLog logs/access.log common<br />
#<br />
# If you would like to have agent and referer logfiles, uncomment the<br />
# follow<strong>in</strong>g directives.<br />
#<br />
#CustomLog logs/referer.log referer<br />
#CustomLog logs/agent.log agent<br />
#<br />
# If you prefer a s<strong>in</strong>gle logfile with access, agent, and referer <strong>in</strong>formation<br />
# (Comb<strong>in</strong>ed Logfile Format) you can use the follow<strong>in</strong>g directive.<br />
#<br />
#CustomLog logs/access.log comb<strong>in</strong>ed<br />
#<br />
# Optionally add a l<strong>in</strong>e conta<strong>in</strong><strong>in</strong>g the server version and virtual host<br />
# name to server-generated pages (error documents, FTP directory list<strong>in</strong>gs,<br />
# mod_status and mod_<strong>in</strong>fo output etc., but not CGI generated documents).<br />
# Set to "EMail" to also <strong>in</strong>clude a mailto: l<strong>in</strong>k to the ServerAdm<strong>in</strong>.<br />
# Set to one of: On | Off | EMail<br />
#<br />
ServerSignature On<br />
#<br />
# Apache parses all CGI scripts for the shebang l<strong>in</strong>e by default.<br />
# This comment l<strong>in</strong>e, the first l<strong>in</strong>e of the script, consists of the symbols<br />
# pound (#) and exclamation (!) followed by the path of the program that<br />
# can execute this specific script. For a perl script, with perl.exe <strong>in</strong><br />
# the C:\Program Files\Perl directory, the shebang l<strong>in</strong>e should be:<br />
#!c:/program files/perl/perl<br />
# Note you _must_not_ <strong>in</strong>dent the actual shebang l<strong>in</strong>e, and it must be the<br />
# first l<strong>in</strong>e of the file. Of course, CGI process<strong>in</strong>g must be enabled by<br />
# the appropriate ScriptAlias or Options ExecCGI directives for the files<br />
# or directory <strong>in</strong> question.<br />
#<br />
# However, Apache on W<strong>in</strong>dows allows either the Unix behavior above, or can<br />
# use the Registry to match files by extention. The command to execute<br />
# a file of this type is retrieved from the registry by the same method as<br />
# the W<strong>in</strong>dows Explorer would use to handle double-click<strong>in</strong>g on a file.<br />
# These script actions can be configured from the W<strong>in</strong>dows Explorer View menu,<br />
# 'Fol<strong>der</strong> Options', and review<strong>in</strong>g the 'File Types' tab. Click<strong>in</strong>g the Edit<br />
# button allows you to modify the Actions, of which Apache 1.3 attempts to<br />
# perform the 'Open' Action, and fail<strong>in</strong>g that it will try the shebang l<strong>in</strong>e.<br />
# This behavior is subject to change <strong>in</strong> Apache release 2.0.<br />
#<br />
# Each mechanism has it's own specific security weaknesses, from the means<br />
# to run a program you didn't <strong>in</strong>tend the website owner to <strong>in</strong>voke, and the<br />
# best method is a matter of great debate.<br />
#<br />
# To enable the this W<strong>in</strong>dows specific behavior (and therefore -disable- the<br />
# equivilant Unix behavior), uncomment the follow<strong>in</strong>g directive:<br />
#<br />
#ScriptInterpreterSource registry<br />
#<br />
# The directive above can be placed <strong>in</strong> <strong>in</strong>dividual blocks or the<br />
# .htaccess file, with either the 'registry' (W<strong>in</strong>dows behavior) or 'script'<br />
# (Unix behavior) option, and will override this server default option.<br />
#<br />
#<br />
# Aliases: Add here as many aliases as you need (with no limit). The format is<br />
# Alias fakename realname<br />
#<br />
<br />
#<br />
# Note that if you <strong>in</strong>clude a trail<strong>in</strong>g / on fakename then the server will<br />
# require it to be present <strong>in</strong> the URL. So "/icons" isn't aliased <strong>in</strong> this<br />
# example, only "/icons/". If the fakename is slash-term<strong>in</strong>ated, then the<br />
# realname must also be slash term<strong>in</strong>ated, and if the fakename omits the<br />
# trail<strong>in</strong>g slash, the realname must also omit it.<br />
#<br />
Alias /icons/ "C:/Programme/Apache Group/Apache/icons/"<br />
<br />
Options Indexes MultiViews<br />
AllowOverride None<br />
Or<strong>der</strong> allow,deny<br />
Allow from all<br />
<br />
# This Alias will project the on-l<strong>in</strong>e documentation tree un<strong>der</strong> /manual/<br />
# even if you change the DocumentRoot. Comment it if you don't want to<br />
# provide access to the on-l<strong>in</strong>e documentation.<br />
#<br />
Alias /manual/ "C:/Programme/Apache Group/Apache/htdocs/manual/"<br />
<br />
Options Indexes FollowSyml<strong>in</strong>ks MultiViews<br />
AllowOverride None<br />
Or<strong>der</strong> allow,deny<br />
Allow from all<br />
<br />
#<br />
# ScriptAlias: This controls which directories conta<strong>in</strong> server scripts.<br />
# ScriptAliases are essentially the same as Aliases, except that<br />
# documents <strong>in</strong> the realname directory are treated as applications and<br />
104
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
# run by the server when requested rather than as documents sent to the client.<br />
# The same rules about trail<strong>in</strong>g "/" apply to ScriptAlias directives as to<br />
# Alias.<br />
#<br />
ScriptAlias /cgi-b<strong>in</strong>/ "C:/Programme/Apache Group/Apache/cgi-b<strong>in</strong>/"<br />
#<br />
# "C:/Programme/Apache Group/Apache/cgi-b<strong>in</strong>" should be changed to whatever your ScriptAliased<br />
# CGI directory exists, if you have that configured.<br />
#<br />
<br />
AllowOverride None<br />
Options None<br />
Or<strong>der</strong> allow,deny<br />
Allow from all<br />
<br />
<br />
# End of aliases.<br />
#<br />
# Redirect allows you to tell clients about documents which used to exist <strong>in</strong><br />
# your server's namespace, but do not anymore. This allows you to tell the<br />
# clients where to look for the relocated document.<br />
# Format: Redirect old-URI new-URL<br />
#<br />
#<br />
# Directives controll<strong>in</strong>g the display of server-generated directory list<strong>in</strong>gs.<br />
#<br />
<br />
#<br />
# FancyIndex<strong>in</strong>g is whether you want fancy directory <strong>in</strong>dex<strong>in</strong>g or standard<br />
#<br />
# Note, add the option TrackModified to the IndexOptions default list only<br />
# if all <strong>in</strong>dexed directories reside on NTFS volumes. The TrackModified flag<br />
# will report the Last-Modified date to assist caches and proxies to properly<br />
# track directory changes, but it does _not_ work on FAT volumes.<br />
#<br />
IndexOptions FancyIndex<strong>in</strong>g<br />
#<br />
# AddIcon* directives tell the server which icon to show for different<br />
# files or filename extensions. These are only displayed for<br />
# FancyIndexed directories.<br />
#<br />
AddIconByEncod<strong>in</strong>g (CMP,/icons/compressed.gif) x-compress x-gzip<br />
AddIconByType (TXT,/icons/text.gif) text/*<br />
AddIconByType (IMG,/icons/image2.gif) image/*<br />
AddIconByType (SND,/icons/sound2.gif) audio/*<br />
AddIconByType (VID,/icons/movie.gif) video/*<br />
AddIcon /icons/b<strong>in</strong>ary.gif .b<strong>in</strong> .exe<br />
AddIcon /icons/b<strong>in</strong>hex.gif .hqx<br />
AddIcon /icons/tar.gif .tar<br />
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv<br />
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip<br />
AddIcon /icons/a.gif .ps .ai .eps<br />
AddIcon /icons/layout.gif .html .shtml .htm .pdf<br />
AddIcon /icons/text.gif .txt<br />
AddIcon /icons/c.gif .c<br />
AddIcon /icons/p.gif .pl .py<br />
AddIcon /icons/f.gif .for<br />
AddIcon /icons/dvi.gif .dvi<br />
AddIcon /icons/uuencoded.gif .uu<br />
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl<br />
AddIcon /icons/tex.gif .tex<br />
AddIcon /icons/bomb.gif core<br />
AddIcon /icons/back.gif ..<br />
AddIcon /icons/hand.right.gif README<br />
AddIcon /icons/fol<strong>der</strong>.gif ^^DIRECTORY^^<br />
AddIcon /icons/blank.gif ^^BLANKICON^^<br />
#<br />
# DefaultIcon is which icon to show for files which do not have an icon<br />
# explicitly set.<br />
#<br />
DefaultIcon /icons/unknown.gif<br />
#<br />
# AddDescription allows you to place a short description after a file <strong>in</strong><br />
# server-generated <strong>in</strong>dexes. These are only displayed for FancyIndexed<br />
# directories.<br />
# Format: AddDescription "description" filename<br />
#<br />
#AddDescription "GZIP compressed document" .gz<br />
#AddDescription "tar archive" .tar<br />
#AddDescription "GZIP compressed tar archive" .tgz<br />
#<br />
# ReadmeName is the name of the README file the server will look for by<br />
# default, and append to directory list<strong>in</strong>gs.<br />
#<br />
# Hea<strong>der</strong>Name is the name of a file which should be prepended to<br />
# directory <strong>in</strong>dexes.<br />
#<br />
# If MultiViews are amongst the Options <strong>in</strong> effect, the server will<br />
# first look for name.html and <strong>in</strong>clude it if found. If name.html<br />
# doesn't exist, the server will then look for name.txt and <strong>in</strong>clude<br />
# it as pla<strong>in</strong>text if found.<br />
#<br />
ReadmeName README<br />
105
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
Hea<strong>der</strong>Name HEADER<br />
#<br />
# IndexIgnore is a set of filenames which directory <strong>in</strong>dex<strong>in</strong>g should ignore<br />
# and not <strong>in</strong>clude <strong>in</strong> the list<strong>in</strong>g. Shell-style wildcard<strong>in</strong>g is permitted.<br />
#<br />
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t<br />
<br />
# End of <strong>in</strong>dex<strong>in</strong>g directives.<br />
#<br />
# Document types.<br />
#<br />
<br />
#<br />
# AddEncod<strong>in</strong>g allows you to have certa<strong>in</strong> browsers (Mosaic/X 2.1+) uncompress<br />
# <strong>in</strong>formation on the fly. Note: Not all browsers support this.<br />
# Despite the name similarity, the follow<strong>in</strong>g Add* directives have noth<strong>in</strong>g<br />
# to do with the FancyIndex<strong>in</strong>g customization directives above.<br />
#<br />
AddEncod<strong>in</strong>g x-compress Z<br />
AddEncod<strong>in</strong>g x-gzip gz tgz<br />
#<br />
# AddLanguage allows you to specify the language of a document. You can<br />
# then use content negotiation to give a browser a file <strong>in</strong> a language<br />
# it can un<strong>der</strong>stand.<br />
#<br />
# Note 1: The suffix does not have to be the same as the language<br />
# keyword --- those with documents <strong>in</strong> Polish (whose net-standard<br />
# language code is pl) may wish to use "AddLanguage pl .po" to<br />
# avoid the ambiguity with the common suffix for perl scripts.<br />
#<br />
# Note 2: The example entries below illustrate that <strong>in</strong> quite<br />
# some cases the two character 'Language' abbreviation is not<br />
# identical to the two character 'Country' code for its country,<br />
# E.g. 'Danmark/dk' versus 'Danish/da'.<br />
#<br />
# Note 3: In the case of 'ltz' we violate the RFC by us<strong>in</strong>g a three char<br />
# specifier. But there is 'work <strong>in</strong> progress' to fix this and get<br />
# the reference data for rfc1766 cleaned up.<br />
#<br />
# Danish (da) - Dutch (nl) - English (en) - Estonian (ee)<br />
# French (fr) - German (de) - Greek-Mo<strong>der</strong>n (el)<br />
# Italian (it) - Korean (kr) - Norwegian (no) - Norwegian Nynorsk (nn)<br />
# Portugese (pt) - Luxembourgeois* (ltz)<br />
# Spanish (es) - Swedish (sv) - Catalan (ca) - Czech(cz)<br />
# Polish (pl) - Brazilian Portuguese (pt-br) - Japanese (ja)<br />
# Russian (ru)<br />
#<br />
AddLanguage da .dk<br />
AddLanguage nl .nl<br />
AddLanguage en .en<br />
AddLanguage et .ee<br />
AddLanguage fr .fr<br />
AddLanguage de .de<br />
AddLanguage el .el<br />
AddLanguage he .he<br />
AddCharset ISO-8859-8 .iso8859-8<br />
AddLanguage it .it<br />
AddLanguage ja .ja<br />
AddCharset ISO-2022-JP .jis<br />
AddLanguage kr .kr<br />
AddCharset ISO-2022-KR .iso-kr<br />
AddLanguage nn .nn<br />
AddLanguage no .no<br />
AddLanguage pl .po<br />
AddCharset ISO-8859-2 .iso-pl<br />
AddLanguage pt .pt<br />
AddLanguage pt-br .pt-br<br />
AddLanguage ltz .lu<br />
AddLanguage ca .ca<br />
AddLanguage es .es<br />
AddLanguage sv .sv<br />
AddLanguage cz .cz<br />
AddLanguage ru .ru<br />
AddLanguage tw .tw<br />
AddLanguage zh-tw .tw<br />
AddCharset Big5 .Big5 .big5<br />
AddCharset WINDOWS-1251 .cp-1251<br />
AddCharset CP866 .cp866<br />
AddCharset ISO-8859-5 .iso-ru<br />
AddCharset KOI8-R .koi8-r<br />
AddCharset UCS-2 .ucs2<br />
AddCharset UCS-4 .ucs4<br />
AddCharset UTF-8 .utf8<br />
# LanguagePriority allows you to give precedence to some languages<br />
# <strong>in</strong> case of a tie dur<strong>in</strong>g content negotiation.<br />
#<br />
# Just list the languages <strong>in</strong> decreas<strong>in</strong>g or<strong>der</strong> of preference. We have<br />
# more or less alphabetized them here. You probably want to change this.<br />
#<br />
<br />
LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ru ltz ca es sv tw<br />
<br />
#<br />
# AddType allows you to tweak mime.types without actually edit<strong>in</strong>g it, or to<br />
# make certa<strong>in</strong> files to be certa<strong>in</strong> types.<br />
#<br />
AddType application/x-tar .tgz<br />
AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php-source .phps<br />
106
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
#<br />
# AddHandler allows you to map certa<strong>in</strong> file extensions to "handlers",<br />
# actions unrelated to filetype. These can be either built <strong>in</strong>to the server<br />
# or added with the Action command (see below)<br />
#<br />
# If you want to use server side <strong>in</strong>cludes, or CGI outside<br />
# ScriptAliased directories, uncomment the follow<strong>in</strong>g l<strong>in</strong>es.<br />
#<br />
# To use CGI scripts:<br />
#<br />
#AddHandler cgi-script .cgi<br />
#<br />
# To use server-parsed HTML files<br />
#<br />
#AddType text/html .shtml<br />
#AddHandler server-parsed .shtml<br />
#<br />
# Uncomment the follow<strong>in</strong>g l<strong>in</strong>e to enable Apache's send-asis HTTP file<br />
# feature<br />
#<br />
#AddHandler send-as-is asis<br />
#<br />
# If you wish to use server-parsed imagemap files, use<br />
#<br />
#AddHandler imap-file map<br />
#<br />
# To enable type maps, you might want to use<br />
#<br />
#AddHandler type-map var<br />
<br />
# End of document types.<br />
#<br />
# Action lets you def<strong>in</strong>e media types that will execute a script whenever<br />
# a match<strong>in</strong>g file is called. This elim<strong>in</strong>ates the need for repeated URL<br />
# pathnames for oft-used CGI file processors.<br />
# Format: Action media/type /cgi-script/location<br />
# Format: Action handler-name /cgi-script/location<br />
#<br />
Action application/x-httpd-php "/cgi-b<strong>in</strong>/php4.exe"<br />
#<br />
# MetaDir: specifies the name of the directory <strong>in</strong> which Apache can f<strong>in</strong>d<br />
# meta <strong>in</strong>formation files. These files conta<strong>in</strong> additional HTTP hea<strong>der</strong>s<br />
# to <strong>in</strong>clude when send<strong>in</strong>g the document<br />
#<br />
#MetaDir .web<br />
#<br />
# MetaSuffix: specifies the file name suffix for the file conta<strong>in</strong><strong>in</strong>g the<br />
# meta <strong>in</strong>formation.<br />
#<br />
#MetaSuffix .meta<br />
#<br />
# Customizable error response (Apache style)<br />
# these come <strong>in</strong> three flavors<br />
#<br />
# 1) pla<strong>in</strong> text<br />
#ErrorDocument 500 "The server made a boo boo.<br />
# n.b. the s<strong>in</strong>gle lead<strong>in</strong>g (") marks it as text, it does not get output<br />
#<br />
# 2) local redirects<br />
#ErrorDocument 404 /miss<strong>in</strong>g.html<br />
# to redirect to local URL /miss<strong>in</strong>g.html<br />
#ErrorDocument 404 /cgi-b<strong>in</strong>/miss<strong>in</strong>g_handler.pl<br />
# N.B.: You can redirect to a script or a document us<strong>in</strong>g server-side-<strong>in</strong>cludes.<br />
#<br />
# 3) external redirects<br />
#ErrorDocument 402 http://some.other-server.com/subscription_<strong>in</strong>fo.html<br />
# N.B.: Many of the environment variables associated with the orig<strong>in</strong>al<br />
# request will *not* be available to such a script.<br />
#<br />
# Customize behaviour based on the browser<br />
#<br />
<br />
#<br />
# The follow<strong>in</strong>g directives modify normal HTTP response behavior.<br />
# The first directive disables keepalive for Netscape 2.x and browsers that<br />
# spoof it. There are known problems with these browser implementations.<br />
# The second directive is for Microsoft Internet Explorer 4.0b2<br />
# which has a broken HTTP/1.1 implementation and does not properly<br />
# support keepalive when it is used on 301 or 302 (redirect) responses.<br />
#<br />
BrowserMatch "Mozilla/2" nokeepalive<br />
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0<br />
#<br />
# The follow<strong>in</strong>g directive disables HTTP/1.1 responses to browsers which<br />
# are <strong>in</strong> violation of the HTTP/1.0 spec by not be<strong>in</strong>g able to grok a<br />
# basic 1.1 response.<br />
#<br />
BrowserMatch "RealPlayer 4\.0" force-response-1.0<br />
BrowserMatch "Java/1\.0" force-response-1.0<br />
BrowserMatch "JDK/1\.0" force-response-1.0<br />
107
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
<br />
# End of browser customization directives<br />
#<br />
# Allow server status reports, with the URL of http://servername/server-status<br />
# Change the "somenet.com" to match your doma<strong>in</strong> to enable.<br />
#<br />
#<br />
# SetHandler server-status<br />
# Or<strong>der</strong> deny,allow<br />
# Deny from all<br />
# Allow from somenet.com<br />
#<br />
#<br />
# Allow remote server configuration reports, with the URL of<br />
# http://servername/server-<strong>in</strong>fo (requires that mod_<strong>in</strong>fo.c be loaded).<br />
# Change the "somenet.com" to match your doma<strong>in</strong> to enable.<br />
#<br />
#<br />
# SetHandler server-<strong>in</strong>fo<br />
# Or<strong>der</strong> deny,allow<br />
# Deny from all<br />
# Allow from somenet.com<br />
#<br />
#<br />
# There have been reports of people try<strong>in</strong>g to abuse an old bug from pre-1.1<br />
# days. This bug <strong>in</strong>volved a CGI script distributed as a part of Apache.<br />
# By uncomment<strong>in</strong>g these l<strong>in</strong>es you can redirect these attacks to a logg<strong>in</strong>g<br />
# script on phf.apache.org. Or, you can record them yourself, us<strong>in</strong>g the script<br />
# support/phf_abuse_log.cgi.<br />
#<br />
#<br />
# Deny from all<br />
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi<br />
#<br />
#<br />
# Proxy Server directives. Uncomment the follow<strong>in</strong>g l<strong>in</strong>es to<br />
# enable the proxy server:<br />
#<br />
#<br />
# ProxyRequests On<br />
# <br />
# Or<strong>der</strong> deny,allow<br />
# Deny from all<br />
# Allow from somenet.com<br />
# <br />
#<br />
# Enable/disable the handl<strong>in</strong>g of HTTP/1.1 "Via:" hea<strong>der</strong>s.<br />
# ("Full" adds the server version; "Block" removes all outgo<strong>in</strong>g Via: hea<strong>der</strong>s)<br />
# Set to one of: Off | On | Full | Block<br />
#<br />
# ProxyVia On<br />
#<br />
# To enable the cache as well, edit and uncomment the follow<strong>in</strong>g l<strong>in</strong>es:<br />
# (no cache<strong>in</strong>g without CacheRoot)<br />
#<br />
# CacheRoot "C:/Programme/Apache Group/Apache/proxy"<br />
# CacheSize 5<br />
# CacheGcInterval 4<br />
# CacheMaxExpire 24<br />
# CacheLastModifiedFactor 0.1<br />
# CacheDefaultExpire 1<br />
# NoCache a-doma<strong>in</strong>.com another-doma<strong>in</strong>.edu joes.garage-sale.com<br />
#<br />
# End of proxy directives.<br />
### Section 3: Virtual Hosts<br />
#<br />
# VirtualHost: If you want to ma<strong>in</strong>ta<strong>in</strong> multiple doma<strong>in</strong>s/hostnames on your<br />
# mach<strong>in</strong>e you can setup VirtualHost conta<strong>in</strong>ers for them. Most configurations<br />
# use only name-based virtual hosts so the server doesn't need to worry about<br />
# IP addresses. This is <strong>in</strong>dicated by the asterisks <strong>in</strong> the directives below.<br />
#<br />
# Please see the documentation at <br />
# for further details before you try to setup virtual hosts.<br />
#<br />
# You may use the command l<strong>in</strong>e option '-S' to verify your virtual host<br />
# configuration.<br />
#<br />
# Use name-based virtual host<strong>in</strong>g.<br />
#<br />
#NameVirtualHost *<br />
#<br />
# VirtualHost example:<br />
# Almost any Apache directive may go <strong>in</strong>to a VirtualHost conta<strong>in</strong>er.<br />
# The first VirtualHost section is used for requests without a known<br />
# server name.<br />
#<br />
#<br />
# ServerAdm<strong>in</strong> webmaster@dummy-host.example.com<br />
# DocumentRoot /www/docs/dummy-host.example.com<br />
# ServerName dummy-host.example.com<br />
# ErrorLog logs/dummy-host.example.com-error_log<br />
# CustomLog logs/dummy-host.example.com-access_log common<br />
#<br />
108
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
3. MySQL Version 3.23.51-w<strong>in</strong><br />
4. PHP Version php-4.2.1-W<strong>in</strong>32<br />
Folgend ist die an die Umgebung angepasste Datei „php.<strong>in</strong>i“ abgedruckt:<br />
4.1. php.<strong>in</strong>i<br />
[PHP]<br />
;;;;;;;;;;;<br />
; WARNING ;<br />
;;;;;;;;;;;<br />
; This is the default sett<strong>in</strong>gs file for new PHP <strong>in</strong>stallations.<br />
; By default, PHP <strong>in</strong>stalls itself with a configuration suitable for<br />
; development purposes, and *NOT* for production purposes.<br />
; For several security-oriented consi<strong>der</strong>ations that should be taken<br />
; before go<strong>in</strong>g onl<strong>in</strong>e with your site, please consult php.<strong>in</strong>i-recommended<br />
; and http://php.net/manual/en/security.php.<br />
;;;;;;;;;;;;;;;;;;;<br />
; About this file ;<br />
;;;;;;;;;;;;;;;;;;;<br />
; This file controls many aspects of PHP's behavior. In or<strong>der</strong> for PHP to<br />
; read it, it must be named 'php.<strong>in</strong>i'. PHP looks for it <strong>in</strong> the current<br />
; work<strong>in</strong>g directory, <strong>in</strong> the path designated by the environment variable<br />
; PHPRC, and <strong>in</strong> the path that was def<strong>in</strong>ed <strong>in</strong> compile time (<strong>in</strong> that or<strong>der</strong>).<br />
; Un<strong>der</strong> W<strong>in</strong>dows, the compile-time path is the W<strong>in</strong>dows directory. The<br />
; path <strong>in</strong> which the php.<strong>in</strong>i file is looked for can be overridden us<strong>in</strong>g<br />
; the -c argument <strong>in</strong> command l<strong>in</strong>e mode.<br />
;<br />
; The syntax of the file is extremely simple. Whitespace and L<strong>in</strong>es<br />
; beg<strong>in</strong>n<strong>in</strong>g with a semicolon are silently ignored (as you probably guessed).<br />
; Section hea<strong>der</strong>s (e.g. [Foo]) are also silently ignored, even though<br />
; they might mean someth<strong>in</strong>g <strong>in</strong> the future.<br />
;<br />
; Directives are specified us<strong>in</strong>g the follow<strong>in</strong>g syntax:<br />
; directive = value<br />
; Directive names are *case sensitive* - foo=bar is different from FOO=bar.<br />
;<br />
; The value can be a str<strong>in</strong>g, a number, a PHP constant (e.g. E_ALL or M_PI), one<br />
; of the INI constants (On, Off, True, False, Yes, No and None) or an expression<br />
; (e.g. E_ALL & ~E_NOTICE), or a quoted str<strong>in</strong>g ("foo").<br />
;<br />
; Expressions <strong>in</strong> the INI file are limited to bitwise operators and parentheses:<br />
; | bitwise OR<br />
; & bitwise AND<br />
; ~ bitwise NOT<br />
; ! boolean NOT<br />
;<br />
; Boolean flags can be turned on us<strong>in</strong>g the values 1, On, True or Yes.<br />
; They can be turned off us<strong>in</strong>g the values 0, Off, False or No.<br />
;<br />
; An empty str<strong>in</strong>g can be denoted by simply not writ<strong>in</strong>g anyth<strong>in</strong>g after the equal<br />
; sign, or by us<strong>in</strong>g the None keyword:<br />
;<br />
; foo = ; sets foo to an empty str<strong>in</strong>g<br />
; foo = none ; sets foo to an empty str<strong>in</strong>g<br />
; foo = "none" ; sets foo to the str<strong>in</strong>g 'none'<br />
;<br />
; If you use constants <strong>in</strong> your value, and these constants belong to a<br />
; dynamically loaded extension (either a PHP extension or a Zend extension),<br />
; you may only use these constants *after* the l<strong>in</strong>e that loads the extension.<br />
;<br />
; All the values <strong>in</strong> the php.<strong>in</strong>i-dist file correspond to the built<strong>in</strong><br />
; defaults (that is, if no php.<strong>in</strong>i is used, or if you delete these l<strong>in</strong>es,<br />
; the built<strong>in</strong> defaults will be identical).<br />
;;;;;;;;;;;;;;;;;;;;<br />
; Language Options ;<br />
;;;;;;;;;;;;;;;;;;;;<br />
; Enable the PHP script<strong>in</strong>g language eng<strong>in</strong>e un<strong>der</strong> Apache.<br />
eng<strong>in</strong>e = On<br />
; Allow the
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; to a certa<strong>in</strong> size - you can use a maximum number of bytes <strong>in</strong>stead of 'On', as<br />
; a value for this directive (e.g., output_buffer<strong>in</strong>g=4096).<br />
output_buffer<strong>in</strong>g = Off<br />
; You can redirect all of the output of your scripts to a function. For<br />
; example, if you set output_handler to "ob_gzhandler", output will be<br />
; transparently compressed for browsers that support gzip or deflate encod<strong>in</strong>g.<br />
; Sett<strong>in</strong>g an output handler automatically turns on output buffer<strong>in</strong>g.<br />
output_handler =<br />
; The unserialize callback function will called (with the undef<strong>in</strong>d class'<br />
; name as parameter), if the unserializer f<strong>in</strong>ds an undef<strong>in</strong>ed class<br />
; which should be <strong>in</strong>stanciated.<br />
; A warn<strong>in</strong>g appears if the specified function is not def<strong>in</strong>ed, or if the<br />
; function doesn't <strong>in</strong>clude/implement the miss<strong>in</strong>g class.<br />
; So only set this entry, if you really want to implement such a<br />
; callback-function.<br />
unserialize_callback_func=<br />
; Transparent output compression us<strong>in</strong>g the zlib library<br />
; Valid values for this option are 'off', 'on', or a specific buffer size<br />
; to be used for compression (default is 4KB)<br />
;<br />
; Note: output_handler must be empty if this is set 'On' !!!!<br />
;<br />
zlib.output_compression = Off<br />
; Implicit flush tells PHP to tell the output layer to flush itself<br />
; automatically after every output block. This is equivalent to call<strong>in</strong>g the<br />
; PHP function flush() after each and every call to pr<strong>in</strong>t() or echo() and each<br />
; and every HTML block. Turn<strong>in</strong>g this option on has serious performance<br />
; implications and is generally recommended for debugg<strong>in</strong>g purposes only.<br />
implicit_flush = Off<br />
; Whether to enable the ability to force arguments to be passed by reference<br />
; at function call time. This method is deprecated and is likely to be<br />
; unsupported <strong>in</strong> future versions of PHP/Zend. The encouraged method of<br />
; specify<strong>in</strong>g which arguments should be passed by reference is <strong>in</strong> the function<br />
; declaration. You're encouraged to try and turn this option Off and make<br />
; sure your scripts work properly with it <strong>in</strong> or<strong>der</strong> to ensure they will work<br />
; with future versions of the language (you will receive a warn<strong>in</strong>g each time<br />
; you use this feature, and the argument will be passed by value <strong>in</strong>stead of by<br />
; reference).<br />
allow_call_time_pass_reference = On<br />
; Safe Mode<br />
;<br />
safe_mode = Off<br />
; By default, Safe Mode does a UID compare check when<br />
; open<strong>in</strong>g files. If you want to relax this to a GID compare,<br />
; then turn on safe_mode_gid.<br />
safe_mode_gid = Off<br />
; When safe_mode is on, UID/GID checks are bypassed when<br />
; <strong>in</strong>clud<strong>in</strong>g files from this directory and its subdirectories.<br />
; (directory must also be <strong>in</strong> <strong>in</strong>clude_path or full path must<br />
; be used when <strong>in</strong>clud<strong>in</strong>g)<br />
safe_mode_<strong>in</strong>clude_dir =<br />
; When safe_mode is on, only executables located <strong>in</strong> the safe_mode_exec_dir<br />
; will be allowed to be executed via the exec family of functions.<br />
safe_mode_exec_dir =<br />
; open_basedir, if set, limits all file operations to the def<strong>in</strong>ed directory<br />
; and below. This directive makes most sense if used <strong>in</strong> a per-directory<br />
; or per-virtualhost web server configuration file.<br />
;<br />
;open_basedir =<br />
; Sett<strong>in</strong>g certa<strong>in</strong> environment variables may be a potential security breach.<br />
; This directive conta<strong>in</strong>s a comma-delimited list of prefixes. In Safe Mode,<br />
; the user may only alter environment variables whose names beg<strong>in</strong> with the<br />
; prefixes supplied here. By default, users will only be able to set<br />
; environment variables that beg<strong>in</strong> with PHP_ (e.g. PHP_FOO=BAR).<br />
;<br />
; Note: If this directive is empty, PHP will let the user modify ANY<br />
; environment variable!<br />
safe_mode_allowed_env_vars = PHP_<br />
; This directive conta<strong>in</strong>s a comma-delimited list of environment variables that<br />
; the end user won't be able to change us<strong>in</strong>g putenv(). These variables will be<br />
; protected even if safe_mode_allowed_env_vars is set to allow to change them.<br />
safe_mode_protected_env_vars = LD_LIBRARY_PATH<br />
; This directive allows you to disable certa<strong>in</strong> functions for security reasons.<br />
; It receives a comma-delimited list of function names. This directive is<br />
; *NOT* affected by whether Safe Mode is turned On or Off.<br />
disable_functions =<br />
; Colors for Syntax Highlight<strong>in</strong>g mode. Anyth<strong>in</strong>g that's acceptable <strong>in</strong><br />
; would work.<br />
highlight.str<strong>in</strong>g = #CC0000<br />
highlight.comment = #FF9900<br />
highlight.keyword = #006600<br />
highlight.bg = #FFFFFF<br />
highlight.default = #0000CC<br />
highlight.html = #000000<br />
;<br />
; Misc<br />
;<br />
; Decides whether PHP may expose the fact that it is <strong>in</strong>stalled on the server<br />
; (e.g. by add<strong>in</strong>g its signature to the Web server hea<strong>der</strong>). It is no security<br />
110
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; threat <strong>in</strong> any way, but it makes it possible to determ<strong>in</strong>e whether you use PHP<br />
; on your server or not.<br />
expose_php = On<br />
;;;;;;;;;;;;;;;;;;;<br />
; Resource Limits ;<br />
;;;;;;;;;;;;;;;;;;;<br />
max_execution_time = 30 ; Maximum execution time of each script, <strong>in</strong> seconds<br />
memory_limit = 8M ; Maximum amount of memory a script may consume (8MB)<br />
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />
; Error handl<strong>in</strong>g and logg<strong>in</strong>g ;<br />
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;<br />
; error_report<strong>in</strong>g is a bit-field. Or each number up to get desired error<br />
; report<strong>in</strong>g level<br />
; E_ALL - All errors and warn<strong>in</strong>gs<br />
; E_ERROR - fatal run-time errors<br />
; E_WARNING - run-time warn<strong>in</strong>gs (non-fatal errors)<br />
; E_PARSE - compile-time parse errors<br />
; E_NOTICE - run-time notices (these are warn<strong>in</strong>gs which often result<br />
; from a bug <strong>in</strong> your code, but it's possible that it was<br />
; <strong>in</strong>tentional (e.g., us<strong>in</strong>g an un<strong>in</strong>itialized variable and<br />
; rely<strong>in</strong>g on the fact it's automatically <strong>in</strong>itialized to an<br />
; empty str<strong>in</strong>g)<br />
; E_CORE_ERROR - fatal errors that occur dur<strong>in</strong>g PHP's <strong>in</strong>itial startup<br />
; E_CORE_WARNING - warn<strong>in</strong>gs (non-fatal errors) that occur dur<strong>in</strong>g PHP's<br />
; <strong>in</strong>itial startup<br />
; E_COMPILE_ERROR - fatal compile-time errors<br />
; E_COMPILE_WARNING - compile-time warn<strong>in</strong>gs (non-fatal errors)<br />
; E_USER_ERROR - user-generated error message<br />
; E_USER_WARNING - user-generated warn<strong>in</strong>g message<br />
; E_USER_NOTICE - user-generated notice message<br />
;<br />
; Examples:<br />
;<br />
; - Show all errors, except for notices<br />
;<br />
;error_report<strong>in</strong>g = E_ALL & ~E_NOTICE<br />
;<br />
; - Show only errors<br />
;<br />
;error_report<strong>in</strong>g = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR<br />
;<br />
; - Show all errors except for notices<br />
;<br />
error_report<strong>in</strong>g = E_ALL; display all errors, warn<strong>in</strong>gs and notices<br />
; Pr<strong>in</strong>t out errors (as a part of the output). For production web sites,<br />
; you're strongly encouraged to turn this feature off, and use error logg<strong>in</strong>g<br />
; <strong>in</strong>stead (see below). Keep<strong>in</strong>g display_errors enabled on a production web site<br />
; may reveal security <strong>in</strong>formation to end users, such as file paths on your Web<br />
; server, your database schema or other <strong>in</strong>formation.<br />
display_errors = On<br />
; Even when display_errors is on, errors that occur dur<strong>in</strong>g PHP's startup<br />
; sequence are not displayed. It's strongly recommended to keep<br />
; display_startup_errors off, except for when debugg<strong>in</strong>g.<br />
display_startup_errors = Off<br />
; Log errors <strong>in</strong>to a log file (server-specific log, st<strong>der</strong>r, or error_log (below))<br />
; As stated above, you're strongly advised to use error logg<strong>in</strong>g <strong>in</strong> place of<br />
; error display<strong>in</strong>g on production web sites.<br />
log_errors = On<br />
; Store the last error/warn<strong>in</strong>g message <strong>in</strong> $php_errormsg (boolean).<br />
track_errors = Off<br />
; Disable the <strong>in</strong>clusion of HTML tags <strong>in</strong> error messages.<br />
;html_errors = Off<br />
; Str<strong>in</strong>g to output before an error message.<br />
;error_prepend_str<strong>in</strong>g = ""<br />
; Str<strong>in</strong>g to output after an error message.<br />
;error_append_str<strong>in</strong>g = ""<br />
; Log errors to specified file.<br />
error_log = c:php\error.log<br />
; Log errors to syslog (Event Log on NT, not valid <strong>in</strong> W<strong>in</strong>dows 95).<br />
;error_log = syslog<br />
; Warn if the + operator is used with str<strong>in</strong>gs.<br />
warn_plus_overload<strong>in</strong>g = Off<br />
;;;;;;;;;;;;;;;;;<br />
; Data Handl<strong>in</strong>g ;<br />
;;;;;;;;;;;;;;;;;<br />
;<br />
; Note - track_vars is ALWAYS enabled as of PHP 4.0.3<br />
; The separator used <strong>in</strong> PHP generated URLs to separate arguments.<br />
; Default is "&".<br />
;arg_separator.output = "&"<br />
; List of separator(s) used by PHP to parse <strong>in</strong>put URLs <strong>in</strong>to variables.<br />
; Default is "&".<br />
; NOTE: Every character <strong>in</strong> this directive is consi<strong>der</strong>ed as separator!<br />
;arg_separator.<strong>in</strong>put = ";&"<br />
111
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; This directive describes the or<strong>der</strong> <strong>in</strong> which PHP registers GET, POST, Cookie,<br />
; Environment and Built-<strong>in</strong> variables (G, P, C, E & S respectively, often<br />
; referred to as EGPCS or GPC). Registration is done from left to right, newer<br />
; values override ol<strong>der</strong> values.<br />
variables_or<strong>der</strong> = "GPCS"<br />
; Whether or not to register the EGPCS variables as global variables. You may<br />
; want to turn this off if you don't want to clutter your scripts' global scope<br />
; with user data. This makes most sense when coupled with track_vars - <strong>in</strong> which<br />
; case you can access all of the GPC variables through the $HTTP_*_VARS[],<br />
; variables.<br />
;<br />
; You should do your best to write your scripts so that they do not require<br />
; register_globals to be on; Us<strong>in</strong>g form variables as globals can easily lead<br />
; to possible security problems, if the code is not very well thought of.<br />
register_globals = Off<br />
; This directive tells PHP whether to declare the argv&argc variables (that<br />
; would conta<strong>in</strong> the GET <strong>in</strong>formation). If you don't use these variables, you<br />
; should turn it off for <strong>in</strong>creased performance.<br />
register_argc_argv = Off<br />
; Maximum size of POST data that PHP will accept.<br />
post_max_size = 8M<br />
; This directive is deprecated. Use variables_or<strong>der</strong> <strong>in</strong>stead.<br />
gpc_or<strong>der</strong> = "GPC"<br />
; Magic quotes<br />
;<br />
; Magic quotes for <strong>in</strong>com<strong>in</strong>g GET/POST/Cookie data.<br />
magic_quotes_gpc = On<br />
; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc.<br />
magic_quotes_runtime = Off<br />
; Use Sybase-style magic quotes (escape ' with '' <strong>in</strong>stead of \').<br />
magic_quotes_sybase = Off<br />
; Automatically add files before or after any PHP document.<br />
auto_prepend_file =<br />
auto_append_file =<br />
; As of 4.0b4, PHP always outputs a character encod<strong>in</strong>g by default <strong>in</strong><br />
; the Content-type: hea<strong>der</strong>. To disable send<strong>in</strong>g of the charset, simply<br />
; set it to be empty.<br />
;<br />
; PHP's built-<strong>in</strong> default is text/html<br />
default_mimetype = "text/html"<br />
;default_charset = "iso-8859-1"<br />
; Always populate the $HTTP_RAW_POST_DATA variable.<br />
;always_populate_raw_post_data = On<br />
;;;;;;;;;;;;;;;;;;;;;;;;;<br />
; Paths and Directories ;<br />
;;;;;;;;;;;;;;;;;;;;;;;;;<br />
; UNIX: "/path1:/path2"<br />
;<strong>in</strong>clude_path = ".:/php/<strong>in</strong>cludes"<br />
;<br />
; W<strong>in</strong>dows: "\path1;\path2"<br />
;<strong>in</strong>clude_path = ".;c:\php\<strong>in</strong>cludes"<br />
<strong>in</strong>clude_path = ".;c:\Programme\Apache Group\Apache\htdocs\miowww\adodb"<br />
; The root of the PHP pages, used only if nonempty.<br />
; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root<br />
; if you are runn<strong>in</strong>g php as a CGI un<strong>der</strong> any web server (other than IIS)<br />
; see documentation for security issues. The alternate is to use the<br />
; cgi.force_redirect configuration below<br />
doc_root = "c:\Programme\Apache Group\Apache\htdocs"<br />
; The directory un<strong>der</strong> which PHP opens the script us<strong>in</strong>g /~usernamem used only<br />
; if nonempty.<br />
user_dir =<br />
; Directory <strong>in</strong> which the loadable extensions (modules) reside.<br />
extension_dir = "c:\php\extensions"<br />
; Whether or not to enable the dl() function. The dl() function does NOT work<br />
; properly <strong>in</strong> multithreaded servers, such as IIS or Zeus, and is automatically<br />
; disabled on them.<br />
enable_dl = On<br />
; cgi.force_redirect is necessary to provide security runn<strong>in</strong>g PHP as a CGI un<strong>der</strong><br />
; most web servers. Left undef<strong>in</strong>ed, PHP turns this on by default. You can<br />
; turn it off here AT YOUR OWN RISK<br />
; **You CAN safely turn this off for IIS, <strong>in</strong> fact, you MUST.**<br />
; cgi.force_redirect = 1<br />
; if cgi.force_redirect is turned on, and you are not runn<strong>in</strong>g un<strong>der</strong> Apache or Netscape<br />
; (iPlanet) web servers, you MAY need to set an environment variable name that PHP<br />
; will look for to know it is OK to cont<strong>in</strong>ue execution. Sett<strong>in</strong>g this variable MAY<br />
; cause security issues, KNOW WHAT YOU ARE DOING FIRST.<br />
; cgi.redirect_status_env = ;<br />
;;;;;;;;;;;;;;;;<br />
; File Uploads ;<br />
;;;;;;;;;;;;;;;;<br />
; Whether to allow HTTP file uploads.<br />
file_uploads = On<br />
; Temporary directory for HTTP uploaded files (will use system default if not<br />
112
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; specified).<br />
upload_tmp_dir = C:\PHP\uploadtemp ; temporary directory for HTTP uploaded files (will use system default if not specified)<br />
; Maximum allowed size for uploaded files.<br />
upload_max_filesize = 2M<br />
;;;;;;;;;;;;;;;;;;<br />
; Fopen wrappers ;<br />
;;;;;;;;;;;;;;;;;;<br />
; Whether to allow the treatment of URLs (like http:// or ftp://) as files.<br />
allow_url_fopen = On<br />
; Def<strong>in</strong>e the anonymous ftp password (your email address)<br />
;from="john@doe.com"<br />
;;;;;;;;;;;;;;;;;;;;;;<br />
; Dynamic Extensions ;<br />
;;;;;;;;;;;;;;;;;;;;;;<br />
;<br />
; If you wish to have an extension loaded automatically, use the follow<strong>in</strong>g<br />
; syntax:<br />
;<br />
; extension=modulename.extension<br />
;<br />
; For example, on W<strong>in</strong>dows:<br />
;<br />
; extension=msql.dll<br />
;<br />
; ... or un<strong>der</strong> UNIX:<br />
;<br />
; extension=msql.so<br />
;<br />
; Note that it should be the name of the module only; no directory <strong>in</strong>formation<br />
; needs to go here. Specify the location of the extension with the<br />
; extension_dir directive above.<br />
;W<strong>in</strong>dows Extensions<br />
;Note that MySQL and ODBC support is now built <strong>in</strong>, so no dll is needed for it.<br />
;<br />
;extension=php_bz2.dll<br />
;extension=php_ctype.dll<br />
;extension=php_cpdf.dll<br />
;extension=php_curl.dll<br />
;extension=php_cybercash.dll<br />
;extension=php_db.dll<br />
;extension=php_dba.dll<br />
;extension=php_dbase.dll<br />
;extension=php_dbx.dll<br />
extension=php_domxml.dll<br />
;extension=php_dotnet.dll<br />
;extension=php_exif.dll<br />
;extension=php_fbsql.dll<br />
;extension=php_fdf.dll<br />
;extension=php_filepro.dll<br />
;extension=php_gd.dll<br />
;extension=php_gettext.dll<br />
;extension=php_hyperwave.dll<br />
;extension=php_iconv.dll<br />
;extension=php_ifx.dll<br />
;extension=php_iisfunc.dll<br />
;extension=php_imap.dll<br />
;extension=php_<strong>in</strong>gres.dll<br />
;extension=php_<strong>in</strong>terbase.dll<br />
;extension=php_java.dll<br />
;extension=php_ldap.dll<br />
;extension=php_mbstr<strong>in</strong>g.dll<br />
;extension=php_mcrypt.dll<br />
;extension=php_mhash.dll<br />
;extension=php_m<strong>in</strong>g.dll<br />
;extension=php_mssql.dll<br />
;extension=php_oci8.dll<br />
;extension=php_openssl.dll<br />
;extension=php_oracle.dll<br />
;extension=php_pdf.dll<br />
;extension=php_pgsql.dll<br />
;extension=php_pr<strong>in</strong>ter.dll<br />
;extension=php_shmop.dll<br />
;extension=php_snmp.dll<br />
;extension=php_sockets.dll<br />
;extension=php_sybase_ct.dll<br />
;extension=php_tokenizer.dll<br />
;extension=php_w32api.dll<br />
extension=php_xslt.dll<br />
;extension=php_yaz.dll<br />
;extension=php_zlib.dll<br />
;;;;;;;;;;;;;;;;;;;<br />
; Module Sett<strong>in</strong>gs ;<br />
;;;;;;;;;;;;;;;;;;;<br />
[Syslog]<br />
; Whether or not to def<strong>in</strong>e the various syslog variables (e.g. $LOG_PID,<br />
; $LOG_CRON, etc.). Turn<strong>in</strong>g it off is a good idea performance-wise. In<br />
; runtime, you can def<strong>in</strong>e these variables by call<strong>in</strong>g def<strong>in</strong>e_syslog_variables().<br />
def<strong>in</strong>e_syslog_variables = Off<br />
[mail function]<br />
; For W<strong>in</strong>32 only.<br />
SMTP = localhost ; for W<strong>in</strong>32 only<br />
113
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; For W<strong>in</strong>32 only.<br />
sendmail_from = me@localhost.com ; for W<strong>in</strong>32 only<br />
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").<br />
;sendmail_path =<br />
[Java]<br />
;java.class.path = .\php_java.jar<br />
;java.home = c:\jdk<br />
;java.library = c:\jdk\jre\b<strong>in</strong>\hotspot\jvm.dll<br />
;java.library.path = .\<br />
[SQL]<br />
sql.safe_mode = Off<br />
[ODBC]<br />
;odbc.default_db = Not yet implemented<br />
;odbc.default_user = Not yet implemented<br />
;odbc.default_pw = Not yet implemented<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
odbc.allow_persistent = On<br />
; Check that a connection is still valid before reuse.<br />
odbc.check_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
odbc.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent + non-persistent). -1 means no limit.<br />
odbc.max_l<strong>in</strong>ks = -1<br />
; Handl<strong>in</strong>g of LONG fields. Returns number of bytes to variables. 0 means<br />
; passthru.<br />
odbc.defaultlrl = 4096<br />
; Handl<strong>in</strong>g of b<strong>in</strong>ary data. 0 means passthru, 1 return as is, 2 convert to char.<br />
; See the documentation on odbc_b<strong>in</strong>mode and odbc_longreadlen for an explanation<br />
; of uodbc.defaultlrl and uodbc.defaultb<strong>in</strong>mode<br />
odbc.defaultb<strong>in</strong>mode = 1<br />
[MySQL]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
mysql.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
mysql.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent + non-persistent). -1 means no limit.<br />
mysql.max_l<strong>in</strong>ks = -1<br />
; Default port number for mysql_connect(). If unset, mysql_connect() will use<br />
; the $MYSQL_TCP_PORT or the mysql-tcp entry <strong>in</strong> /etc/services or the<br />
; compile-time value def<strong>in</strong>ed MYSQL_PORT (<strong>in</strong> that or<strong>der</strong>). W<strong>in</strong>32 will only look<br />
; at MYSQL_PORT.<br />
mysql.default_port = 3306<br />
; Default socket name for local MySQL connects. If empty, uses the built-<strong>in</strong><br />
; MySQL defaults.<br />
mysql.default_socket =<br />
; Default host for mysql_connect() (doesn't apply <strong>in</strong> safe mode).<br />
mysql.default_host = 127.0.0.1<br />
; Default user for mysql_connect() (doesn't apply <strong>in</strong> safe mode).<br />
mysql.default_user = miowww<br />
; Default password for mysql_connect() (doesn't apply <strong>in</strong> safe mode).<br />
; Note that this is generally a *bad* idea to store passwords <strong>in</strong> this file.<br />
; *Any* user with PHP access can run 'echo cfg_get_var("mysql.default_password")<br />
; and reveal this password! And of course, any users with read access to this<br />
; file will be able to reveal the password as well.<br />
mysql.default_password =<br />
[mSQL]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
msql.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
msql.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent+non persistent). -1 means no limit.<br />
msql.max_l<strong>in</strong>ks = -1<br />
[PostgresSQL]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
pgsql.allow_persistent = On<br />
; Detect broken persistent l<strong>in</strong>ks always with pg_pconnect(). Need a little overhead.<br />
pgsql.auto_reset_persistent = Off<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
pgsql.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent+non persistent). -1 means no limit.<br />
pgsql.max_l<strong>in</strong>ks = -1<br />
[Sybase]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
sybase.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
sybase.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent + non-persistent). -1 means no limit.<br />
114
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
sybase.max_l<strong>in</strong>ks = -1<br />
;sybase.<strong>in</strong>terface_file = "/usr/sybase/<strong>in</strong>terfaces"<br />
; M<strong>in</strong>imum error severity to display.<br />
sybase.m<strong>in</strong>_error_severity = 10<br />
; M<strong>in</strong>imum message severity to display.<br />
sybase.m<strong>in</strong>_message_severity = 10<br />
; Compatability mode with old versions of PHP 3.0.<br />
; If on, this will cause PHP to automatically assign types to results accord<strong>in</strong>g<br />
; to their Sybase type, <strong>in</strong>stead of treat<strong>in</strong>g them all as str<strong>in</strong>gs. This<br />
; compatability mode will probably not stay around forever, so try apply<strong>in</strong>g<br />
; whatever necessary changes to your code, and turn it off.<br />
sybase.compatability_mode = Off<br />
[Sybase-CT]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
sybct.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
sybct.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent + non-persistent). -1 means no limit.<br />
sybct.max_l<strong>in</strong>ks = -1<br />
; M<strong>in</strong>imum server message severity to display.<br />
sybct.m<strong>in</strong>_server_severity = 10<br />
; M<strong>in</strong>imum client message severity to display.<br />
sybct.m<strong>in</strong>_client_severity = 10<br />
[bcmath]<br />
; Number of decimal digits for all bcmath functions.<br />
bcmath.scale = 0<br />
[browscap]<br />
;browscap = extra/browscap.<strong>in</strong>i<br />
[Informix]<br />
; Default host for ifx_connect() (doesn't apply <strong>in</strong> safe mode).<br />
ifx.default_host =<br />
; Default user for ifx_connect() (doesn't apply <strong>in</strong> safe mode).<br />
ifx.default_user =<br />
; Default password for ifx_connect() (doesn't apply <strong>in</strong> safe mode).<br />
ifx.default_password =<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
ifx.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
ifx.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent + non-persistent). -1 means no limit.<br />
ifx.max_l<strong>in</strong>ks = -1<br />
; If on, select statements return the contents of a text blob <strong>in</strong>stead of its id.<br />
ifx.textasvarchar = 0<br />
; If on, select statements return the contents of a byte blob <strong>in</strong>stead of its id.<br />
ifx.byteasvarchar = 0<br />
; Trail<strong>in</strong>g blanks are stripped from fixed-length char columns. May help the<br />
; life of Informix SE users.<br />
ifx.charasvarchar = 0<br />
; If on, the contents of text and byte blobs are dumped to a file <strong>in</strong>stead of<br />
; keep<strong>in</strong>g them <strong>in</strong> memory.<br />
ifx.blob<strong>in</strong>file = 0<br />
; NULL's are returned as empty str<strong>in</strong>gs, unless this is set to 1. In that case,<br />
; NULL's are returned as str<strong>in</strong>g 'NULL'.<br />
ifx.nullformat = 0<br />
[Session]<br />
; Handler used to store/retrieve data.<br />
session.save_handler = files<br />
; Argument passed to save_handler. In the case of files, this is the path<br />
; where data files are stored. Note: W<strong>in</strong>dows users have to change this<br />
; variable <strong>in</strong> or<strong>der</strong> to use PHP's session functions.<br />
session.save_path = C:\php\sessiondata ; argument passed to save_handler<br />
; Whether to use cookies.<br />
session.use_cookies = 1<br />
; Name of the session (used as cookie name).<br />
session.name = PHPSESSID<br />
; Initialize session on request startup.<br />
session.auto_start = 0<br />
; Lifetime <strong>in</strong> seconds of cookie or, if 0, until browser is restarted.<br />
session.cookie_lifetime = 0<br />
; The path for which the cookie is valid.<br />
session.cookie_path = /<br />
; The doma<strong>in</strong> for which the cookie is valid.<br />
session.cookie_doma<strong>in</strong> =<br />
115
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; Handler used to serialize data. php is the standard serializer of PHP.<br />
session.serialize_handler = php<br />
; Percentual probability that the 'garbage collection' process is started<br />
; on every session <strong>in</strong>itialization.<br />
session.gc_probability = 1<br />
; After this number of seconds, stored data will be seen as 'garbage' and<br />
; cleaned up by the garbage collection process.<br />
session.gc_maxlifetime = 1440<br />
; Check HTTP Referer to <strong>in</strong>validate externally stored URLs conta<strong>in</strong><strong>in</strong>g ids.<br />
; HTTP_REFERER has to conta<strong>in</strong> this substr<strong>in</strong>g for the session to be<br />
; consi<strong>der</strong>ed as valid.<br />
session.referer_check =<br />
; How many bytes to read from the file.<br />
session.entropy_length = 0<br />
; Specified here to create the session id.<br />
session.entropy_file =<br />
;session.entropy_length = 16<br />
;session.entropy_file = /dev/urandom<br />
; Set to {nocache,private,public} to determ<strong>in</strong>e HTTP cach<strong>in</strong>g aspects.<br />
session.cache_limiter = nocache<br />
; Document expires after n m<strong>in</strong>utes.<br />
session.cache_expire = 180<br />
; use transient sid support if enabled by compil<strong>in</strong>g with --enable-trans-sid.<br />
session.use_trans_sid = 1<br />
url_rewriter.tags = "a=href,area=href,frame=src,<strong>in</strong>put=src,form=fakeentry"<br />
[MSSQL]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
mssql.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
mssql.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks (persistent+non persistent). -1 means no limit.<br />
mssql.max_l<strong>in</strong>ks = -1<br />
; M<strong>in</strong>imum error severity to display.<br />
mssql.m<strong>in</strong>_error_severity = 10<br />
; M<strong>in</strong>imum message severity to display.<br />
mssql.m<strong>in</strong>_message_severity = 10<br />
; Compatability mode with old versions of PHP 3.0.<br />
mssql.compatability_mode = Off<br />
; Valid range 0 - 2147483647. Default = 4096.<br />
;mssql.textlimit = 4096<br />
; Valid range 0 - 2147483647. Default = 4096.<br />
;mssql.textsize = 4096<br />
; Limits the number of records <strong>in</strong> each batch. 0 = all records <strong>in</strong> one batch.<br />
;mssql.batchsize = 0<br />
[Assertion]<br />
; Assert(expr); active by default.<br />
;assert.active = On<br />
; Issue a PHP warn<strong>in</strong>g for each failed assertion.<br />
;assert.warn<strong>in</strong>g = On<br />
; Don't bail out by default.<br />
;assert.bail = Off<br />
; User-function to be called if an assertion fails.<br />
;assert.callback = 0<br />
; Eval the expression with current error_report<strong>in</strong>g(). Set to true if you want<br />
; error_report<strong>in</strong>g(0) around the eval().<br />
;assert.quiet_eval = 0<br />
[Ingres II]<br />
; Allow or prevent persistent l<strong>in</strong>ks.<br />
<strong>in</strong>gres.allow_persistent = On<br />
; Maximum number of persistent l<strong>in</strong>ks. -1 means no limit.<br />
<strong>in</strong>gres.max_persistent = -1<br />
; Maximum number of l<strong>in</strong>ks, <strong>in</strong>clud<strong>in</strong>g persistents. -1 means no limit.<br />
<strong>in</strong>gres.max_l<strong>in</strong>ks = -1<br />
; Default database (format: [node_id::]dbname[/srv_class]).<br />
<strong>in</strong>gres.default_database =<br />
; Default user.<br />
<strong>in</strong>gres.default_user =<br />
; Default password.<br />
<strong>in</strong>gres.default_password =<br />
[Verisign Payflow Pro]<br />
; Default Payflow Pro server.<br />
pfpro.defaulthost = "test-payflow.verisign.com"<br />
116
CMS für die MIO-Lernumgebung <strong>Anhang</strong> C<br />
; Default port to connect to.<br />
pfpro.defaultport = 443<br />
; Default timeout <strong>in</strong> seconds.<br />
pfpro.defaulttimeout = 30<br />
; Default proxy IP address (if required).<br />
;pfpro.proxyaddress =<br />
; Default proxy port.<br />
;pfpro.proxyport =<br />
; Default proxy logon.<br />
;pfpro.proxylogon =<br />
; Default proxy password.<br />
;pfpro.proxypassword =<br />
[Sockets]<br />
; Use the system read() function <strong>in</strong>stead of the php_read() wrapper.<br />
sockets.use_system_read = On<br />
[com]<br />
; path to a file conta<strong>in</strong><strong>in</strong>g GUIDs, IIDs or filenames of files with TypeLibs<br />
;com.typelib_file =<br />
; allow Distributed-COM calls<br />
;com.allow_dcom = true<br />
; autoregister constants of a components typlib on com_load()<br />
;com.autoregister_typelib = true<br />
; register constants casesensitive<br />
;com.autoregister_casesensitive = false<br />
; show warn<strong>in</strong>gs on duplicate constat registrations<br />
;com.autoregister_verbose = true<br />
[Pr<strong>in</strong>ter]<br />
;pr<strong>in</strong>ter.default_pr<strong>in</strong>ter = ""<br />
[mbstr<strong>in</strong>g]<br />
;mbstr<strong>in</strong>g.<strong>in</strong>ternal_encod<strong>in</strong>g = EUC-JP<br />
;mbstr<strong>in</strong>g.http_<strong>in</strong>put = auto<br />
;mbstr<strong>in</strong>g.http_output = SJIS<br />
;mbstr<strong>in</strong>g.detect_or<strong>der</strong> = auto<br />
;mbstr<strong>in</strong>g.substitute_character = none;<br />
[FrontBase]<br />
;fbsql.allow_persistent = On<br />
;fbsql.autocommit = On<br />
;fbsql.default_database =<br />
;fbsql.default_database_password =<br />
;fbsql.default_host =<br />
;fbsql.default_password =<br />
;fbsql.default_user = "_SYSTEM"<br />
;fbsql.generate_warn<strong>in</strong>gs = Off<br />
;fbsql.max_connections = 128<br />
;fbsql.max_l<strong>in</strong>ks = 128<br />
;fbsql.max_persistent = -1<br />
;fbsql.max_results = 128<br />
;fbsql.batchSize = 1000<br />
; Local Variables:<br />
; tab-width: 4<br />
; End:<br />
117
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
<strong>Anhang</strong> D: Source-Code<br />
1. frame.php<br />
<br />
<br />
<br />
<br />
Untitled Document<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
MIO<br />
<br />
<br />
<br />
Personen<br />
<br />
Gruppen<br />
<br />
<br />
Klassen<br />
<br />
<br />
Themen<br />
<br />
Mikroartikel<br />
<br />
Typen<br />
<br />
<br />
Inputs/Outputs<br />
<br />
<br />
Sternzeichen<br />
<br />
<br />
Blöcke<br />
<br />
<br />
Term<strong>in</strong>e<br />
<br />
<br />
Materialien<br />
<br />
Landschaft<br />
<br />
CMS<br />
Materialübersicht<br />
<br />
Dateiprüfungen<br />
<br />
LogoutBenutzer: <br />
Gruppe(n):<br />
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
if (isset($miodb)){<br />
$miodb->Close();<br />
}<br />
?><br />
2. <strong>in</strong>dex.html<br />
<br />
<br />
Content Management System<br />
<br />
<br />
<br />
<br />
<br />
<br />
3. table_of_contents.html<br />
<br />
<br />
Content Management System<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Ansicht<br />
<br />
<br />
Erstellen<br />
<br />
<br />
Editieren<br />
<br />
<br />
Prüfen<br />
<br />
<br />
Metadaten<br />
<br />
<br />
Archiv<br />
<br />
<br />
<br />
<br />
<br />
4. choose_class.php<br />
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
case "new_content":<br />
$cms_action="new_content";<br />
break;<br />
case "edit_content":<br />
$cms_action="edit_content";<br />
break;<br />
case "check_content":<br />
$cms_action="check_content";<br />
break;<br />
case "manage_metadata":<br />
$cms_action="manage_metadata";<br />
break;<br />
case "archive":<br />
$cms_action="archive";<br />
break;<br />
}<br />
}<br />
else<br />
{<br />
exit;<br />
}<br />
// die Funktion isAdm<strong>in</strong>() wird aus <strong>der</strong> Umgebung (.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php) geladen und überprüft, ob <strong>der</strong> Benutzer<br />
Adm<strong>in</strong>istratorrechte besitzt<br />
// Adm<strong>in</strong>istratoren können auch Lehrtexte aus Klassen, die nicht aktiv s<strong>in</strong>d, erstellen/bearbeiten/prüfen etc.<br />
if (isAdm<strong>in</strong>())<br />
{<br />
$result = $miodb->Execute("select classes.classes_id as classes_id,classname,active from classes");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
else<br />
{<br />
$result = $miodb->Execute("select dist<strong>in</strong>ct classes.classes_id as classes_id,classname,active from<br />
classes,classes_groups,groups_persons where classes.classes_id=classes_groups.classes_id and<br />
classes_groups.groups_id=groups_persons.groups_id and groups_persons.persons_id=".$user_id." and classes.active=1 and not<br />
(classes.classes_id=1)");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
echo "";<br />
echo "Bitte Klasse wählen:";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
if ($result->fields["active"] == 1)<br />
{<br />
$state="aktiv";<br />
}<br />
else<br />
{<br />
$state="nicht aktiv";<br />
}<br />
}<br />
echo "fields["classes_id"] . "\">" . $result->fields["classname"] .", ".$state."";<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
120
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
5. contents.php<br />
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
}<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
function new_content()<br />
{<br />
// diese Funktion zeigt Standardformular zum Erstellen von Dokumenten mit gewähltem E<strong>in</strong>trag <strong>der</strong> Klasse an<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
global $class_id;<br />
global $user_id;<br />
// Lehrtexte erstellen dürfen: alle Referenten <strong>der</strong> spezifischen Klasse und Adm<strong>in</strong>istratoren<br />
$result = $miodb->Execute("select groupname from classes_groups,groups,groups_persons where<br />
classes_groups.classes_id=".$class_id." and classes_groups.groups_id=groups_persons.groups_id and<br />
groups_persons.persons_id=".$user_id." and classes_groups.groups_id=groups.groups_id and groups.groupname like 'Referenten'");<br />
if($result == false) die($miodb->ErrorMsg());<br />
// die Funktion isAdm<strong>in</strong>() wird aus <strong>der</strong> Umgebung (.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php) geladen und überprüft, ob <strong>der</strong> Benutzer<br />
Adm<strong>in</strong>istratorrechte besitzt<br />
if (isAdm<strong>in</strong>() || !$result->EOF)<br />
{<br />
// Str<strong>in</strong>g-Bildung des Inhalts <strong>der</strong> DTD-Datei<br />
$content_dtd = implode('', file('content.dtd'));<br />
// Generieren des xml-str<strong>in</strong>gs<br />
$xml_str = "".$cla<br />
ss_id."";<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content_form.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
}<br />
else<br />
{<br />
echo "Ke<strong>in</strong>e Berechtigung!";<br />
}<br />
}<br />
function edit_content()<br />
{<br />
// diese Funktion generiert e<strong>in</strong> Auswahl-Feld mit den vorhandenen Dokumenten, welche nicht den Status "veraltet" haben<br />
// anschliessend wird "edit_content.php" aufgerufen, um das gewählte Dokument zu editieren<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
global $class_id;<br />
global $user_id;<br />
// Folgende Anfrage lädt alle relevanten Daten, um die Lehrtexte editieren zu können<br />
// über die jo<strong>in</strong>s werden diejenigen herausgefiltert, für welche die Berechtigung zum editieren vorhanden ist und die im Status<br />
"zu prüfen" o<strong>der</strong> "nicht freigegeben" s<strong>in</strong>d<br />
// Lehrtexte editieren dürfen: <strong>der</strong> Autor und Adm<strong>in</strong>istratoren solange <strong>der</strong> Lehrtext nicht geprüft und freigegeben ist<br />
// die Funktion isAdm<strong>in</strong>() wird aus <strong>der</strong> Umgebung (.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php) geladen und überprüft, ob <strong>der</strong> Benutzer<br />
Adm<strong>in</strong>istratorrechte besitzt<br />
if (isAdm<strong>in</strong>())<br />
{<br />
$result = $miodb->Execute("select metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,state,metadata.lock as content_lock,date,content,concat(person_name,' ',person_firstname) as author,theme from<br />
metadata,content,persons,themes,state where content.metadata_id=metadata.metadata_id and metadata.themes_id=themes.themes_id<br />
and persons.persons_id=metadata.persons_id and metadata.state_id=state.state_id and metadata.class_id=".$class_id." and (state<br />
like 'zu prüfen' or state like 'nicht freigegeben') or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
else<br />
{<br />
// falls Benutzer Mitglied <strong>der</strong> klassenspezifischen Studienleitung<br />
$result_Studienleitung = $miodb->Execute("select metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,state,metadata.lock as content_lock,date,content,concat(person_name,' ',person_firstname) as<br />
author,theme,metadata.edit_group_id from metadata,content,persons,themes,state,classes_groups,groups_persons where<br />
content.metadata_id=metadata.metadata_id and metadata.themes_id=themes.themes_id and persons.persons_id=metadata.persons_id and<br />
metadata.state_id=state.state_id and classes_groups.classes_id=".$class_id." and<br />
classes_groups.groups_id=metadata.edit_group_id and classes_groups.groups_id=groups_persons.groups_id and<br />
groups_persons.persons_id=".$user_id." and metadata.class_id=".$class_id." and (state like 'zu prüfen' or state like 'nicht<br />
122
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
freigegeben') or<strong>der</strong> by title,theme");<br />
if($result_Studienleitung == false) die($miodb->ErrorMsg());<br />
// falls Benutzer Autor<br />
$result_Autor = $miodb->Execute("select dist<strong>in</strong>ct metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,state,metadata.lock as content_lock,date,content,concat(person_name,' ',person_firstname) as author,theme from<br />
metadata,content,persons,themes,state where content.metadata_id=metadata.metadata_id and metadata.themes_id=themes.themes_id<br />
and persons.persons_id=metadata.persons_id and metadata.state_id=state.state_id and metadata.persons_id=".$user_id." and<br />
metadata.class_id=".$class_id." and (state like 'zu prüfen' or state like 'nicht freigegeben') or<strong>der</strong> by title,theme");<br />
if($result_Autor == false) die($miodb->ErrorMsg());<br />
if (!$result_Studienleitung->EOF && !$result_Autor->EOF)<br />
{<br />
$result = $miodb->Execute("select dist<strong>in</strong>ct metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,state,metadata.lock as content_lock,date,content,concat(person_name,' ',person_firstname) as<br />
author,theme,metadata.edit_group_id from metadata,content,persons,themes,state,classes_groups,groups_persons where<br />
content.metadata_id=metadata.metadata_id and metadata.themes_id=themes.themes_id and persons.persons_id=metadata.persons_id and<br />
metadata.state_id=state.state_id and ((classes_groups.classes_id=".$class_id." and<br />
classes_groups.groups_id=metadata.edit_group_id and classes_groups.groups_id=groups_persons.groups_id and<br />
groups_persons.persons_id=".$user_id.") or (metadata.persons_id=".$user_id.")) and metadata.class_id=".$class_id." and (state<br />
like 'zu prüfen' or state like 'nicht freigegeben') or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
elseif (!$result_Studienleitung->EOF)<br />
{<br />
$result = $result_Studienleitung;<br />
}<br />
else<br />
{<br />
$result = $result_Autor;<br />
}<br />
}<br />
echo "";<br />
echo "Editieren:";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
// gesperrte Dokumente <strong>in</strong> Auswahlfenster kennzeichnen<br />
if ($result->fields['content_lock'] == 1)<br />
{<br />
$lock = ", gesperrt";<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"] . $lock<br />
."";<br />
}<br />
else<br />
{<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"]<br />
."";<br />
}<br />
}<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
function check_content()<br />
{<br />
// diese Funktion generiert e<strong>in</strong> Auswahl-Feld mit den vorhandenen Dokumenten, welche den Status "zu prüfen" haben<br />
// anschliessend wird "check_content.php" aufgerufen, um das ausgewählte Dokument zu prüfen<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
global $class_id;<br />
global $user_id;<br />
// Folgende Anfrage lädt alle relevanten Daten, um die Lehrtexte prüfen zu können<br />
// über die jo<strong>in</strong>s werden diejenigen herausgefiltert, für welche die Berechtigung zum Prüfen vorhanden ist und die im Status "zu<br />
prüfen" s<strong>in</strong>d<br />
// Lehrtexte prüfen dürfen: die klassenspezifische Studienleitung und Adm<strong>in</strong>istratoren<br />
// die Funktion isAdm<strong>in</strong>() wird aus <strong>der</strong> Umgebung (.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php) geladen und überprüft, ob <strong>der</strong> Benutzer<br />
Adm<strong>in</strong>istratorrechte besitzt<br />
if (isAdm<strong>in</strong>())<br />
{<br />
$result = $miodb->Execute("select metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,class_id,state,date,content,concat(person_name,' ',person_firstname) as author,theme,metadata.lock as content_lock<br />
from metadata,content,persons,themes,state where content.metadata_id=metadata.metadata_id and<br />
themes.themes_id=metadata.themes_id and persons.persons_id=metadata.persons_id and metadata.state_id=state.state_id and state<br />
like 'zu prüfen' and metadata.class_id=".$class_id." or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
else<br />
{<br />
$result = $miodb->Execute("select dist<strong>in</strong>ct metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,class_id,state,date,content,concat(person_name,' ',person_firstname) as author,theme,metadata.lock as<br />
content_lock,check_group_id from metadata,content,persons,themes,state,classes_groups,groups_persons where<br />
content.metadata_id=metadata.metadata_id and themes.themes_id=metadata.themes_id and persons.persons_id=metadata.persons_id and<br />
metadata.state_id=state.state_id and state like 'zu prüfen' and classes_groups.classes_id=".$class_id." and<br />
classes_groups.groups_id=metadata.check_group_id and classes_groups.groups_id=groups_persons.groups_id and<br />
groups_persons.persons_id=".$user_id." and metadata.class_id=".$class_id." or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
echo "";<br />
echo "Prüfen:";<br />
123
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
// gesperrte Dokumente <strong>in</strong> Auswahlfenster kennzeichnen<br />
if ($result->fields['content_lock']==1)<br />
{<br />
$lock = ", gesperrt";<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"] . $lock<br />
."";<br />
}<br />
else<br />
{<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"] .<br />
"";<br />
}<br />
}<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
function archive()<br />
{<br />
// diese Funktion generiert e<strong>in</strong> Auswahl-Feld mit den vorhandenen Dokumenten, welche den Status "veraltet" haben<br />
// anschliessend wird "archive.php" aufgerufen, um das Archiv-Dokument zu betrachten<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
global $class_id;<br />
global $user_id;<br />
// Folgende Anfrage lädt alle relevanten Daten, um die archivierten Lehrtexte anzeigen zu können<br />
// über die jo<strong>in</strong>s werden diejenigen herausgefiltert, für welche die Berechtigung zum anschauen vorhanden ist<br />
// Lehrtexte anschauen dürfen: Referenten <strong>der</strong> spezifischen Klasse und Adm<strong>in</strong>istratoren<br />
// die Funktion isAdm<strong>in</strong>() wird aus <strong>der</strong> Umgebung (.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php) geladen und überprüft, ob <strong>der</strong> Benutzer<br />
Adm<strong>in</strong>istratorrechte besitzt<br />
if (isAdm<strong>in</strong>())<br />
{<br />
$result = $miodb->Execute("select metadata.metadata_id as<br />
metadata_id,title,version,state,date,content,class_id,concat(person_name,' ',person_firstname) as author,theme from<br />
metadata,content,persons,themes,state where metadata.metadata_id=content.metadata_id and metadata.class_id=".$class_id." and<br />
themes.themes_id=metadata.themes_id and persons.persons_id=metadata.persons_id and metadata.state_id=state.state_id and state<br />
like 'veraltet' or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
else<br />
{<br />
$result = $miodb->Execute("select dist<strong>in</strong>ct metadata.metadata_id as<br />
metadata_id,title,version,state,date,content,class_id,concat(person_name,' ',person_firstname) as author,theme from<br />
metadata,content,persons,themes,state,classes_groups,groups_persons,groups where metadata.metadata_id=content.metadata_id and<br />
metadata.class_id=".$class_id." and themes.themes_id=metadata.themes_id and persons.persons_id=metadata.persons_id and<br />
metadata.state_id=state.state_id and state like 'veraltet' and classes_groups.classes_id=metadata.class_id and<br />
classes_groups.groups_id=groups_persons.groups_id and groups_persons.persons_id=".$user_id." and<br />
classes_groups.groups_id=groups.groups_id and groups.groupname like 'Referenten' or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
echo "";<br />
echo "Archiv:";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"] .<br />
"";<br />
}<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
function manage_metadata()<br />
{<br />
// diese Funktion generiert e<strong>in</strong> Auswahl-Feld mit den vorhandenen Dokumenten, welche nicht den Status "veraltet" haben<br />
// anschliessend wird "get_metadata.php" aufgerufen, um die Metadaten des ausgewählte Dokuments zu editieren<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
global $class_id;<br />
global $user_id;<br />
// Folgende Anfrage lädt alle relevanten Daten, um die Metadaten e<strong>in</strong>es Lehrtextes bearbeiten zu können<br />
// über die jo<strong>in</strong>s werden diejenigen herausgefiltert, für welche die Berechtigung zum Bearbeiten vorhanden ist<br />
// Lehrtexte prüfen dürfen: die klassenspezifische Studienleitung und Adm<strong>in</strong>istratoren<br />
// die Funktion isAdm<strong>in</strong>() wird aus <strong>der</strong> Umgebung (.././<strong>in</strong>c/functions_auth.<strong>in</strong>c.php) geladen und überprüft, ob <strong>der</strong> Benutzer<br />
Adm<strong>in</strong>istratorrechte besitzt<br />
if (isAdm<strong>in</strong>())<br />
124
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
{<br />
$result = $miodb->Execute("select metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,class_id,state,date,content,concat(person_name,' ',person_firstname) as author,theme,metadata.lock as<br />
content_lock,content_type from metadata,content,persons,themes,state where content.metadata_id=metadata.metadata_id and<br />
themes.themes_id=metadata.themes_id and persons.persons_id=metadata.persons_id and metadata.state_id=state.state_id and<br />
metadata.class_id=".$class_id." and not (state like 'veraltet') or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
else<br />
{<br />
$result = $miodb->Execute("select dist<strong>in</strong>ct metadata.metadata_id as metadata_id,title,version,metadata.state_id as<br />
state_id,class_id,state,date,content,concat(person_name,' ',person_firstname) as author,theme,metadata.lock as<br />
content_lock,content_type from metadata,content,persons,themes,state,classes_groups,groups,groups_persons where<br />
content.metadata_id=metadata.metadata_id and themes.themes_id=metadata.themes_id and persons.persons_id=metadata.persons_id and<br />
metadata.state_id=state.state_id and metadata.class_id=".$class_id." and not (state like 'veraltet') and<br />
classes_groups.classes_id=".$class_id." and classes_groups.groups_id=metadata.check_group_id and<br />
classes_groups.groups_id=groups_persons.groups_id and groups_persons.persons_id=".$user_id." or<strong>der</strong> by title,theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
echo "";<br />
echo "Metadaten verwalten:";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
// gesperrte Dokumente <strong>in</strong> Auswahlfenster kennzeichnen<br />
if ($result->fields['content_lock']==1)<br />
{<br />
$lock = ", gesperrt";<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"] . $lock<br />
."";<br />
}<br />
else<br />
{<br />
echo "fields["metadata_id"] . "\">" . $result->fields["title"].", ".$result-<br />
>fields["author"].", ".$result->fields["theme"].", Version: ".$result->fields["version"].", ".$result->fields["date"]<br />
."";<br />
}<br />
}<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
6. show_content.php<br />
fields['title']."".$result-<br />
>fields['author']."".$result->fields['persons_id']."".$result-<br />
>fields['theme']."".$result->fields['themes_id']."".$result->fields['content']."";<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
125
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
7. new_content.php<br />
$xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content_form.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
8. edit_content.php<br />
Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// falls zu bearbeitendes Dokument gesperrt<br />
if ($result->fields['content_lock'] == 1)<br />
{<br />
echo "Gewähltes Dokument gesperrt!";<br />
exit;<br />
}<br />
// Sperren des zu bearbeitenden Dokuments<br />
$sql = "update metadata set metadata.lock=1 where metadata_id=".$id;<br />
126
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$sql = "select metadata.metadata_id,title,metadata.persons_id as persons_id,metadata.themes_id,content,concat(person_name,'<br />
',person_firstname) as author,theme,version,class_id from metadata,content,persons,themes where metadata.metadata_id=".$id."<br />
and metadata.metadata_id=content.metadata_id and themes.themes_id=metadata.themes_id and<br />
persons.persons_id=metadata.persons_id or<strong>der</strong> by title,theme";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// Generieren des xml-Str<strong>in</strong>gs<br />
$xml_str = "" .$result->fields['title']."".$result-<br />
>fields['author']."".$result->fields['persons_id']."".$result-<br />
>fields['theme']."".$result->fields['themes_id']."".$result-<br />
>fields['class_id']."".$result->fields['content']."";<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content_form.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content_form.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
9. archive.php<br />
fields['title']."".$result-<br />
>fields['author']."".$result->fields['persons_id']."".$result-<br />
>fields['theme']."".$result->fields['themes_id']."".$result->fields['content']."";<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
127
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
10. check_content.php<br />
fields['title']."".$result-<br />
>fields['author']."".$result->fields['persons_id']."".$result-<br />
>fields['theme']."".$result->fields['themes_id']."".$result->fields['content']."";<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
echo "";<br />
echo "";<br />
echo "Freigeben";<br />
echo "Ablehnen / Überarbeiten";<br />
echo "";<br />
echo "";<br />
echo "";<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
11. set_state.php<br />
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
require("hea<strong>der</strong>.php");<br />
if(isset($_POST['check']))<br />
{<br />
$id = $_POST['id'];<br />
if ($_POST['check'] == 'Freigeben')<br />
{<br />
$sql = "select state_id from state where state like 'freigegeben'";<br />
$state = $miodb->Execute($sql);<br />
if($state == false) die($miodb->ErrorMsg());<br />
$state_id = $state->fields['state_id'];<br />
$sql = "update metadata set state_id='".$state_id."' where metadata_id=".$id;<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
echo "Dokument freigegeben!";<br />
}<br />
else<br />
{<br />
$sql = "select state_id from state where state like 'nicht freigegeben'";<br />
$state = $miodb->Execute($sql);<br />
if($state == false) die($miodb->ErrorMsg());<br />
$state_id = $state->fields['state_id'];<br />
$sql = "update metadata set state_id='".$state_id."' where metadata_id=".$id;<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
echo "Überarbeitung des Dokuments nötig! Bitte Mitteilung an den Autor senden!";<br />
}<br />
}<br />
else<br />
{<br />
echo "access failed!";<br />
}<br />
// bearbeitetes Dokument entsperren<br />
$sql = "update metadata set metadata.lock=0 where metadata_id=".$id;<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
12. get_metadata.php<br />
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
// Haupttitel<br />
echo "Haupttitel: fields['title']."\" size=\"75\"<br />
maxlength=\"200\" style=\"background-color: #dddddc; font-family:Verdana\">";<br />
echo "";<br />
// Autor<br />
$sql_author = "select persons_id,concat(person_name,' ',person_firstname) as author from persons";<br />
$authors = $miodb->Execute($sql_author);<br />
if($authors == false) die($miodb->ErrorMsg());<br />
echo "Autor: ";<br />
while (!$authors->EOF)<br />
{<br />
if ($authors->fields['author'] == $result->fields['author'])<br />
{<br />
echo "fields['persons_id'] . "\">" . $authors->fields['author'] . "";<br />
}<br />
else<br />
{<br />
echo "fields['persons_id'] . "\">" . $authors->fields['author'] . "";<br />
}<br />
$authors->MoveNext();<br />
}<br />
echo "";<br />
echo "";<br />
// Thema<br />
$sql_theme = "select themes_id,theme from themes";<br />
$themes = $miodb->Execute($sql_theme);<br />
if($themes == false) die($miodb->ErrorMsg());<br />
echo "Thema: ";<br />
while (!$themes->EOF)<br />
{<br />
if ($themes->fields['theme'] == $result->fields['theme'])<br />
{<br />
echo "fields['themes_id'] . "\">" . $themes->fields['theme'] . "";<br />
}<br />
else<br />
{<br />
echo "fields['themes_id'] . "\">" . $themes->fields['theme'] . "";<br />
}<br />
$themes->MoveNext();<br />
}<br />
echo "";<br />
echo "";<br />
// Version<br />
echo "Version: fields['version']."\"<br />
size=\"5\" maxlength=\"5\" style=\"background-color: #dddddc; font-family:Verdana\"> (nicht editierbar)";<br />
echo "";<br />
// Status<br />
$sql_state = "select state_id,state from state";<br />
$states = $miodb->Execute($sql_state);<br />
if($states == false) die($miodb->ErrorMsg());<br />
echo "Status: ";<br />
while (!$states->EOF)<br />
{<br />
if ($states->fields['state'] == $result->fields['state'])<br />
{<br />
echo "fields['state_id'] . "\">" . $states->fields['state'] . "";<br />
}<br />
else<br />
{<br />
echo "fields['state_id'] . "\">" . $states->fields['state'] . "";<br />
}<br />
$states->MoveNext();<br />
}<br />
echo "";<br />
echo "";<br />
// Erstellungsdatum<br />
echo "Erstellungsdatum: fields['date']."\"<br />
size=\"10\" maxlength=\"10\" style=\"background-color: #dddddc; font-family:Verdana\"> (nicht editierbar)";<br />
echo "";<br />
// Gruppe mit Leserechten<br />
$sql_group = "select groups_id,groupname from groups";<br />
$groups = $miodb->Execute($sql_group);<br />
if($groups == false) die($miodb->ErrorMsg());<br />
echo "Gruppe mit Prüfrechten: ";<br />
while (!$groups->EOF)<br />
{<br />
if ($groups->fields['groups_id'] == $result->fields['check_group_id'])<br />
{<br />
echo "fields['groups_id'] . "\">" . $groups->fields['groupname'] . "";<br />
}<br />
else<br />
{<br />
echo "fields['groups_id'] . "\">" . $groups->fields['groupname'] . "";<br />
}<br />
$groups->MoveNext();<br />
130
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
}<br />
echo "";<br />
echo "";<br />
// Gruppe mit Schreibrechten<br />
$sql_group = "select groups_id,groupname from groups";<br />
$groups = $miodb->Execute($sql_group);<br />
if($groups == false) die($miodb->ErrorMsg());<br />
echo "Gruppe mit Schreibrechten: ";<br />
while (!$groups->EOF)<br />
{<br />
if ($groups->fields['groups_id'] == $result->fields['edit_group_id'])<br />
{<br />
echo "fields['groups_id'] . "\">" . $groups->fields['groupname'] . "";<br />
}<br />
else<br />
{<br />
echo "fields['groups_id'] . "\">" . $groups->fields['groupname'] . "";<br />
}<br />
$groups->MoveNext();<br />
}<br />
echo "";<br />
echo "";<br />
// Klasse zu welcher lehrtext gehört<br />
$sql_class = "select classes_id,classname from classes";<br />
$classes = $miodb->Execute($sql_class);<br />
if($classes == false) die($miodb->ErrorMsg());<br />
echo "Klasse: ";<br />
while (!$classes->EOF)<br />
{<br />
if ($classes->fields['classes_id'] == $result->fields['class_id'])<br />
{<br />
echo "fields['classes_id'] . "\">" . $classes->fields['classname'] .<br />
"";<br />
}<br />
else<br />
{<br />
echo "fields['classes_id'] . "\">" . $classes->fields['classname'] . "";<br />
}<br />
$classes->MoveNext();<br />
}<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
13. set_metadata.php<br />
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
14. edit_xml.php<br />
Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$author = $result->fields["person_name"]." ". $result->fields["person_firstname"];<br />
}<br />
// Dekodieren <strong>der</strong> URL-codierten Variable<br />
$post_str<strong>in</strong>g = urldecode($_POST['post_str<strong>in</strong>g']);<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
// Button "Thema wählen" gedrückt<br />
elseif (isset($_POST['select_theme']))<br />
{<br />
select_theme();<br />
exit;<br />
}<br />
elseif (!empty($_POST['new_theme']))<br />
{<br />
if (!empty($_POST['new_comment']))<br />
132
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
}<br />
{<br />
$comment = $_POST['new_comment'];<br />
}<br />
else<br />
{<br />
$comment = "";<br />
}<br />
$theme = $_POST['new_theme'];<br />
// neues Thema <strong>in</strong> DB speichern<br />
$sql = "<strong>in</strong>sert <strong>in</strong>to themes values ('','".$comment."','".$theme."')";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// Herausf<strong>in</strong>den <strong>der</strong> theme_id des neu gespeicherten Themas<br />
$sql = "select max(themes_id) as themes_id from themes";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$themes_id = $result->fields["themes_id"];<br />
// Dekodieren <strong>der</strong> URL-codierten Variable<br />
$post_str<strong>in</strong>g = urldecode($_POST['post_str<strong>in</strong>g']);<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
//Thema gewählt, Aufruf von edit_xml.php durch Funktion select_theme()<br />
elseif (isset($_POST['selected_theme']))<br />
{<br />
$themes_id = $_POST['selected_theme'];<br />
}<br />
// <strong>der</strong> themes_id zugehöriges Thema herausf<strong>in</strong>den<br />
$sql = "select theme from themes where themes_id=".$_POST['selected_theme']." or<strong>der</strong> by theme";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$theme = $result->fields["theme"];<br />
// Dekodieren <strong>der</strong> URL-codierten Variable<br />
$post_str<strong>in</strong>g = urldecode($_POST['post_str<strong>in</strong>g']);<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
// Button "L<strong>in</strong>k/Bild e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_l<strong>in</strong>k']))<br />
{<br />
<strong>in</strong>sert_l<strong>in</strong>k();<br />
exit;<br />
}<br />
//L<strong>in</strong>k gewählt, Aufruf von edit_xml.php durch Funktion <strong>in</strong>sert_l<strong>in</strong>k()<br />
elseif (!empty($_POST['l<strong>in</strong>k_form']))<br />
{<br />
// Dekodieren <strong>der</strong> URL-codierten Variable<br />
$post_str<strong>in</strong>g = urldecode($_POST['post_str<strong>in</strong>g']);<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
//Position des Feldes herausf<strong>in</strong>den, <strong>in</strong> welches <strong>der</strong> L<strong>in</strong>k e<strong>in</strong>gefügt werden soll<br />
for($i=0;$iExecute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$author = $result->fields["person_name"]." ". $result->fields["person_firstname"];<br />
// L<strong>in</strong>k-Str<strong>in</strong>g kreieren, <strong>der</strong> <strong>in</strong> Textarea e<strong>in</strong>gefügt wird<br />
$l<strong>in</strong>k = "fields["persons_id"] . "\">" .<br />
$result->fields["username"] . "";<br />
}<br />
//L<strong>in</strong>k zu Element e<strong>in</strong>fügen<br />
$sql_type = "select type_id, type from type";<br />
$type = $miodb->Execute($sql_type);<br />
while (!$type->EOF)<br />
{<br />
// die von <strong>in</strong>sert_l<strong>in</strong>k() überlieferte Variable heisst z.B. für den Typ Zitat: "l<strong>in</strong>k_element_zitat"<br />
$l<strong>in</strong>k_element = "l<strong>in</strong>k_element_".$type->fields['type'];<br />
if (!empty($_POST[$l<strong>in</strong>k_element]))<br />
{<br />
133
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
$l<strong>in</strong>k_type = $type->fields['type'];<br />
$l<strong>in</strong>k_element = $_POST[$l<strong>in</strong>k_element];<br />
$sql = "select title from elements where elements_id=".$l<strong>in</strong>k_element;<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$l<strong>in</strong>k = "" . $result-<br />
>fields["title"] . "";<br />
break;<br />
}<br />
}<br />
}<br />
$type->MoveNext();<br />
//L<strong>in</strong>k zu Email-Adresse e<strong>in</strong>fügen<br />
if (!empty($_POST['l<strong>in</strong>k_mail']))<br />
{<br />
$mail = $_POST['l<strong>in</strong>k_mail'];<br />
$l<strong>in</strong>k = "" . $mail ."";<br />
}<br />
//WWW-L<strong>in</strong>k e<strong>in</strong>fügen<br />
if (!empty($_POST['www_l<strong>in</strong>k']))<br />
{<br />
$mail = $_POST['www_l<strong>in</strong>k'];<br />
$l<strong>in</strong>k = "" . $mail ."";<br />
}<br />
//L<strong>in</strong>k zu Bild e<strong>in</strong>fügen<br />
elseif (!empty($_POST['image']))<br />
{<br />
// Bil<strong>der</strong> s<strong>in</strong>d im Verzeichnis "../files/images" gespeichert<br />
$img = "./../files/images/". urldecode($_POST['image']);<br />
$image = "";<br />
}<br />
// Dekodieren <strong>der</strong> URL-codierten Variable<br />
$post_str<strong>in</strong>g = urldecode($_POST['post_str<strong>in</strong>g']);<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
// Button "Löschen" gedrückt<br />
elseif (isset($_POST['delete_field']))<br />
{<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = stripslashes($key);<br />
$val = stripslashes($val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
// das gesuchte Arrayfeld steht e<strong>in</strong> Feld vor dem E<strong>in</strong>trag "delete_field=löschen"<br />
$array_field_to_delete = array_search("delete_field=löschen", $vars)-1;<br />
$i = $array_field_to_delete;<br />
do {<br />
$vars[$i] = $vars[$i+1];<br />
$i++;<br />
}<br />
while ($i+1 < count($vars));<br />
// die ersten 6 fel<strong>der</strong> nicht löschbar (title,author,author_id,theme,theme_id,class_id), weil aber array bei 0 und nicht<br />
bei 1 beg<strong>in</strong>nt, müssen nur 5 feld-Nummern abgezogen werden<br />
$field_no_to_delete = $array_field_to_delete-5;<br />
}<br />
$x = count($vars);<br />
// Button "Textarea e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_textarea']))<br />
{<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = stripslashes($key);<br />
$val = stripslashes($val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
//Fel<strong>der</strong> title,author,author_id,theme,theme_id,class_id (weil diese ausserhalb des "content"-Bereichs liegen) + Insert-<br />
Button = 7 abziehen<br />
$post_str<strong>in</strong>g .= "textarea_no_".(count($vars)-7)."=";<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
134
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
}<br />
$x = count($vars);<br />
// Button "Untertitel1 e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_subtitle']))<br />
{<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = stripslashes($key);<br />
$val = stripslashes($val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
//Fel<strong>der</strong> title,author,author_id,theme,theme_id,class_id (weil diese ausserhalb des "content"-Bereichs liegen) + Insert-<br />
Button = 7 abziehen<br />
$post_str<strong>in</strong>g .= "subtitle_no_".(count($vars)-7)."=";<br />
}<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
// Button "Untertitel2 e<strong>in</strong>fügen" gedrückt<br />
elseif (isset($_POST['<strong>in</strong>sert_sub_subtitle']))<br />
{<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = stripslashes($key);<br />
$val = stripslashes($val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
//Fel<strong>der</strong> title,author,author_id,theme,theme_id,class_id (weil diese ausserhalb des "content"-Bereichs liegen) + Insert-<br />
Button = 7 abziehen<br />
$post_str<strong>in</strong>g .= "sub_subtitle_no_".(count($vars)-7)."=";<br />
}<br />
// Zerlegen von $post_str<strong>in</strong>g und speichern <strong>der</strong> Stücke im Array $vars<br />
$vars = explode('&',$post_str<strong>in</strong>g);<br />
$x = count($vars);<br />
// Variable, welche die id-nr <strong>der</strong> Elemente des "Content"-Bereichs festlegt<br />
$element_count = 1;<br />
// Variable, welche den Content für die Datenbank speichert, die Fel<strong>der</strong> ma<strong>in</strong>title,author,theme werden <strong>in</strong> <strong>der</strong> DB separat<br />
gespeichert (Metadaten)<br />
$content = "";<br />
// <strong>in</strong> <strong>der</strong> folgenden for-Schleife wird e<strong>in</strong> xml-Str<strong>in</strong>g erstellt<br />
for($i=0;$i
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
}<br />
case "theme":<br />
$xml_str .= "" . $item[1] . "";<br />
// für DB<br />
$author_id = $item[1];<br />
break;<br />
// falls neues Thema,Kommentar e<strong>in</strong>gegeben o<strong>der</strong> e<strong>in</strong> Thema gewählt<br />
if ((!empty($_POST['new_theme'])) | isset($_POST['selected_theme']))<br />
{<br />
$xml_str .= "" . $theme . "";<br />
break;<br />
}<br />
else<br />
{<br />
$xml_str .= "" . $item[1] . "";<br />
}<br />
// für DB<br />
$theme = $item[1];<br />
break;<br />
case "theme_id":<br />
// falls neues Thema,Kommentar e<strong>in</strong>gegeben o<strong>der</strong> e<strong>in</strong> Thema gewählt<br />
if ((!empty($_POST['new_theme'])) | isset($_POST['selected_theme']))<br />
{<br />
$xml_str .= "" . $themes_id . "";<br />
break;<br />
}<br />
else<br />
{<br />
$xml_str .= "" . $item[1] . "";<br />
}<br />
// für DB<br />
$themes_id = $item[1];<br />
break;<br />
case "class_id":<br />
$xml_str .= "" . $item[1] . "";<br />
// für DB<br />
$class_id = $item[1];<br />
break;<br />
case "subtitle_no_".$element_count:<br />
// falls Feld-Nr e<strong>in</strong>es zu löschenden Feldes gegeben und Element-counter entsprechendes schon erreicht,<br />
// wird das zu löschende Feld mit demjenigen zur Rechten überschrieben und alle nachfolgenden Fel<strong>der</strong> e<strong>in</strong>e Position<br />
nach l<strong>in</strong>ks verschoben<br />
if (isset($field_no_to_delete) && ($element_count > $field_no_to_delete))<br />
{<br />
$shift_fields_left=1;<br />
}<br />
else<br />
{<br />
$shift_fields_left=0;<br />
}<br />
$xml_str .= "" . $item[1] . "";<br />
$content .= "" . $item[1] . "";<br />
$element_count++;<br />
break;<br />
case "sub_subtitle_no_".$element_count:<br />
// falls Feld-Nr e<strong>in</strong>es zu löschenden Feldes gegeben und Element-counter entsprechendes schon erreicht,<br />
// wird das zu löschende Feld mit demjenigen zur Rechten überschrieben und alle nachfolgenden Fel<strong>der</strong> e<strong>in</strong>e Position<br />
nach l<strong>in</strong>ks verschoben<br />
if (isset($field_no_to_delete) && ($element_count > $field_no_to_delete))<br />
{<br />
$shift_fields_left=1;<br />
}<br />
else<br />
{<br />
$shift_fields_left=0;<br />
}<br />
$xml_str .= "" . $item[1] . "";<br />
$content .= "" . $item[1] . "";<br />
$element_count++;<br />
break;<br />
case "textarea_no_".$element_count:<br />
// die vor <strong>der</strong> switch-Anweisung irrtümlich geteilten Stücke (falls im Text <strong>der</strong> Textarea "="-Zeichen vorkommen)<br />
werden wie<strong>der</strong> zusammengefügt<br />
$text = $item[1];<br />
for ($j=2;$j $field_no_to_delete))<br />
136
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
{<br />
$shift_fields_left=1;<br />
}<br />
else<br />
{<br />
$shift_fields_left=0;<br />
}<br />
// falls e<strong>in</strong> L<strong>in</strong>k e<strong>in</strong>gefügt werden soll und die Feldposition stimmt<br />
if (!empty($l<strong>in</strong>k) && $element_count == $field_pos)<br />
{<br />
$xml_str .= "" . $hr_xml . $l<strong>in</strong>k . "";<br />
$content .= "" . $hr_xml . $l<strong>in</strong>k . "";<br />
$element_count++;<br />
break;<br />
}<br />
// falls e<strong>in</strong> Bild e<strong>in</strong>gefügt werden soll und die Feldposition stimmt<br />
elseif (!empty($image) && $element_count == $field_pos)<br />
{<br />
$xml_str .= "" . $hr_xml . $image . "";<br />
$content .= "" . $hr_xml . $image . "";<br />
$element_count++;<br />
break;<br />
}<br />
else<br />
{<br />
$xml_str .= "" . $hr_xml . "";<br />
$content .= "" . $hr_xml . "";<br />
$element_count++;<br />
break;<br />
}<br />
case "delete_field":<br />
// falls <strong>der</strong> Zeiger auf das zu löschende Feld zeigt, wird nur <strong>der</strong> Counter erhöht und beim nächsten switch-<br />
Durchgang das nachfolgende Feld an die aktuelle Position geschrieben<br />
$element_count++;<br />
break;<br />
}<br />
}<br />
// Ergänzen <strong>der</strong> xml-Str<strong>in</strong>gs<br />
$content .= "";<br />
$xml_str = "" . $xml_str . "";<br />
// Str<strong>in</strong>g-Bildung vom Inhalt <strong>der</strong> DTD-Datei<br />
$content_dtd = implode('', file('content.dtd'));<br />
// falls Button "Version erstellen" gedrückt, wird <strong>der</strong> xml-Str<strong>in</strong>g als Ausgabe (template:content.xsl) gespeichert und das<br />
Dokument <strong>in</strong> die DB e<strong>in</strong>getragen<br />
// sonst wird nur <strong>der</strong> xml-Str<strong>in</strong>g als Formular (template:content_form.xsl) gespeichert<br />
if (isset($_POST['new_version']))<br />
{<br />
$sql = "select metadata_id, version, metadata.state_id, state.state_id, state.state, class_id, edit_group_id,<br />
check_group_id from metadata,state where title='". $ma<strong>in</strong>title."' and persons_id=". $author_id." and themes_id=". $themes_id."<br />
and metadata.state_id=state.state_id and not (state like 'veraltet')";<br />
$result = $miodb->Execute($sql);<br />
$id = $result->fields['metadata_id'];<br />
if(!$result == false && !$result->EOF)<br />
{<br />
// die Werte von check_group_id und edit_group_id werden von <strong>der</strong> alten Version übernommen<br />
$check_group_id = $result->fields['check_group_id'];<br />
$edit_group_id = $result->fields['edit_group_id'];<br />
// falls e<strong>in</strong>e ältere Version des aktuellen Dokuments existiert, wird die Versions-Nr um e<strong>in</strong>s erhöht<br />
@$version = ($result->fields['version'])+1;<br />
// das ältere Dokument erhält den Status "veraltet"<br />
$sql = "select state_id from state where state like 'veraltet'";<br />
$state = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$sql = "update metadata set metadata.state_id=".$state->fields['state_id']." where metadata_id=".$id;<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// das ältere Dokument wird entsperrt<br />
$sql = "update metadata set metadata.lock=0 where metadata_id=".$id;<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
else<br />
{<br />
// Standardwert für check_group_id und edit_group_id ist die Studienleitung <strong>der</strong> spezifischen Klasse<br />
$sql = "select groups.groups_id as groups_id from groups,classes_groups where<br />
classes_groups.classes_id=".$class_id." and classes_groups.groups_id=groups.groups_id and groups.groupname like<br />
'Studienleitung'";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
}<br />
if (!$result->EOF)<br />
{<br />
$check_group_id = $result->fields['groups_id'];<br />
$edit_group_id = $result->fields['groups_id'];<br />
}<br />
else<br />
{<br />
$check_group_id = 1;<br />
$edit_group_id = 1;<br />
}<br />
@$version=1;<br />
137
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
// Ergänzen des xml-Str<strong>in</strong>gs<br />
$xml_str = "" . $xml_str;<br />
// aktuelles Datum<br />
$today = date("Y-m-d");<br />
$sql = "select state_id from state where state like 'zu prüfen'";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
$standard_state = $result->fields['state_id'];<br />
// Schreiben des neuen Dokuments <strong>in</strong> die DB mit Status "zu prüfen"<br />
$result_metadata = $miodb->Execute("<strong>in</strong>sert <strong>in</strong>to metadata values ('','".$ma<strong>in</strong>title."','".<br />
$author_id."','".$themes_id."','','" . $version."','" .$standard_state."','" . $today."','','" .$edit_group_id."','".<br />
$check_group_id."','".$class_id."')");<br />
if($result_metadata == false) die($miodb->ErrorMsg());<br />
}<br />
// Herausf<strong>in</strong>den <strong>der</strong> metadata_id <strong>der</strong> neu gespeicherten Metadaten<br />
$max_id = $miodb->Execute("select max(metadata_id) as metadata_id from metadata");<br />
if($max_id == false) die($miodb->ErrorMsg());<br />
$metadata_id = $max_id->fields['metadata_id'];<br />
$result_content = $miodb->Execute("<strong>in</strong>sert <strong>in</strong>to content values ('','".$content."','".$metadata_id."')");<br />
if($result_content == false) die($miodb->ErrorMsg());<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content_form.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser als Formular<br />
echo $result;<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
xslt_free($x);<br />
else<br />
{<br />
// Ergänzen des xml-Str<strong>in</strong>gs<br />
$xml_str = " " . $xml_str;<br />
$args = array('/_xml' => $xml_str);<br />
// XSLT-Prozessor<br />
$x = xslt_create();<br />
// Transformation des XML-Str<strong>in</strong>gs mit XSL-Stylesheet content.xsl<br />
$result = xslt_process($x, 'arg:/_xml', 'content_form.xsl', NULL, $args);<br />
if ($result)<br />
{<br />
// Anzeige im Browser<br />
echo $result;<br />
// nach Bearbeitung des Templates wird nach unten zum letzten Feld gescrollt (diese Anweisung ist nur mit e<strong>in</strong>er<br />
Browser-basierten Skriptsprache möglich)<br />
echo "";<br />
echo "{";<br />
echo "w<strong>in</strong>dow.scrollTo(0,10000000);";<br />
echo "}";<br />
echo "";<br />
}<br />
else<br />
{<br />
echo xslt_error($x);<br />
}<br />
}<br />
}<br />
xslt_free($x);<br />
// Folgende Funktionen werden je nach Inhalt <strong>der</strong> $_POST-Variablen am Anfang <strong>der</strong> ma<strong>in</strong>()-Funktion aufgerufen<br />
// nach Abarbeiten des jeweiligen Funktions-codes wird durch submit-Aktion das Formular abgeschickt<br />
// da im Formular-Kopf ke<strong>in</strong> "action"-Attribut angegeben ist, wird nach <strong>der</strong> submit-Aktion edit_xml.php erneut aufgerufen<br />
function select_author()<br />
{<br />
// <strong>in</strong> dieser Funktion wird e<strong>in</strong> Auswahlfeld mit den vorhandenen Autoren generiert<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = urlencode(stripslashes($key));<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
$val = urlencode(stripslashes($val));<br />
138
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
$result = $miodb->Execute("select persons_id,username,person_firstname,person_name from persons or<strong>der</strong> by<br />
person_name,person_firstname");<br />
if($result == false) die($miodb->ErrorMsg());<br />
echo "";<br />
echo "Autor/<strong>in</strong> wählen:";<br />
echo "";<br />
echo "";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
echo "fields["persons_id"] . "\">" . $result->fields["username"] .", ".$result-<br />
>fields["person_name"] .", " .$result->fields["person_firstname"] ."";<br />
}<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
function select_theme()<br />
{<br />
// <strong>in</strong> dieser Funktion wird e<strong>in</strong> Auswahlfeld mit den vorhandenen Themen generiert<br />
// ausserdem werden Fel<strong>der</strong> generiert, mit welchen neue Themen e<strong>in</strong>gegeben werden können<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = urlencode(stripslashes($key));<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
$val = urlencode(stripslashes($val));<br />
}<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
$result = $miodb->Execute("select themes_id,comment,theme from themes or<strong>der</strong> by theme");<br />
if($result == false) die($miodb->ErrorMsg());<br />
echo "";<br />
echo "Vorhandenes Thema wählen:";<br />
echo "";<br />
echo "";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
if (!empty($result->fields["comment"]))<br />
{<br />
$comment = ", ".$result->fields["comment"];<br />
}<br />
else<br />
{<br />
$comment = "";<br />
}<br />
}<br />
echo "fields["themes_id"] . "\">" .$result->fields["theme"] . $comment . "";<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "Neues Thema e<strong>in</strong>geben:";<br />
echo "";<br />
echo "Kommentar:";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "Thema:";<br />
echo "";<br />
echo" ";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
139
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
echo "";<br />
}<br />
function <strong>in</strong>sert_l<strong>in</strong>k()<br />
{<br />
// <strong>in</strong> dieser Funktion werden Auswahlfeld mit den vorhandenen Personen,Elementen und Bil<strong>der</strong> generiert<br />
// ausserdem wird e<strong>in</strong> Feld generiert, mit welchem e<strong>in</strong>e Email-Adresse e<strong>in</strong>gefügt werden kann<br />
// die Auswahl wird anschliessend als L<strong>in</strong>k-Tag <strong>in</strong> die Textarea e<strong>in</strong>gefügt<br />
// globale Variablen müssen <strong>in</strong>nerhalb von Funktionen als solche def<strong>in</strong>iert werden<br />
global $miodb;<br />
while(list($key, $val) = each($_POST))<br />
{<br />
$key = urlencode(stripslashes($key));<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("/\015/","",$val);<br />
$val = preg_replace("//","",$val);<br />
}<br />
$val = urlencode(stripslashes($val));<br />
@$post_str<strong>in</strong>g .= "$key=$val&";<br />
$result = $miodb->Execute("select persons_id,username,signs_id,concat(person_name,' ',person_firstname) as person from persons<br />
or<strong>der</strong> by person");<br />
if($result == false) die($miodb->ErrorMsg());<br />
echo "";<br />
echo "";<br />
echo "";<br />
// L<strong>in</strong>k zu Person e<strong>in</strong>fügen<br />
echo "L<strong>in</strong>k zu Person e<strong>in</strong>fügen:";<br />
echo "";<br />
echo "";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
echo "fields["persons_id"] . "\">" . $result->fields["username"].", ".$result-<br />
>fields["person"]. "";<br />
}<br />
$result->MoveNext();<br />
echo "";<br />
echo "";<br />
echo "";<br />
// L<strong>in</strong>k zu Email-Adresse e<strong>in</strong>fügen<br />
echo "L<strong>in</strong>k zu Email-Adresse e<strong>in</strong>fügen:";<br />
echo "";<br />
echo "(z.B. hans.muster@muster.com)";<br />
echo "";<br />
//WWW-L<strong>in</strong>k e<strong>in</strong>fügen<br />
echo "WWW-L<strong>in</strong>k e<strong>in</strong>fügen:";<br />
echo "";<br />
echo "(z.B. http://www.muster.com)";<br />
echo "";<br />
$sql_type = "select type_id, type from type";<br />
$type = $miodb->Execute($sql_type);<br />
$sql ="select elements_id,elements.type_id as type_id,type, persons_id, groups_id, title,text,forplenum, version, timestamp<br />
from elements, type where elements.type_id=type.type_id";<br />
$result = $miodb->Execute($sql);<br />
if($result == false) die($miodb->ErrorMsg());<br />
// L<strong>in</strong>k zu Element e<strong>in</strong>fügen<br />
while (!$type->EOF)<br />
{<br />
echo "L<strong>in</strong>k zu ".$type->fields['type']." e<strong>in</strong>fügen:";<br />
echo "fields['type']."\">";<br />
echo "";<br />
echo "";<br />
while (!$result->EOF)<br />
{<br />
if ($result->fields['type_id'] == $type->fields['type_id'])<br />
{<br />
echo "fields['elements_id'] . "\">" . $result->fields['title']."";<br />
}<br />
}<br />
$result->MoveNext();<br />
$result->MoveFirst();<br />
echo "";<br />
echo "";<br />
$type->MoveNext();<br />
}<br />
echo "";<br />
140
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
echo "Bild e<strong>in</strong>fügen:";<br />
echo "";<br />
echo "";<br />
// Bil<strong>der</strong> s<strong>in</strong>d im Verzeichnis ./../files/images gespeichert<br />
$handle = opendir('./../files/images');<br />
while ($file = readdir ($handle))<br />
{<br />
if ($file != "." && $file != "..")<br />
{<br />
echo "".$file."";<br />
}<br />
}<br />
closedir($handle);<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
echo "";<br />
}<br />
// E<strong>in</strong>b<strong>in</strong>den des Footers<br />
require("footer.php");<br />
?><br />
15. content.xsl<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Autor/<strong>in</strong>: <br />
<br />
<br />
<br />
<br />
<br />
Thema: <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
141
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
16. content_form.xsl<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Haupttitel:<br />
<br />
<br />
<br />
<br />
Autor/<strong>in</strong>: <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Thema: <br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
 <br />
 <br />
 <br />
<br />
<br />
Untertitel1:<br />
subtitle_<br />
<br />
<br />
<br />
<br />
Untertitel2:<br />
<br />
sub_subtitle_<br />
<br />
142
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
<br />
<br />
<br />
Textarea: textarea_<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
17. content.dtd<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
18. Bedienungsanleitung_CMS.html<br />
<br />
<br />
Bedienungsanleitung CMS<br />
<br />
<br />
143
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
Bedienungsanleitung<br />
für das Content Management System <strong>der</strong> MIO-Lernumgebung<br />
<br />
Inhaltsverzeichnis<br />
<br />
1. E<strong>in</strong>führung<br />
2. Bedienung<br />
2.1. Hauptfenster<br />
2.2. Funktionen<br />
2.2.1. Funktion Ansicht<br />
2.2.2. Funktion Erstellen<br />
2.2.3. Funktion Editieren<br />
2.2.4. Funktion Prüfen<br />
2.2.5. Metadaten verwalten<br />
2.2.6. Archiv<br />
<br />
1. E<strong>in</strong>führung<br />
Was ist das Content Management System (CMS)?<br />
Das CMS unterstützt die Verfasser von Lehrtexten (folgend Dokument genannt) für die<br />
MIO-Lernumgebung bei ihrer Arbeit.<br />
Die E<strong>in</strong>gabe <strong>der</strong> Lehrtexte erfolgt über e<strong>in</strong> Formular, welches dynamisch durch den Verfasser<br />
verän<strong>der</strong>t werden kann und so e<strong>in</strong>e flexible Umgebung zur Verfügung stellt.<br />
Die Lehrtexte können ähnlich wie <strong>in</strong> e<strong>in</strong>er Textverarbeitung manipuliert und zusätzlich<br />
durch e<strong>in</strong>e Auswahl an HTML-Tags ergänzt werden.<br />
<br />
Was braucht man zur Nutzung?<br />
<br />
Je nach vorhandenen Benutzerrechten ist die Auswahl <strong>der</strong> editierbaren Texte mehr o<strong>der</strong><br />
weniger e<strong>in</strong>geschränkt.<br />
Über den Menüpunkt "CMS" <strong>in</strong> <strong>der</strong> Menüleiste <strong>der</strong> MIO-Lernumgebung kann auf das<br />
System zugegriffen werden.<br />
<br />
<br />
2. Bedienung<br />
2.1. Hauptfenster<br />
Nach dem Start des CMS präsentiert sich die Hauptseite als e<strong>in</strong> <strong>in</strong> zwei Frames<br />
aufgeteiltes Fenster, von welchen <strong>der</strong> obere die Navigations- und <strong>der</strong> untere den<br />
Contentbereich be<strong>in</strong>haltet. Im Contentbereich wird jeweils <strong>der</strong> gewünschte Inhalt angezeigt.<br />
<br />
<br />
Abb.: Hauptfenster<br />
<br />
2.2. Funktionen<br />
Die Menüleiste des Navigationsbereichs be<strong>in</strong>haltet die Funktionen Ansicht, Erstellen,<br />
Editieren, Prüfen von Content, Verwalten <strong>der</strong> Metadaten und Archiv-Ansicht.<br />
Im Folgenden werden diese Funktionen erklärt.<br />
<br />
2.2.1. Funktion Ansicht<br />
Über die Ansicht können die aktuellen Versionen <strong>der</strong> Dokumente angeschaut werden, sofern<br />
die benötigten Rechte vorhanden s<strong>in</strong>d.<br />
Das Anwählen des "Ansicht"-L<strong>in</strong>ks öffnet e<strong>in</strong> Auswahlfenster mit den vorhandenen<br />
Klassen. Nach Auswahl <strong>der</strong> gewünschten Klasse und <strong>der</strong> anschliessenden Bestätigung über<br />
den "ok"-Knopf öffnet sich e<strong>in</strong> weiteres Auswahlfenster, welches die aktuellen Versionen<br />
<strong>der</strong> Dokumente zu dieser Klasse auflistet. Jede Zeile enthält Titel, Autor, Thema, Version<br />
und Erstellungsdatum des jeweiligen Dokuments.<br />
Ist e<strong>in</strong>e Wahl getroffen, wird nach Betätigung des "ok"-Knopfs das gewünschte<br />
Dokument angezeigt.<br />
<br />
<br />
Abb.: Ansicht<br />
<br />
2.2.2. Funktion Erstellen<br />
Das Erstellen e<strong>in</strong>es neuen Dokuments wird über den Menüpunkt "Erstellen"<br />
ermöglicht. Die E<strong>in</strong>gabe erfolgt <strong>in</strong> e<strong>in</strong>em Standard-Formular, <strong>in</strong> welchem die drei Fel<strong>der</strong><br />
"Haupttitel", "Autor" und "Thema" vorgegeben s<strong>in</strong>d.<br />
<br />
<br />
Abb.: Erstellen<br />
<br />
Die E<strong>in</strong>träge dieser Fel<strong>der</strong> s<strong>in</strong>d Pflicht, wobei die direkte E<strong>in</strong>gabe gesperrt ist. Durch<br />
Betätigung <strong>der</strong> Knöpfe "Autor wählen" resp. "Thema wählen" werden Auswahlfel<strong>der</strong><br />
angezeigt. Diese be<strong>in</strong>halten die vorhandenen E<strong>in</strong>träge für die Fel<strong>der</strong> "Autor" und "Thema".<br />
Zusätzlich zur Wahl vorhandener Themen können neue Themen aufgenommen und über den<br />
"Speichern"-Knopf <strong>in</strong> die Datenbank geschrieben werden. E<strong>in</strong> neuer Autor muss über<br />
die Lernumgebung e<strong>in</strong>gegeben werden.<br />
<br />
<br />
<br />
Abb.: Thema wählen<br />
<br />
Nach Bestätigung über den "ok"-Knopf wird die Wahl <strong>in</strong> das entsprechende Feld<br />
übernommen.<br />
<br />
Im Formular besteht die Möglichkeit, weitere Fel<strong>der</strong> zu den vorhandenen h<strong>in</strong>zuzufügen:<br />
<br />
Untertitel1 (Untertitel <strong>der</strong> Grösse 1, fett),<br />
Untertitel2 (Untertitel <strong>der</strong> Grösse 2) und<br />
144
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
Textarea<br />
Diese zusätzlichen Fel<strong>der</strong> können <strong>in</strong> beliebiger Anzahl und Reihenfolge e<strong>in</strong>gefügt werden.<br />
Jedes Feld kann je<strong>der</strong>zeit durch den nebenstehenden Knopf "Löschen" wie<strong>der</strong> entfernt<br />
werden, wobei die E<strong>in</strong>gaben im entsprechenden Feld verloren gehen.<br />
Wurde e<strong>in</strong> "Löschen"-Knopf versehentlich betätigt, besteht die Möglichkeit, über den<br />
"Zurück"-Knopf des Browsers, die Än<strong>der</strong>ung rückgängig zu machen.<br />
<br />
<br />
<br />
Abb.: Untertitel1, Untertitel2 und Textarea<br />
Erklärungen zum Feld Textarea:<br />
Die E<strong>in</strong>gabe <strong>in</strong> e<strong>in</strong>e Textarea erfolgt ähnlich wie <strong>in</strong> e<strong>in</strong>er Textverarbeitung. Das<br />
Betätigen <strong>der</strong> Enter-Taste bewirkt e<strong>in</strong>en Zeilenumbruch, Leerzeichen und -zeilen können<br />
beliebig e<strong>in</strong>gefügt werden und Umlaute werden als ä, ö und ü und nicht etwa als ü etc.<br />
geschrieben.<br />
<br />
W I C H T I G:<br />
Bei Übernahme von Textteilen aus e<strong>in</strong>er an<strong>der</strong>en Quelle mittels "copy-paste" ist darauf<br />
zu achten, dass Satzzeichen wie "Anführungszeichen" und "B<strong>in</strong>destrich" ersetzt, d.h.<br />
direkt über die Tastatur e<strong>in</strong>gegeben werden, da diese teilweise vom XSLT-Prozessor nicht<br />
<strong>in</strong>terpretiert werden können. Dies führt zu e<strong>in</strong>er Fehlermeldung.<br />
"E<strong>in</strong>fache Anführungszeichen" können aufgrund datenbanktechnischer Gründe nicht verwendet<br />
werden.<br />
<br />
Um den Text weiter zu formatieren, können HTML-Tags verwendet werden.<br />
Folgende stehen zur Auswahl:<br />
<br />
<br />
Tabelle: <table bor<strong>der</strong>="?"></table> mit den Tags <tr></tr>,<br />
<th></th> und <td></td><br />
Listen: <ul></ul> mit dem Tag <li></li><ol></ol><br />
mit dem Tag <li></li><br />
Fett: <b></b><br />
Kursiv: <i></i><br />
Unterstrichen: <u></u><br />
Trennstrich: <hr><br />
Umbruch: <br> (wie Enter-Taste)<br />
<br />
Alle verwendbaren HTML-Elemente (ausser <hr> und <br>) bestehen aus e<strong>in</strong>em<br />
e<strong>in</strong>leitenden und e<strong>in</strong>em abschliessenden Tag.<br />
<br />
W I C H T I G:<br />
Die Tags dürfen nur mit den hier angegebenen Attributen verwendet werden! Sie<br />
müssen richtig (d.h. syntaktisch korrekt) e<strong>in</strong>gegeben werden! Ansonsten besteht die Gefahr,<br />
dass die Übersetzung des XML-Str<strong>in</strong>gs fehlschlägt und das Dokument fehlerhaft o<strong>der</strong> gar<br />
nicht angezeigt wird. In diesem Fall gibt <strong>der</strong> XML-Parser e<strong>in</strong>e Fehlermeldung aus:<br />
<br />
<br />
Abb.: Syntaktisch unkorrekte Tag-E<strong>in</strong>gabe<br />
<br />
Dem Benutzer muss bewusst se<strong>in</strong>, dass sich <strong>der</strong> Text <strong>in</strong> den Textfel<strong>der</strong>n wie <strong>in</strong> <strong>der</strong><br />
Textverarbeitung verhält, d.h. je<strong>der</strong> Zeilenumbruch nach e<strong>in</strong>em HTML-Tag wird auch als<br />
solcher vom XML-Parser <strong>in</strong>terpretiert und angezeigt.<br />
Der Editier-Modus lässt <strong>in</strong> Textfel<strong>der</strong>n die Tags von Tabellen und Listen jeweils e<strong>in</strong>gerückt<br />
und mit Zeilenumbrüchen darstellen (systembed<strong>in</strong>gt).<br />
<br />
<br />
<br />
Abb.: E<strong>in</strong>gerückte Listen- und Tabellen-Tags <strong>in</strong> <strong>der</strong> Textarea<br />
<br />
Über den Knopf "L<strong>in</strong>k/Bild e<strong>in</strong>fügen" können L<strong>in</strong>k-Tags e<strong>in</strong>gefügt werden. Zuerst<br />
öffnet sich e<strong>in</strong> Fenster mit folgenden Auswahlfel<strong>der</strong>n:<br />
<br />
<br />
L<strong>in</strong>k zu Person e<strong>in</strong>fügen:<br />
<br />
<br />
<br />
L<strong>in</strong>k zu Mikroartikel e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Autor e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Literaturquelle e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Zitat e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Rezension e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu L<strong>in</strong>k e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Buch e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Teilnehmer e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Mentoren e<strong>in</strong>fügen:<br />
L<strong>in</strong>k zu Referenten e<strong>in</strong>fügen:<br />
<br />
<br />
<br />
Bild e<strong>in</strong>fügen:<br />
<br />
Zusätzlich ist e<strong>in</strong> E<strong>in</strong>gabefeld für e<strong>in</strong>en E-Mail-Adressen-L<strong>in</strong>k und e<strong>in</strong>es für<br />
e<strong>in</strong>en WWW-L<strong>in</strong>k vorhanden:<br />
<br />
L<strong>in</strong>k zu E-Mail-Adresse e<strong>in</strong>fügen:<br />
(z.B. hans.muster@muster.com)<br />
WWW-L<strong>in</strong>k e<strong>in</strong>fügen:<br />
(z.B. http://www.muster.com)<br />
<br />
<br />
145
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
<br />
Abb.: L<strong>in</strong>k/Bild e<strong>in</strong>fügen<br />
<br />
Die Inhalte dieser Auswahlfel<strong>der</strong> müssen über die Lernumgebung e<strong>in</strong>gegeben werden.<br />
<br />
Die Auswahl aus e<strong>in</strong>em <strong>der</strong> Auswahlfel<strong>der</strong> muss mit Betätigung des entsprechenden<br />
"ok"-Knopfs bestätigt werden.<br />
<br />
L<strong>in</strong>ks wird am Ende des Textfeldes e<strong>in</strong>gefügt und nicht etwa dort, wo <strong>der</strong> Cursor steht.<br />
Es kann gleichzeitig nur e<strong>in</strong> L<strong>in</strong>k übertragen werden. Deshalb muss darauf geachtet werden,<br />
dass nur im gewünschten Feld e<strong>in</strong> E<strong>in</strong>trag ausgewählt wird und die übrigen Fel<strong>der</strong> leer<br />
bleiben. Dieser Vorgang kann beliebig oft wie<strong>der</strong>holt werden.<br />
<br />
<br />
<br />
Abb.: Textarea-E<strong>in</strong>trag<br />
<br />
Um fehlerhafte Syntax zu vermeiden, sollten die <strong>in</strong> <strong>der</strong> Textarea e<strong>in</strong>gefügten L<strong>in</strong>k-Tags<br />
nicht mehr verän<strong>der</strong>t werden.<br />
Das System erlaubt, die L<strong>in</strong>k-Tags direkt <strong>in</strong> das Textfeld e<strong>in</strong>zugeben. Aufgrund des Risikos<br />
e<strong>in</strong>er falschen Verl<strong>in</strong>kung (falsche Zielangabe o<strong>der</strong> unkorrekte Syntax <strong>der</strong> Tags) ist dies<br />
aber i.a. nicht zu empfehlen.<br />
Ist e<strong>in</strong> L<strong>in</strong>k-Tag im Text nicht mehr erwünscht, kann es wie normaler Text gelöscht werden.<br />
Dabei sollte darauf geachtet werden, dass das End-Tag (z.B. "", erkennbar durch den<br />
vorangestellten Schrägstrich im Tag) mitgelöscht wird.<br />
<br />
S<strong>in</strong>d alle E<strong>in</strong>träge gemacht, wird das Dokument über den Knopf "Version erstellen"<br />
gespeichert und angezeigt.<br />
<br />
<br />
<br />
Abb.: Ausgabe<br />
<br />
Falls e<strong>in</strong> Dokument mit den gleichen Angaben <strong>in</strong> den Fel<strong>der</strong>n "Haupttitel", "Autor" und<br />
"Thema" schon <strong>in</strong> <strong>der</strong> Datenbank vorhanden ist, wird es durch das aktuelle nicht<br />
überschrieben, son<strong>der</strong>n als neue Version abgespeichert. Ansonsten wird e<strong>in</strong>e Version 1<br />
erstellt.<br />
<br />
Die neue Version erhält automatisch den Vermerk "zu prüfen".<br />
<br />
Jedes Betätigen e<strong>in</strong>es Knopfs bewirkt, dass die aktuelle Seite neu übersetzt und wie<strong>der</strong><br />
angezeigt wird. Schlägt die Transformation fehl (z.B. aufgrund <strong>der</strong> Verwendung fehlerhafter<br />
Tags), wird die neu übersetzte Seite fehlerhaft o<strong>der</strong> gar nicht angezeigt.<br />
Durch Betätigung des "Zurück"-Knopfs des Browsers kann die Aktion rückgängig<br />
gemacht und die Ursache des Fehlschlagens eruiert werden. Nachdem <strong>der</strong> Fehler korrigiert<br />
wurde, kann die gewünschte Aktion erneut ausgeführt werden.<br />
<br />
<br />
2.2.3. Funktion Editieren<br />
Schon erstellte Dokumente können über den Menüpunkt "Editieren" neu bearbeitet<br />
werden. Nachdem zuerst wie<strong>der</strong>um die gewünschte Klasse ausgewählt wurde, werden<br />
im Auswahlfenster alle aktuellen Dokumente aufgelistet Jede Zeile enthält Titel, Autor,<br />
Thema, Version und Erstellungsdatum des jeweiligen Dokuments. Diejenigen Dokumente, die<br />
gerade von an<strong>der</strong>en Benutzern bearbeitet werden, ersche<strong>in</strong>en <strong>in</strong> <strong>der</strong> Auswahlliste mit dem<br />
Vermerk "gesperrt" und können zur Zeit nicht editiert werden.<br />
<br />
Ist e<strong>in</strong>e Wahl getroffen, wird nach Betätigung des "ok"-Knopfs das gewünschte<br />
Dokument als Formular angezeigt. Gleichzeitig wird es für an<strong>der</strong>e Benutzer gesperrt.<br />
<br />
Die Seite des Dokuments be<strong>in</strong>haltet die Standardfel<strong>der</strong> "Haupttitel", "Autor" und "Thema"<br />
mit etwaigen zusätzlich e<strong>in</strong>gefügten Fel<strong>der</strong>n und <strong>der</strong>en Inhalt, welcher wie gehabt<br />
bearbeitet werden kann.<br />
<br />
Für Erklärungen zur Bedienung dieser Seite siehe 2.2.2. Erstellen.<br />
<br />
Die Sperrung e<strong>in</strong>es Dokuments für an<strong>der</strong>e wird erst aufgehoben, wenn es vom Benutzer als<br />
neue Version abgespeichert wird. Falls dieser also vor dem Abspeichern e<strong>in</strong> weiteres<br />
Dokument o<strong>der</strong> e<strong>in</strong>e Seite ausserhalb des CMS aufrufen würde, müsste er mit dem<br />
"Zurück"-Knopf des Browsers zurückspr<strong>in</strong>gen und die Bearbeitung korrekt abschliessen.<br />
An<strong>der</strong>nfalls bliebe dieses Dokument <strong>in</strong> <strong>der</strong> Datenbank als "gesperrt" gekennzeichnet und<br />
könnte nicht mehr editiert werden. In diesem Fall müsste <strong>der</strong> Adm<strong>in</strong>istrator benachrichtigt<br />
werden.<br />
<br />
<br />
2.2.4. Funktion Prüfen<br />
Soll e<strong>in</strong> erstelltes o<strong>der</strong> verän<strong>der</strong>tes Dokument veröffentlicht werden, ist es notwendig,<br />
dieses vorher durch kompetente Stellen prüfen zu lassen. Der Prüfer entscheidet, ob das<br />
Dokument freigegeben wird o<strong>der</strong> nochmals überarbeitet werden muss. In letzterem Fall teilt<br />
er dem Redakteur des Dokuments die notwendigen Än<strong>der</strong>ungen mit.<br />
<br />
Nach Auswahl <strong>der</strong> Klasse stehen <strong>in</strong> <strong>der</strong> Auswahlliste diejenigen Dokumente, welche als<br />
"zu prüfen" markiert s<strong>in</strong>d. Wie beim "Editieren" (siehe 2.2.3. Funktion Editieren)<br />
s<strong>in</strong>d diejenigen Dokumente,<br />
die gerade von an<strong>der</strong>en Benutzern bearbeitet werden, als "gesperrt" gekennzeichnet<br />
und stehen im Moment nicht zur Verfügung.<br />
<br />
Nach Betätigung des "ok"-Knopfs wird das gewählte Dokument angezeigt.<br />
Am Ende <strong>der</strong> Seite kann über e<strong>in</strong>e Radio-Box-Auswahl das Dokument zur Veröffentlichung<br />
freigegeben o<strong>der</strong> abgelehnt werden. Zur Bestätigung wird <strong>der</strong> "ok"-Knopf gedrückt.<br />
<br />
<br />
<br />
Abb.: Genehmigen/Ablehnen<br />
<br />
146
CMS für die MIO-Lernumgebung <strong>Anhang</strong> D<br />
2.2.5. Metadaten verwalten<br />
Metadaten s<strong>in</strong>d Informationen über e<strong>in</strong> Dokument. Sie beschreiben es nach formalen und<br />
<strong>in</strong>haltlichen Aspekten. Dazu gehören <strong>in</strong> unserem Fall:<br />
<br />
<br />
Haupttitel<br />
Autor<br />
Thema<br />
Version<br />
Status<br />
Erstellungsdatum<br />
Gruppe mit Editierberechtigung<br />
Gruppe mit Leseberechtigung<br />
<br />
<br />
Diese Angaben können unabhängig vom Content (Inhalt) des Dokuments je<strong>der</strong>zeit<br />
angeschaut und bearbeitet werden.<br />
<br />
S<strong>in</strong>d die notwendigen Berechtigungen vorhanden, können über die Auswahlliste und<br />
anschliessendes Betätigen des "ok"-Knopfs die Metadaten des gewünschten Dokuments<br />
aufgerufen werden.<br />
Auch hier s<strong>in</strong>d diejenigen Dokumente, die zur Zeit von an<strong>der</strong>en Benutzern bearbeitet<br />
werden, als "gesperrt" gekennzeichnet und stehen nicht zur Verfügung. Die<br />
Metadaten älterer Versionen <strong>der</strong> Dokumente können nicht mehr bearbeitet werden.<br />
<br />
Das sich öffnende Formular enthält die weiter oben aufgelisteten Informationen über das<br />
gewählte Dokument.<br />
<br />
<br />
<br />
Abb.: Metadaten<br />
<br />
Mit dem Manipulieren von Metadaten sollte vorsichtig umgegangen werden. Um Inkonsistenz<br />
zwischen verschiedenen Versionen <strong>der</strong> Dokumente zu vermeiden, s<strong>in</strong>d die Fel<strong>der</strong> "Version" und<br />
"Erstellungsdatum" schreibgeschützt.<br />
Über den "ok"-Knopf werden die Än<strong>der</strong>ungen zurück <strong>in</strong> die Datenbank geschrieben.<br />
<br />
<br />
2.2.6. Archiv<br />
Über den Menüpunkt "Archiv" werden dem Benutzer sämtliche archivierten Versionen <strong>der</strong><br />
Dokumente zur Verfügung gestellt.<br />
Die Versionierung dokumentiert die Verän<strong>der</strong>ungen <strong>der</strong> Dokumente, da diese nach jedem<br />
Editieren als neue Version abgespeichert werden (siehe 2.2.1. Erstellen).<br />
<br />
Ist das gewünschte Dokument ausgewählt, wird es nach Betätigen des "ok"-Knopfs<br />
angezeigt.<br />
<br />
<br />
<br />
147