23.11.2012 Aufrufe

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

MEHR ANZEIGEN
WENIGER ANZEIGEN

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&uuml;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&uuml;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 &uuml; 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 = "&amp;"<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&ouml;cke<br />

<br />

<br />

Term<strong>in</strong>e<br />

<br />

<br />

Materialien<br />

<br />

Landschaft<br />

<br />

CMS<br />

Material&uuml;bersicht<br />

<br />

Dateipr&uuml;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&uuml;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&uuml;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&auml;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&auml;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&uuml;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&uuml;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&uuml;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&uuml;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&uuml;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 />

&#160;<br />

&#160;<br />

&#160;<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 &uuml; 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: &lt;table bor<strong>der</strong>="?"&gt;&lt;/table&gt; mit den Tags &lt;tr&gt;&lt;/tr&gt;,<br />

&lt;th&gt;&lt;/th&gt; und &lt;td&gt;&lt;/td&gt;<br />

Listen: &lt;ul&gt;&lt;/ul&gt; mit dem Tag &lt;li&gt;&lt;/li&gt;&lt;ol&gt;&lt;/ol&gt;<br />

mit dem Tag &lt;li&gt;&lt;/li&gt;<br />

Fett: &lt;b&gt;&lt;/b&gt;<br />

Kursiv: &lt;i&gt;&lt;/i&gt;<br />

Unterstrichen: &lt;u&gt;&lt;/u&gt;<br />

Trennstrich: &lt;hr&gt;<br />

Umbruch: &lt;br&gt; (wie Enter-Taste)<br />

<br />

Alle verwendbaren HTML-Elemente (ausser &lt;hr&gt; und &lt;br&gt;) 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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!