WWD Inhalt Web Grundlagen .................................................................................................................................................................................................................................. 1 DTD (HTML)...................................................................................................................................................................................................................................... 2 Attribute....................................................................................................................................................................................................................................... 2 HTML.................................................................................................................................................................................................................................................... 2 Doctype: ........................................................................................................................................................................................................................................... 2 HTML vs XHTML ............................................................................................................................................................................................................................... 2 HTML5.............................................................................................................................................................................................................................................. 3 CSS ....................................................................................................................................................................................................................................................... 3 JavaScript ............................................................................................................................................................................................................................................. 4 Ajax ...................................................................................................................................................................................................................................................... 6 jQuery .................................................................................................................................................................................................................................................. 6 Serverseitiges ....................................................................................................................................................................................................................................... 7 PHP .................................................................................................................................................................................................................................................. 7 PEAR (PHP Extension and Application Repository) und PECL (PHP Modulsammlung) ..................................................................................................................... 7 PHP und Datenbanken ..................................................................................................................................................................................................................... 8 Template Systeme ........................................................................................................................................................................................................................... 8 Web-Frameworks............................................................................................................................................................................................................................. 9 CodeIgniter .................................................................................................................................................................................................................................... 10 Semantic Web .................................................................................................................................................................................................................................... 10 RDF................................................................................................................................................................................................................................................. 11 Microformats ................................................................................................................................................................................................................................. 11 CMS (WCMS Web Content Management Systems) ........................................................................................................................................................................... 11 Mambo .......................................................................................................................................................................................................................................... 13 Plone .............................................................................................................................................................................................................................................. 13 Wiki (schnell).................................................................................................................................................................................................................................. 13 Blogs (Weblogs) ............................................................................................................................................................................................................................. 14 Glossar ........................................................................................................................................................................................................................................... 14 Web Grundlagen - Geschichte: Tim Berners-Lee CERN, SGML angelehnt Varianten: strict, transitional, frameset Metasprachen: SGML Standard Generalized Markup Langugae, XML, Konkrete Sprachen: HTML, XHTML HTML Element a img <a href="http://www.zhwin.ch">Startseite</a> <img src="images/logo.jpg" width="48" height="298" alt="ZHW Logo" /> Src und alt benötigt Div, Span - Verwendung moistens mit id und class Block-Elemente: h1, p, ol, li, div neue Zeile, Grösse anpassbar, Breite 100% - Inline-Elemente: a, img gleiche Zeile, Breite abhängig content SGML (Standard Generalized Markup Langugae) - Kann auch andere Tag Zeichen benutzen Namenseinschränkungen Features: OMITAG: kann man Tag weglassen SHORTTAG: sind Abkürzungen zulässig checked oder id=zwei(ohne anführungszeichen) DTD (HTML) <!ELEMENT elementname reqstart reqend content-model > O Optional, - Required <!ELEMENT OL - - (LI)+ Connectors: Zeichen , & | Bezeichnung SEQ AND OR Bezeichnung alle in dieser Reihenfolge alle, in beliebiger Reihenfolge genau eines der Teile Bezeichnung PLUS REP OPT Bezeichnung Mindestens einmal Mehrmals optional Höchstens einmal <!ELEMENT FIELDSET - - (#PCDATA,LEGEND,(%flow;)*) > <!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) > <!ENTITY % head.content "TITLE & BASE?" > Occurence Zeichen + * ? - <!ELEMENT OL - - (LI)+ -- ordered list --> <!ELEMENT A - - (%inline;)* -(A) -- anchor --> <!ELEMENT TABLE - - (CAPTION?, (COL*|COLGROUP*), THEAD?, TFOOT?, TBODY+)> #PCDATA <!ELEMENT TITLE - - (#PCDATA) -(%head.misc;) -- Text --> EMPTY <!ELEMENT META - O EMPTY –- leeres Element --> +(..) <!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) > Inclusion irgendwo innerhalb -(..) <!ELEMENT A - - (%inline;)* -(A) > Exclusion Inhalt darf nichtvorkommen Attribute <!ATTLIST elementname attributname type required-or-default ... > <!ATTLIST FORM method (GET|POST) name CDATA GET -- HTTP method ... -#IMPLIED oder #REQUIRED -- name of form ... -- HTML - Notwendig: Titel aber kein Head Body optional Doctype: - HTML 4: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> XHTML: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> HTML5: <!DOCTYPE html> bei XHTML5 keiner nötig HTML vs XHTML - Keine Abkürzungen: Attributwerte ohne Anführunszeichen, checked Keine Tags weglassen, leere Element emit /> Kleinschreibung Verweise von Ankern über id nicht mehr name Scripts extern oder in CDATA bereichen anstelle von Kommentar XHTML eigentlich im Mime-Type text/xml aber aus kompatibilität text/html und keine xml deklaration Vorteile XHTML - Kompatibilität andere XML Sprachen Mischen von XML Sprachen Einheitlicher Zugriff: DOM XSL verwendung XHTML 1.1 : in Module aufgeteilt, nur noch strict: alte Elemente nicht mehr vorhanden HTML5 - ursprünglicher Name : Web Applications 1.0 Zusammenarbeit WHATWG, W3C Neue Spezielle Elemente für Seitenstruktur: article, section, nav, aside, header Überschriften h1 bedeutung aus Position h2-h6 geht aber noch) Video und Audio Canvas: Bitmapgrafiken Syntax: HTML oder XHTML Rendering Engines: - Gecko: Firefox Trident: IE Tasman: IE5 und Macintosh versionen Webkit: Safari, Chrome KHTML: Conqueror Presto: Opera Validatoren: - http://validator.w3.org/ http://validator.de.selfhtml.org/ HTML Tidy: korrigiert Fehler CSS Einbinden - Externes Stylesheet: <link href="css/screen.css" rel="stylesheet" media="screen" type="text/css" /> Intern: <style> oder style=”” Per JavaScript Quirksmode/Standards Mode - Gleicht alte Browser aus IE Box Model Bug Modus abhängig von DOCTYPE strict meistens Standards Frameworks - Blueprint YAML: Yet Another Multicolumn Layout Graceful Degradation: oft neue Features verwenden sollte aber aufpaasen das auch ohne ansehbar ist. Gliederung Aufbau der Datei: - Nach Position im Dokument Nach Art: Typograhpie, Farben, Layout Formatierung , Einzeilig mehrzeilig etc. CSS 3.0 - Implementierte Features mit prefix: -moz-, -webkitNeue Selektoren ^=, $=, *=, CSS-Fonts: Problem IE Embedded Open Type .eot andere OpenType.otf CSS 3.0 Befehle: Runde Ecken Rahmen Bild Schatten auf Text Text Wörter umbrechen Spalten Bilden -moz-border-radius: 5px; -webkit-border-radius: 5px; -webkit-border-image: url(border.png) 27 27 27 27 round round; text-shadow: 2px 2px 2px #ddccb5; word-wrap: break-word; .columns { -moz-column-width: 20em; -moz-column-gap: 3em; -moz-column-rule: medium solid; -webkit-column-width: 20em; -webkit-column-gap: 3em; -webkit-column-rule: medium solid; } XML mit CSS bearbeiten: display: block etc.. weil kein Default Einheiten: em,ex,px, in, cm, mm, pt, pc, % JavaScript Wozu: - Uhrsprünglich LiveScript dann JavaScript aus Popularitätsgründen Implementierung de ECMAScript Standards Ähnlichkeiten: Syntax ähnlich wie Java, Vererbung Dynamik wie SELF, Lambda Dynamische Typen wie Lisp/Scheme Rhino: JavaScript in Java schreiben Case-Sensitive Sicherheit Wird in Sandbox ausgeführt Kein Zugriff auf lokalsystem Trotzdem gelegentlich Sicherheitsprobleme Validierung Animation und Effekte Asynchrone Zugriffe Ajax GUIs wie Desktopanwendung MultimediaInhalte steuern JavaScript Einbinden Im HTML <script type="text/javascript"> <!-alert("Hello World"); --> </script> Referenziert (typ required, inhalt ignoriert) <script type="text/javascript" src="scripts.js"></script> Kommentar // oder /* */ zweites schlechter weil auch in Regex vorkommen kann Gleichheit == != Vergleich mit Typunwandlung === !== Vergleicht auch Typ Logische Operatoren: && || ! False = false, 0, „“, NaN, Null, undifeined Objekte ( Key-Value-Paare) Erzeugen var obj = new Object(); var obj = {}; var obj = { name: "Carrot", "for": "Max", details: { color: "orange", size: 12 } } Zugreifen obj.name = "Simon"; obj["name"] = "Simon"; Funktionen Inhalt in Seite einfügen Nicht schön document.write("Hello World"); Besser function init() { var add = document.createTextNode("Hello"); document.getElementById("out").appendChild(add); } window.onload=init; Zahlen Nur Gleitpunktzahl 64bit double Rechnen mit Math. Parsen mit parseInt(zahl, system), parseFloat NaN not a number isNaN() zum prüfen Zahlen ausserhalb bereich infinity Kontrollstrukturen If .. else oder bedingung ? true-ausdruck : false-ausdruck For, while, do..while Schleifen Switch Arrays var a = new Array(); var a = ["dog", "cat", "hen"]; a[0] = "dog"; a[100] = "cow"; a.length; // 101 a.push('cow') a.pop(); a.sort(); // mit Punkt // Indexer Vordefinierte Objekte - Keine Typangaben Parameter/Rückgabetyp Direkt aufrufbar mit (paremeter) Variablen mit var nur lokal sichtbar Keinen Blockscope Ohne return undefined Name optional Math Konstanten E Eulersche Konstante LN2 natürlicher Logarithmus von 2 LN10 natürlicher Logarithmus von 10 LOG2E konstanter Logarithmus von 2 LOG10E konstanter Logarithmus von 10 PI Konstante PI SQRT1_2 Konstante für Quadratwurzel aus 0,5 SQRT2 Konstante für Quadratwurzel aus 2 Methoden abs() , ceil(), floor(),log(),max(),min(),pow(),random(),round(),sin(),sqrt() Datum - Date var now = new Date(); Achtung: Monaten -> Januar = 0 Dez = 11 Window, document, event, history, location, navigator, Array, Date, Function, Math, RegExp, String Document Document.cookie, document.lastModified, forms,images, links document.forms[0].elements[0].value document.meinformular.eingabe.value document.forms["meinformular"].elements["eingabe"].value navigator - appName offizieller Name des Browsers appVersion Browser-Version language Browser-Sprache appCodeName Spitzname des Browsers platform Plattform, auf der der Browser läuft userAgent HTTP-Identifikation des Browsers window (Browserfenster) standard kann weggelassen werden function neuesFenster() { window.open("http://www.zhaw.ch","zhawwindow", "menubar=1,width=200,height=300,scrollbar=1" ); } Event Handling function initEvents() { document.getElementById("btn").onclick = alert('.'); } window.onload = initEvents; getTime() Anzahl millisekunden seit 1.1.1970 Funktionen Erweiterung Variablen im Funktionskontext: this arguments Mehrere Funktionen in Array abgelegt var a = [ function(n){return n;}, function(n){return n*n;} ]; var b = a[1](5); Innere Funktionen Innere Funktion zugriff auf äussere Variable function init() { var name = "Mozilla"; function displayName() { alert(name); } displayName(); } Objektmodell Bei normalen Konstruktor mit Funktion, wird für jedes Objekt neue Funktion angelegt // Funktionen über Prototyp anhängen function Person(first, last) { this.first = first; this.last = last; } Person.prototype.fullName = function() { return this.first + ' ' + this.last; } Person.prototype.fullNameReversed = function() { return this.last + ', ' + this.first; } var s = new Person("Hans", "Muster"); Methode (this ist Objekt) var myObj = { value: 0, increment: function(inc) { this.value += (typeof inc === 'number') ? inc : 1; } } Funktion (this ist window) obj.square = function () { var that = this; var myfunc = function() { that.value = that.value * that.value; }; myfunc(); }; Konstruktor (this ist neues Objekt) Grossbuchstaben function Shape (centerX, centerY, color) { this.centerX = centerX; // Eigenschaften this.centerY = centerY; this.color= color; this.move = moveShape; // Methode (Funktion muss // bereits existieren) } var myShape = new Shape(15, 25, "#ff3300"); Erweitern function Person(first, last) { this.first = first; this.last = last; } Person.prototype.fullName = function() { return this.first + ' ' + this.last; } function User(first, last, uid) { this.base = Person; this.base(first, last); this.uid = uid; } User.prototype = new Person; Anpassen bestehender Typen Number.prototype.integer = function() { return Math[this < 0 ? 'ceil' : 'floor'](this); } 3.75.integer() //3 Ajax Bei Interaktion wird Seite immer neu geladen! Schlecht und langsam. - Java-Applet: Programmcode wird von Server geladen und auf Client ausgeführt Flash: Propritär, Plugin (weit verbreitet) Idee: Remote Scripting Datenaustausch ohne neues Laden - Applet, Active-X, Flash, XML-RPC, http mit unsichtbarem IFrame (Neativ: Seite in History vermerkt) Ajax: Asynchronous JavaScript + XML Konkretes siehe Folien! jQuery Allgemein Über jQuery oder $ Auswahl über CSS-Selektoren Mehrere Aktionen nacheinander mit . getrennt ausführung in dieser Reihenfolge Hänge einen Button in DOM mit Funktionalität / Progressiv Enhancment $('<input type="button" value="un/sichtbar" id="toggleText">') .insertAfter('#temptext'); $('#toggleText').click(function() { $('#temptext').toggle(); }); HTML und Text ändern $('p').html(Gleicher Text in <em>allen</em> Abs'); $('h2').text('Ich bin eine Überschrift 2'); Laden wenn DOM fertig geladen $(document).ready(function() { } CSS-Eigenschaft lesen $('#mainnav li').css('font-size') CSS-Eigenschaft setzen $('#mainnav li').css('font-size','12') $('#mainnav li').css( {'font-size': '12', 'color': '#336' } ) CSS-Klasse hinzufügen $('table.data tr:even').addClass('tablerow2'); Event hinzufügen $('#hideText').click(function() { $(this).hide(); }); Serverseitiges PHP Formulardaten <?php if (isset($_POST['beliebigername'])) { $feldinhalt = $_POST['beliebigername']; echo "Sie haben $feldinhalt eingegeben\n"; } ?> <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method=POST> <input name="beliebigername"> <input type="submit"> </form> Dateien Zugreifen $datei = fopen("readme.txt","r"); $inhalt = ""; while (!feof($datei)) { $inhalt .= fgets($datei,1000); } fclose($datei); $datei = fopen("writeme.txt","w"); fwrite($datei, $inhalt) fclose($datei); Kopieren von Objekten PHP 5 class MyClass { function __clone() { print "Object is being cloned"; } } $obj = new MyClass(); $clonedobj = clone $obj Konstruktoren Alt: Konstruktor Namen von Klasse Konstrukter der übergeordneten Klasse: parent::__construct() Ohne Konstruktor wird die von oben aufgerufen Interface implements extends interface Throwable { public function getMessage(); } class MyException implements Throwable { public function getMessage() { // ... } } class MyClass { function print } function print } } __construct() { "Inside constructor"; __destruct() { "Destroying object"; Final und const Final: nicht mehr weitervererbt werden Man kann auf konstanten einer Klasse zugreifen: class MyClass { const SUCCESS = "Success"; const FAILURE = "Failure"; } print MyClass::SUCCESS; Abstrakte Klassen abstract class MyBaseClass { abstract function display(); } // is_a veraltet if ($WF instanceof WidgetFactory) { echo 'Yes, $WF is a WidgetFactory'; } Static Singleton class Singleton { static private $instance = NULL; private function __construct() { } static public function getInstance() { if (self::$instance == NULL) { self::$instance = new Singleton(); } return self::$instance; } } $obj = Singleton::getInstance(); Weiteres Kein Überladen von Methoden Iterator Interface ermöglicht foreach Einfaches XML über simplexml __autoload kann Code nachladen function __autoload($class_name) { include_once($class_name . "php"); } PEAR (PHP Extension and Application Repository) und PECL (PHP Modulsammlung) - Opensource Komplett Objektorientiert 470 Pakete Andere Bibliotheken: SPL, eZ Components, Zend Framework - Wiederverwendbarkeit Qualität Packen und ausliefern von PHP Code Standard Plattformunabhängigkeit Ziele: - Installation ähnlich wie Debian Linux (Abhängigkeiten erkennen, auto Update) PHP und Datenbanken - Früher sehr DB spezifisch PHP5 SQLite unterstützung seit 5.1 PDO PHP Data Objects vorher über PECL SQLite - DB besteht aus einem File Sehr schnell Bis 2TB grösse Kein eigener Prozess SQLite Beispiel <?php // Open database (create if not exists) $db = sqlite_open("foo.db"); $result = sqlite_query($db, "SELECT * from foo"); while ($row = sqlite_fetch_array($result)){ print_r($row); } sqlite_close($db); ?> PDO try { $dbh = new PDO($dsn, $user, $password, $options); // use the database here // ... // done; release the connection $dbh = null; } catch (PDOException $e) { echo "Failed to connect:" . $e->getMessage(); } Daten ändern $del = $dbh->exec("DELETE FROM FOO WHERE 1"); $change = $dbh->exec("UPDATE FOO SET active=1 WHERE " . "NAME LIKE '%joe%'"); Transaktionen $dbh->beginTransaction(); $dbh->commit(); $dbh->rollBack(); Prepared Statements $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); PDO PHP Data Objects Vereinheitlichen Schnittstelle Kann immernoch spezifische aufrufe machen DSN mysql:host=name;dbname=dbname pgsql:native_pgsql_connection_string odbc:odbc_dsn sqlite:/path/to/db/file sqlite::memory: sqlite2:/path/to/sqlite2/file sqlite2::memory: Daten aus DB holen // unbuffered $dbh = new PDO($dsn); $stmt = $dbh->prepare("SELECT * FROM FOO"); $stmt->execute(); while ($row = $stmt->fetch()) { print_r($row); } $stmt = null; // buffered $dbh = new PDO($dsn); $stmt = $dbh->query("SELECT * FROM FOO"); $rows = $stmt->fetchAll(); $count = count($rows); foreach ($rows as $row) { print_r($row); } $stmt = null; // iterator $dbh = new PDO($dsn); $stmt = $dbh->query("SELECT name FROM FOO", PDO::FETCH_COLUMN, 0); foreach ($stmt as $name) { echo "Name: $name\n"; } $stmt = null; // insert one row $name = 'one'; $value = 1; $stmt->execute(); // insert another row with different values $name = 'two'; $value = 2; $stmt->execute(); Template Systeme - Dateien als Vorlage mit Platzhaltern Vorteil: Trennung Code Visuelles Nachteil: Zusatzaufwand, Einarbeitung Systeme für PHP: Smarty, verschiedene PEAR Pakete, patTemplate Smarty - Nicht vollständig Trennbar Smarty Beispiel Template //index.php include('Smarty.class.php'); // create object $smarty = new Smarty; // assign some content. This would typically come from DB etc. $smarty->assign('name', 'george smith'); $smarty->assign('address', '45th & Harris'); // display it $smarty->display('index.tpl'); //index.tpl <html> <head> <title>User Info</title> </head> <body> <p>User Information:</p> <p> Name: {$name} <br> Address: {$address} </p> </body> </html> Schleifen wieder im Template Variablen-Modificatoren {foreach key=cid item=con from=$kontakte} <a href="kontact.php?contact_id={$cid}"> {$con.name} - {$con.nick}</a><br /> {/foreach} Name: {$name|capitalize}<br> Addr: {$address|escape}<br> Date: {$smarty.now|date_format:"%d.%m.%Y"} Includes in Template Html_options {include file="header.tpl" title="User Info"} User Information:<p> Name: {$name|capitalize}<br> Address: {$address|escape}<br> {include file="footer.tpl"} $smarty->assign('id', array(1,2,3)); $smarty->assign('names', array('bob','jim','joe')); <select name=user> {html_options values=$id output=$names selected="5"} </select> Web-Frameworks - Bibliothek: Kontrolle liegt beim eigenen Programm, Bibliothek wird benutzt Framework: Rahmen, Kontrolle beim Framework, Inversion of Control, Hollywood-Prinzip, Einschränkungen Model View Controller MVC - Architekturmuster das in 3 Einheiten teilt Bessere Erweiterbarkeit, Einfacher, Wiederverwendbarkeit von Komponenten o Datenmodell Model o Präsentation View o Programmsteuerung Controller Ruby on Rails Framework Web-Anwendungen mit DB Ziel: schnelles erstellen Open source CodeIgniter Siehe Folien! Ähnlich CakePHP Ziele: geringer Einarbeitungsaufwand, Effizienter Code, übliches Webhosting, Konvention vor Konfiguration URL-Aufbau Prinzip: www.your-site.com/class/function/arg Beispiel: www.your-site.com/index.php/news/article/my_article Beispiel: $ cat address.rb #!/usr/bin/ruby class Address def initialize(street) @street = street end # Just return @street def street @street end end address = Address.new("23 St George St.") puts address.street $ ./address.rb 23 St George St. CakePHP Framework PHP 4 oder 5, Ruby Rails ähnlich Symfony PHP5 Robuste Anwendungen in UG Feld Andere - - MVC DRY (Don’t repeat yourself) MVC Umfangreich Turbo Gears Phyton Django Python Struts Java Spring Java CodeIgniter Welcome.php <?php class Welcome extends Controller { function Welcome() { parent::Controller(); } function index() { $data = array ('username' => ''); $username = $this->input->post("username"); $password = $this->input->post("password"); if($username == "Andy" && $password == "Andy" ) { $data = array('username' => $username); $this->load->model("Item"); $data['items'] = $this->Item->getAllItems(); $this->load->view('datasite',$data ); } else { $this->load->view('welcome_message', $data); } } } Views/welcome_message.php <body> <h1>Login</h1> View/datasite.php <body> <h1>Ich bin drin</h1> <p>Bitte einloggen um nirgendwo hinzugelangen!</p> <p>Du hast dich eingeloggt.</p> <p>Beispiel des Code Ignitors</p> <form action="#" method="post"> <input type="text" name="username" value="<?php echo $username ?>" /> <input type="text" name="password" /> <input type="submit" name="Senden" value="send" /> </form> <p>Hallo <?php echo $username ?></p> <p>From Database:</p> <ul> <?php foreach($items as $item): ?> <li><?php echo $item->name; ?></li> <?php endforeach; ?> <ul> </body> </body> Semantic Web - Collaborative Tagging: Gemeinsames Indexieren User Generated Content: Kommentarfunktion, Wikis Crowdsourcing: Auslagern von Arbeit an Freiwillige Richer User Interfaces: Ajax Tag CLoud: Wortlisten für suchmaschinen und co Semantisches Web: Beschreibung des Inhaltes so das auch für Maschine lesbar -> h1, h2 etc erster schritt Formate Strukturelle Kategorie: div, span, list Inhalt: abbr, address, code Rhetorisch: em, strong - Microformats RDF (Resource Description Framework,) OWL (Web Ontology Language) RDF - - Auszeichnungssprache für Metadaten Tripel Subjekt, Prädikat, Objekt Statements o Resource: Was URL (Ellipse) o Eigenschaft: Bezug zum Objekt/Relation o Objekt: Wert des Prädikats Rechteck XML oder Notation 3 attribute dc:title etc. Abfragesprachen ähnlich SQL, RDQL SELECT.. WHERE…AND…USING DUBLIN CORE: set von Namen Microformats - Verwendet vorhandene Standards Firefox: Greasemonkey CMS (WCMS Web Content Management Systems) Merkmale/Ziele: – – – – – – Bedienbar ohne Programmierkenntnisse Bedienbar ohne ohne Kenntnis von HTML bzw. XML Medienneutrale Datenhaltung Rechteverwaltung Workflow / Freigabe von Änderungen Versionskontrolle Terminologie - Content Management (System) Enterprise Content Management (System) Document Management (System) Web Content Management (System) CM/CMS ECM/ECMS DMS WCMS Unternehmenseinsatz Teil von ECM Dokumente Verwalten Publiziert Inhalte im Web Grundfunktionen - Vorlagen Autoren: Bearbeiten und erstellen Pflege/Inhalts anpassungen über Web-Interface WCMS übernimmt Menustruktur selbst Berechtigungssystem Automatische aufbereitung von Material (Bilder Grafiken etc.) Suchfunktionen Workflow Integration Realisierung - Dynamisch oder Erzeugt statische Version erzeugt immer fertige Struktur und legt diese ab Clientseitig oder Serverseitig Beurteilung - Funktionsumfang einer Default-Installation: Grundfunktionalität ohne Schnickschnack verfügbar Verfügbarkeit von Zusatzmodulen: Erweiterbarkeit Flexibilität über Vorlagen: Darstellung anpassbar Art der Implementierung : Code anpassbar CMS finden / Infos zu CMS - OpenSource CMS: OSCOM CMS Matrix Namen und Beispiele - Livelink: Professionel http://www.opensourcecms.com http://www.oscom.org/ http://www.cmsmatrix.org/ - Mambo / Joomla Plone: für grosse Seiten Typo 3: gross und flexibel Open Engine http://www.mamboserver.com/ http://plone.org/ http://typo3.com/ http://www.openengine.de Mambo Default-Installation Positiv Sehr einfache Installation – Gut bedienbares User Interface – Inhalt optional mit WYSIWYG Editor bearbeitbar – Separate Administrationsschnittstelle – Einfaches Einfügen von Bildern – Bestimmte Anpassungen der Darstellung (z.B. Position von Elementen) über das Admin-Interface – Menüs einfach anzupassen – PDF Ausgabe von Seiten standardmässig unterstützt – Gutes Hilfe-System Zusatzmodule – Viele Module verfügbar, zum Beispiel • File Repository • Events Calendar – Grosse und aktive Community Flexibilität Vorlagen – Kleinere Anpassungen über das Admin Interface – Anpassung über Stylesheets möglich Negativ – – – Benutzer, Rollen und Berechtigungen: Nicht sehr fein spezifizierbar Keine Versionierung der Änderungen; kein Zurück zur letzten Version Administrationsschnittstelle nicht auf Anhieb verständlich – – Module von ziemlich unterschiedlicher Qualität Versionsabhängigkeiten (Module, die unter Mambo 4.5 funktionieren und unter 4.5.1 nicht) – – Vorlagen: HTML mit PHP-Code gemischt Anpassen oder neue Vorlagen erstellen nur mit PHP Programmierkenntnissen – Kein sauberes Design: Mischung von Seitenstruktur und Programmlogik, kaum funktionale Abstraktion Kein klar definiertes API, das Module benutzen können Art Implementierung – Plone Platoform: Zope Server Default-Installation Positiv – Installationspakete inklusive Zope für verschiedene Plattformen – verfügbar und einfach zu installieren – DB und Webserver enthalten – Webbasiertes Management Interface – WYSIWYG Editor für Inhalte – Jeder Benutzer mit eigenem Arbeitsbereich – Grundfunktionen: Nachrichten, Ereignisse, Diskussionen – Default Vorlagen sind barrierefrei und valides XHTML – Anpassbares, flexibles Workflow-System zum Einreichen, Begutachten, und Freischalten von Inhalten – Eigene Inhaltstypen können hinzugefügt werden Zusatzmodule – Viele Module verfügbar, zum Beispiel – gleichzeitig auf dem Server o Database adapters für MySQL, PostgreSQL, Firebird, SQL – Server, Oracle – Module in der Regel stabil und ausgereift Flexibilität Vorlagen – Flexibles Template System ZPT (Zope Page Templates) – Erlaubt es, Elemente aus der Objekt-Datenbank in HTML Seiten einzufügen – Anpassung der Darstellung auch über Styles möglich, sowie über das Hinzufügen oder Entfernen vordefinierter Seitenelemente über das Management Interface Art Implementierung – Objektorientierte Design-Prinzipien berücksichtigt Wiki (schnell) - Verlinkte Webseiten In Browser bearbeitbar Negativ – Umfangreiche Einarbeitung für Anpassungen nötig – Trotz dem klaren Design aufgrund hoher Komplexität nicht auf Anhieb zu verstehen - Alle Besucher können bearbeiten Formatierung mit einfachen Regeln Zentrale Idee - Besucher ändern Seiten Erleichtertes Verändernd der Seite Übliche Funktion - Versionierung Letzte Änderungen Volltextsuche Engines - MediaWiki, TWiki, TikiWiki, PmWiki, MoinMoin, Wakka Wiki, PhpWiki, UseMod Verwendungsbeispiele: - Wissen zusammentragen Konventionelle Webseite vereinfacht Projektkommunikation Anleitungen Lernplattform Unterscheidung zu CMS - Wiki = Einfachheit Weniger komplexe Berechtigungsverwaltung Keien Workflowfunktionalität Blogs (Weblogs) - Periodische Einträge Themengebiet Kommentarfunktion RSS Feed oft Glossar SGML DSSSL FOP CSS Standard Generalized Markup Langugae Document Style Semantics and Specification Language Formatting Object Processor Cascading Stylesheet jQuery – Text-Anpassbar machen var url = "http://dublin.zhaw.ch/~regnimar/wwd/P11/"; $(document).ready(function() { $("p.editable").each(function(index) { var editable = $(this); $.ajax({ type: "POST", url: url + "simpledb/simple_db.php?func=retrieve", data: "key=text" + index +"&auth=wwdsimple", success: function(msg){ editable.text(msg); } }); }); $("p.editable").click(editableText); }); function editableText() { var saveP = $(this); var newContentObj = $("<div class='editDiv'><textarea class='editArea'>" + saveP.text() +"</textarea><br /><input class='cancle' type='button' value='Abbrechen'/> <input class='save' type='button' value='OK'/></div>"); $(this).replaceWith(newContentObj); newContentObj.children("input.cancle").click(function() { $(this).parent().replaceWith(saveP); saveP.click(editableText); }); newContentObj.children("input.save").click(function() { var text = $(this).parent().children("textarea").val(); saveP.text(text); saveP.click(editableText); $(this).parent().replaceWith(saveP); $.ajax({ type: "POST", url: url + "simpledb/simple_db.php?func=insert", data: "key="+ saveP.attr("id") +"&value=" + text + "&auth=wwdsimple" }); }); } <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <title>JQuery</title> <script src="jquery.js"></script> <script src="editable.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <link rel="stylesheet" type="text/css" href="style.css" /> </head> <body> <div id="ausgabe"> <p class="editable" id="text0">blabla</p> <p class="editable" id="text1">blabla</p> </div> </body> </html> CSS 3.0 Fonts einbinden @font-face { font-family: “YanoneKaffeesatz”; src: url(’YanoneKaffeesatz-Regular.otf’ ); font-weight:normal; } @font-face { font-family: “YanoneKaffeesatz”; src: url(’YanoneKaffeesatz-Bold.otf’ ); font-weight:bold; } @font-face { font-family: “YanoneKaffeesatz”; src: url(’YanoneKaffeesatz-Light.otf’ ); font-weight:lighter; } Verwenden über den font-family Namen. CSS Sprites #superlink { display: inline-block; width:250px; height:200px; overflow: hidden; position:relative; } #spaceship { position: absolute; left: -160px; top: -110px; } #spaceship:hover { position: absolute; left: -270px; top: -250px; } CSS: Adaptlet @charset 'utf-8'; @import url(reset.css); @import url(fancybox.css); /* ----------------------------------------------------- Comment */ .js div { } /* apply only on JavaScript enabled browsers */ .ie7 div { } /* apply only on Internet Explorer 7 and below */ .ie6 div { } /* apply only on Internet Explorer 6 and below */ body { margin: 0 auto; width: 1024px; font-family: Verdana, Tahoma, Arial; position: relative; } #main { position: relative; width:1024px; } #nav { position: relative; background-image: url("../img/navi.png"); background-position: 0 0; width: 1024px; height: 37px; } #nav li { width: 103px; list-style: none; } #nav li a { position:absolute; display: block; width: 103px; height: 37px; top: 0; text-indent: -2000px; } #nav li a:hover { background-image: url("../img/navi.png"); } #home a {left: 309px;} #home a:hover { #home a:active { background-position: -309px -38px;} background-position: -309px -76px;} #home a.active { background-image: url("../img/navi.png"); background-position: -309px -114px; } #slideshow a { left: 412px; } #slideshow a:hover { background-position: -412px -38px; } #slideshow a:active { background-position: -412px -76px; } #slideshow a.active { background-image: url("../img/navi.png"); background-position: -412px -114px; } .section { margin-top: 30px; margin-bottom: 15px; height: 500px; width: 1019px; border: 1px solid rgb(200, 200, 200); border-radius: 5px; -moz-border-radius: 5px; -moz-box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); -webkit-box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); box-shadow: 2px 2px 5px rgba(0, 0, 0, 0.5); } .aside li { list-style: url('../img/zahnrad.png'); margin-left:25px; padding: 4px; } .article li { list-style: url('../img/zahnrad.png'); margin-left:25px; padding: 4px; } .article a { color: rgb(95, 130, 130); } .article h3 { padding-top: 18px; font-size: 14px; font-weight: bold; color: rgb(95, 130, 130); } .aside { float: right; padding: 20px; line-height: 16px; font-size: 14px; } #footer { clear: both; text-align: center; font-size: 12px; color: rgb(150,150,150); margin-bottom:10px; } #back { position: absolute; top: 2px; width: 36px; height: 23px; padding:7px; background-image: url('../img/shortbutton_left.png'); background-position: 0 0; text-indent: -2000px; } #back:hover { position: absolute; background-position: 0 -38px; } #back:active { position: absolute; background-position: 0 -76px; } #next { position: absolute; top: 2px; right: 0; width: 36px; height: 23px; padding:7px; background-image: url('../img/shortbutton_right.png'); background-position: 0 0; text-indent: -2000px; } #next:hover { position: absolute; background-position: 0 -38px; } #next:active { position: absolute; background-position: 0 -76px } #zhawmap { border: solid 2px rgb(150,150,150); border-radius: 6px; -moz-border-radius: 6px; } /*a[href$=".pdf"] { background: url (../img/pdf.png) no-repeat right top; padding-right: 10px;} */ /*a[href$=".jar"] { background: url (../img/jar.png) no-repeat right top; padding-right: 10px;}*/ a[href$=".pdf"] { a[href$=".jar"] { background: url("../img/pdf.png") no-repeat left; padding-left: 18px;} background: url("../img/jar.png") no-repeat left; padding-left: 18px;} Adaptlet jQuery var currentPart = 0; var maxParts = 0; $(document).ready(function() { maxParts = $(".section").length - 1; if(maxParts != currentPart) slideshow(); if($("#accordion").length ==1) { $("#accordion").accordion({ header: "h3" }); } }); function slideshow() { $(".section").each(function(index) { if(index != currentPart) { $(this).hide(); } else { $("#back").remove(); $("#next").remove(); $("#part" + currentPart).fadeIn('slow'); if(currentPart != 0) { var backObj = $("<div id='back'>Back</div>"); backObj.click(function() { $("#part" + currentPart).fadeOut('slow', function() { currentPart--; slideshow(); }); }); $(this).before(backObj); } $(this).css("width","800px"); $(this).css("position","relative"); $(this).css("left","112px"); $(this).css("right","112px"); var nextObj = $("<div id='next'>Next</div>"); if(maxParts != currentPart) { nextObj.click(function() { $("#part" + currentPart).fadeOut('slow', function() { currentPart++; slideshow(); }); }); $(this).after(nextObj); } } }); } Ajax Anruf absetzen var requester = null; function onchangeReceipt() { /* Check for running connections */ if (requester != null && requester.readyState != 0 && requester.readyState != 4) { requester.abort(); } try { requester = new XMLHttpRequest(); } catch (error) { try { requester = new ActiveXObject("Microsoft.XMLHTTP"); } catch (error) { requester = null; return false; } } requester.onreadystatechange = onreadystatechangeReceipt; requester.open("GET", "receipt.php?receipt=" + this.value); requester.send(null); return true; } Empangen function onreadystatechangeReceipt() { if (requester.readyState == 4) { // If the data was retrieved successfully if (requester.status == 200) { writeDetails(); // do something with requester.responseText } // IE returns a status code of 0 on some occasions, so ignore // this case else if (requester.status != 0) { alert("There was an error while retrieving the URL: “ + requester.statusText); } } return true; } Microformats <div id="hcard-Ewald-Maria-Mund" class="vcard"> <span class="fn n"> <span class="given-name">Ewald</span> <span class="additional-name">Maria</span> <span class="family-name">Mund</span> </span> <div class="org">InIT</div> <div class="adr"> <div class="street-address">Technikumstrasse 9</div> <span class="postal-code">8400</span> <span class="locality">Winterthur</span> <br /> <span class="country-name">Schweiz</span> </div> <a class="email" href="mailto:[email protected]">[email protected]</a> </div> <div id="hcard-Eduard-P.-Mumprecht" class="vcard"> <span class="fn n"> <span class="given-name">Eduard</span> <span class="additional-name">P.</span> <span class="family-name">Mumprecht</span> </span> <div class="org">InIT</div> <div class="adr"> <div class="street-address">Technikumstrasse 9</div> <span class="postal-code">8400</span> <span class="locality">Winterthur</span> <br /> <span class="country-name">Schweiz</span> </div> <a class="email" href="mailto:[email protected]">[email protected]</a> </div> Canvas <!DOCTYPE html> <html> <head> <title>Canvas Beispiel</title> <script type="text/javascript"> var uhr = { draw : function (){ var now = new Date(); var canvas = document.getElementById('wwdsample'); if (canvas.getContext){ var ctx = canvas.getContext('2d'); // Befehle zum Zeichnen..., zum Beispiel ctx.fillStyle = "rgb(250,250,250)"; ctx.beginPath(); ctx.arc(200, 200, 200, 0, 360, false); ctx.fill(); ctx.stroke(); ctx.closePath(); ctx.fillStyle = "rgb(0,50,0)"; ctx.beginPath(); ctx.arc(200, 200, 10, 0, 360, false); ctx.fill(); ctx.closePath(); ctx.translate(200, 200); for (var i = 0; i < 60; i++) { ctx.beginPath(); ctx.moveTo(0, -200); ctx.lineTo(0, -180); ctx.rotate(6 * Math.PI / 180); ctx.stroke(); ctx.closePath(); } ctx.save(); ctx.rotate((6 * now.getSeconds()) * Math.PI / 180); ctx.beginPath(); ctx.strokeStyle = "rgba(255,0,0,0.5)"; ctx.lineWidth = 3; ctx.moveTo(0, -170); ctx.lineTo(0, 0); ctx.stroke(); ctx.closePath(); ctx.restore(); … } }, setTimer: function(){ window.setInterval("uhr.draw()", 1000); } } window.onload = uhr.setTimer; </script> <style type="text/css"> canvas { border: 1px solid black; } </style> </head> <body> <canvas id="wwdsample" width="400" height="400"></canvas> </body> </html>