Minimales Projekt

Dr. O. Hoffmann

Der Projektkopf

In der Datei wurzel.php stehen einige Variablen für die lokale Konfiguration. Zum Beispiel kann die Verzeichnisstruktur auf dem lokalen Test-server anders sein als auf dem späteren öffentlichen server oder man muß mit seinem Projekt zu einem anderen Anbieter umziehen. Wenn alles gut überlegt ist, reicht es, diese Datei anzupassen. Ein paar andere Sachen stehen da auch noch drin, die auch woanders stehen könnten. Etwa die Namen der Stile in einem array. Wenn das alles per include eingebunden wird, sieht es in der index.php aufgeräumter aus. Das ist im Grunde alles.

<?php
# Alle php-Fehler anzeigen, bei Bedarf deaktivieren
error_reporting(E_ALL);
# Abschalten, verfaelscht sonst die Quelltextausgabe (nur bei PHP Version < 5.3):
#set_magic_quotes_runtime(0);

# Name der Projektdatei
$datnam='index.php';
#Einige URIs zum persoenlichen Gebrauch
$hilfe_uri="http://hoffmann.bplaced.net";
$dasspiel_uri="http://olaf.pytalhost.com/DasSpiel/";
$galerie_uri="http://olaf.pytalhost.com/galerie/";
$dpug_uri="http://prinz-und-gloeckner.pytalhost.com";
$os_uri="http://drohoffmann.gmxhome.de";
# Datum
$datum = (date('Y-m-d G:i:s'));
# Basisverzeichnis fuer includes
$verzeichnis='jooo';
# Basisverzeichnis fuer css
$verzcss='./css';
# Der Stil wird angezeigt, wenn kein existierender
# ausgewaehlt wurde Ausnahme, wenn die
# browserweiche etwas anderes feststellt
$startstil='a';
# Die Buchstaben aller Stile ohne den Druckstil p
$stilstring='eafmnostuv';
# msie Korrektur einschalten:
$msie=TRUE;
# Stile angeben:
# Immer vorhanden sollte sein:
# n - Nichts, kein css
# p - Zum Drucken
# _ ist reserviert fuer bots, nicht verwenden
# weitere vorhandene Stile fuers Menue:
$stilname['m']='Minimal';
$stilname['o']='Olafs';
$stilname['s']='Schatten';
$stilname['t']='Test';
$stilname['e']='Elementar';
$stilname['f']='Fraktal';
$stilname['u']='Universum';
$stilname['v']='Verde';
$stilname['a']='Alternativ';
$stilname['n']='Nichts, kein css';
$stilname['p']='Zum Drucken';
# Umbruch der Stilzeile:
$stilumbruch=20;
?>

In check.php werden Variablen eingelesen und überprüft. Einige davon stammen per get-Methode vom Nutzer, andere vom server, teils um die Seitenstatistik anzulegen.

<?php
# remote_addr ermitteln:
if(isset($_SERVER['REMOTE_ADDR'])) {
  $remad=$_SERVER['REMOTE_ADDR'];
} else {
  if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
      $remad2=htmlentities($_SERVER['HTTP_X_FORWARDED_FOR']);
      $remad='noip, '.$remad2;
  } else {
    if(isset($_SERVER['HTTP_CLIENT_IP'])) {
      $remad2=htmlentities($_SERVER['HTTP_CLIENT_IP']);
      $remad='noip, noxf, '.$remad2;
    } else {
      $remad='noip, noxf, noci';
    }
  }
}
# remote host ermitteln:
if(isset($_SERVER['REMOTE_HOST'])) {
  $remho=$_SERVER['REMOTE_HOST'];
} else {
  $remho=gethostbyaddr($_SERVER["REMOTE_ADDR"]);
}
# referrer ermitteln:
if(isset($_SERVER['HTTP_REFERER'])) {
  $refer=htmlentities($_SERVER['HTTP_REFERER']);
} else {
  $refer='noref';
}
# user-agent ermitteln:
if(isset($_SERVER['HTTP_USER_AGENT'])) {
  $agent=htmlentities($_SERVER['HTTP_USER_AGENT']);
  #$agent="Harvest";
} else {
  $agent='noagent';
}
# nur aktivieren, um bot-Anzeige zu testen:
#$agent="bot";
# nur aktivieren, um netscape4-Filter zu testen:
#$agent="Mozilla/4.78";
# Gucken, welcher Inhalt geladen werden soll:
if(isset($_GET['in'])) {
  # wir wollen nicht, dass in andere Verzeichnisse geguckt wird...
  $in=str_replace('/', '?',$_GET['in']);
  $statistik=FALSE;
} else {
  $in='start';
  $statistik =TRUE;
}
# Gucken, welches Menue geladen werden soll:
if(isset($_GET['me'])) {
  $me=str_replace('/', '?',$_GET['me']);  
} else {
  $me='start';
}
# Stil ermitteln:
$unstil=0;
if(isset($_GET['stil'])) {
  $stil=$_GET['stil'];
  $unstil=1;
  if (($stil=='') or ($stil=='_')){
  unset($_GET['stil']);
  $unstil=0;
  }
}

if(!isset($_GET['stil'])) {
  $stil=$startstil;
}  

# netscape4 rausfiltern, dabei vom msie unterscheiden...
$ok1=substr_count(substr($agent, 0, 11), 'Mozilla/4.');
if ($ok1 != '0') {
    $typ=substr($agent, 10, 11);
    if (($typ > 0) and ($unstil==0)){
      $stil='n';
    }
}
 
    # Suchmaschinen u. ae. Spezialbehandlung verpassen
    $loweragent=strtolower($agent);
    $ok3=substr_count($agent, 'Slurp');
    $ok3=$ok3+substr_count($agent, 'Harvest');
    $ok3=$ok3+substr_count($agent, 'Scooter');
    $ok3=$ok3+substr_count($agent, 'LinkChecker');
    $ok3=$ok3+substr_count($agent, 'WebStripper');
    $ok3=$ok3+substr_count($agent, 'Sleuth');
    $ok3=$ok3+substr_count($loweragent, 'archiver');
    $ok3=$ok3+substr_count($loweragent, 'combine');
    $ok3=$ok3+substr_count($loweragent, 'download');
    $ok3=$ok3+substr_count($loweragent, 'bot');
    $ok3=$ok3+substr_count($loweragent, 'crawl');
    $ok3=$ok3+substr_count($loweragent, 'spider');
    $ok3=$ok3+substr_count($loweragent, 'findlinks');    
    if ($ok3 != '0') {
      $stil='_';
     # Hier sollte man sich jetzt genau ueberlegen, 
     # was man den bots anbietet  
     if ($statistik) {
       $in='alles';
     }
    } 
# beim Druckstil den alten Stil rekonstruieren
$stiltyp=substr($stil, 0, 1);
if ($stiltyp =='p') {
 if (strlen($stil)=='2') {
    $stilnr=substr($stil, 1, 1);
    $stil=$stiltyp;
  } else {
    $stilnr=$startstil; 
    $stil=$stiltyp;   
  }
  if (substr_count($stilstring, $stilnr) !='1'){
    $stilnr=$startstil;
  }
  # keine msie-Korrektur?...  
} elseif ($stiltyp =='0') {
 if (strlen($stil)=='2') {
    $stilnr=substr($stil, 1, 1);
    $stil=$stilnr;
    $msie=FALSE;
  } else {
    $stilnr=$startstil; 
    $stil=$stiltyp;   
  }
  if (substr_count($stilstring, $stilnr) !='1'){
    $stilnr=$startstil;
  }
}
# Gucken, ob es den Stil wirklich gibt...

if (substr_count("_p$stilstring", $stil) !='1'){
  $stil=$startstil;
}

# Stildateien und Stilnamen festlegen...
# mit $stildateim kann eine Datei angelegt
# werden, in dem Korrekturen von css
# Fehlern fuer den msie bis Version 6.99
# angegeben werden koennen. 
$stildatei="$verzcss/$stil.css";
$stildateim="$verzcss/m$stil.css";
if (!file_exists($stildatei)) {
$stildatei="$verzcss/n.css";
}
if (!file_exists($stildateim)) {
$stildateim="$verzcss/n.css";
}
if (!isset($stilname["$stil"])) {
$stilnamen='?';
} else {
$stilnamen=$stilname["$stil"];
}

# Statistik vorbereiten
# dies nur fuer diese Demonstration -->
$remad='*';
$remho='?';
# Statistik anonymisieren <--
if ($statistik) {
  $dat=(date('Y.m'));
  # das log-Verzeichnis muss per chmod die 
  # richtigen Zugriffsrechte bekommen
  # Schreiben, Lesen, Ausfuehren fuer alle
  $datei="$verzeichnis/log/$dat" ;
  $raus = "<tr><td><?php echo \$nri++ ?></td>";
  $raus = $raus . "<td>$datum</td><td>$agent</td>";
  $raus = $raus . "<td>$remad $remho</td>";
  $raus = $raus . "<td>$refer $me:$in:$stil </td></tr>\n";
  

  # Statistikdatei ggf erzeugen und 
  # mit geeigneten Zugriffsrechten versehen...
  if (!file_exists($datei)) {
    touch($datei);   
    chmod ($datei, 0666);
  }
  # Statistikdatei schreiben...
    $fp = fopen ($datei, 'a+');
    fputs ($fp, $raus);
    fclose($fp);
  }
?>

Kopfdaten der XHTML-Ausgabe kopf.php können auch gleich per include eingebunden werden - ist sowieso immer das Gleiche.

<?php
# header fuer xhtml senden?
# Die Idee ist, wenn der browser ueberhaupt xml kennt, bekommt
# er einen richtigen content-type, kennt er immerhin html, bekommt
# er den, sonst wird geraten, ob es Netscape4 oder MSIE ist, die
# bekommen dann auch text/html, sonst gibt es xhtml.
$xhtml=TRUE;
$httpheader="Content-type: application/xhtml+xml; charset=iso-8859-1";
$alterbrowser=0;
if(isset($_SERVER['HTTP_ACCEPT'])) {
if ( strpos($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) {
   # nichts zu tun...
} else if(strpos($_SERVER["HTTP_ACCEPT"],"application/xml")) {
  $httpheader="Content-type: application/xml; charset=iso-8859-1";
  $xhtml=TRUE;
} else if(strpos($_SERVER["HTTP_ACCEPT"],"text/xml")) {
  $httpheader="Content-type: text/xml; charset=iso-8859-1";
  $xhtml=TRUE;
} else if(strpos($_SERVER["HTTP_ACCEPT"],"text/html")) {
  $httpheader="Content-type: text/html; charset=iso-8859-1";
  $xhtml=FALSE;
} else {
   # nur wenn gar nichts angegeben ist, raten, ob es
   # google, netscape4 oder MSIE ist:
   $alterbrowser=substr_count(substr($agent, 0, 11), "Mozilla/4.");
   $alterbrowser=$alterbrowser+substr_count(strtolower($agent), "google");
   if ($alterbrowser != "0") {
      $httpheader="Content-type: text/html; charset=iso-8859-1";
      $xhtml=FALSE;
   }
}
header($httpheader);
}

echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?> \n";
?>
<!DOCTYPE
 html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
<head>

Wer die XML-Zeile haben möchte, gibt die besser per echo aus, da auf einigen servern short-tags aktiviert sind und der php-parser da dann was mißverstehen täte.
Im Anschluß können dann auch noch individuelle Seitentitel eingebunden werden. Wenn eine gleichlautende Datei wie die spätere Inhaltsdatei fehlt, wird ein vorgegebener Titel ausgegeben. Das Gleiche gilt für meta-Elemente. Die betreffenden Dateien zur Inhaltsdatei, die mit der Variable $in angesprochen wird, werden in $verzeichnis/titel/$in beziehungsweise $verzeichnis/meta/$in gesucht und soweit vorhanden statt des Projektseitentitels eingebunden.

Spannender ist dann schon die Datei headlink.php. Neben einigen üblichen Angaben gibt es hier die verschiedenen Stildateien an- und auszugeben. Diese werden dann auch im Stilvorlagenmenü des browsers angegeben. Dazu können per link-Element ebenfalls für wichtig gehaltene URLs angegeben werden bis hin zu einem kompletten Inhaltsverzeichnis, welches dann von geeigneten browsern in einem extra link-Menü angegeben wird.
Die Zeile, die mit "echo "<!--[if lte IE 6.99]>" beginnt, dient dazu, eine CSS-Datei als Kommentar anzugeben, in der Korrekturen für den microsoft internet-explorer (msie) bis Version 6.99 enthält. Dessen CSS-Unterstützung ist teilweise so mangelhaft, daß es bei seiner immer noch häufigen Verwendung sinnvoll ist, dies bei Bedarf zu tun, um den Inhalt zugänglich zu halten. Im Gegensatz zu netscape4 ist die CSS-Interpretation vom msie immerhin bereits so weit gediehen, daß es sich lohnt, geeignet aufbereitetes CSS anzubieten.

<link rel="bookmark" href="<?php echo $dasspiel_uri ?>" 
title="DasSpiel 1.0 - Das Spiel 0.9" />
<link rel="bookmark" href="<?php echo $galerie_uri ?>" 
title="Dr. O. Hoffmann: Galerie privater Photographien" />
<link rel="bookmark" href="<?php echo $hilfe_uri ?>" 
title="Dr. O. Hoffmann: Mehr vom Autor dieser Seite" />
<link rel="bookmark" href="<?php echo $dpug_uri ?>" 
title="Der Prinz und der Gloeckner: Kunst und Literatur" />
<link rel="bookmark" href="<?php echo $hilfe_uri ?>/hilfe.php" 
title="Hilfe zur internet Projektgestaltung, CSS, XHTML, SVG, PHP" />
<link rel="bookmark" href="index.php" 
title="Minimales Projekt mit XHTML, CSS, PHP" />
<link rel="first"     
href="<?php echo "$datnam?me=start&amp;in=start&amp;stil=$stil"; ?>" 
title="Start" />
<link rel="copyright" 
href="<?php echo "$datnam?me=start&amp;in=kontakt&amp;stil=$stil"; ?>" 
title="Kontakt" />
<link rel="section"   
href="<?php echo "$datnam?me=start&amp;in=aufbau&amp;stil=$stil"; ?>" 
title="Aufbau" />
<link rel="chapter"   
href="<?php echo "$datnam?me=quelltexte&amp;in=projektseite&amp;stil=$stil"; ?>" 
title="Projektseite" />
<link rel="section"   
href="<?php echo "$datnam?me=quelltexte&amp;in=projektkopf&amp;stil=$stil"; ?>" 
title="Kopfdaten" />
<link rel="section"   
href="<?php echo "$datnam?me=quelltexte&amp;in=projektinhalt&amp;stil=$stil"; ?>" 
title="Inhalt" />
<link rel="section"   
href="<?php echo "$datnam?me=quelltexte&amp;in=projektmenue&amp;stil=$stil"; ?>" 
title="Menue" />
<link rel="chapter"   
href="<?php echo "$datnam?me=css&amp;in=cssdateien&amp;stil=$stil"; ?>" 
title="css-Dateien" />
<link rel="section"   
href="<?php echo "$datnam?me=css&amp;in=csss&amp;stil=$stil"; ?>" 
title="Stil S" />
<link rel="section"   
href="<?php echo "$datnam?me=css&amp;in=cssu&amp;stil=$stil"; ?>" 
title="Stil U" />
<link rel="section"   
href="<?php echo "$datnam?me=css&amp;in=cssv&amp;stil=$stil"; ?>" 
title="Stil V" />
<link rel="section"   
href="<?php echo "$datnam?me=css&amp;in=csso&amp;stil=$stil"; ?>" 
title="Stil O" />
<link rel="section"   
href="<?php echo "$datnam?me=css&amp;in=csst&amp;stil=$stil"; ?>" 
title="Stil T" />
<link rel="section"   
href="<?php echo "$datnam?me=css&amp;in=cssd&amp;stil=$stil"; ?>" 
title="Stil P" />
<link rel="section"   
href="<?php echo "$datnam?me=start&amp;in=verweise&amp;stil=$stil"; ?>" 
title="Verweise" />
<link rel="help"      
href="<?php echo "$datnam?me=start&amp;in=hilfe&amp;stil=$stil"; ?>" 
title="Hilfe" />
<?php
if ($stil != "_") {
?>
<link rev="made" 
href="&#109;&#097;&#105;&#108;&#116;&#111;&#058;&#100;&#114;&#46;&#111;&#46;&#104;&#111;&#102;&#102;&#109;&#97;&#110;&#110;&#64;&#103;&#109;&#120;&#46;&#100;&#101;" title="email an den Autor" />
<?php

echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$stildatei\" 
title=\"Auswahl: $stilnamen\" media=\"screen\" /> \n";
# msie Korrektur? 
if ($msie) {
echo "<!--[if lte IE 6.99]><link rel=\"stylesheet\" type=\"text/css\" 
href=\"$stildateim\" media=\"screen\" /><![endif]--> \n";
}
if ($stil=="p") {
echo "<link rel=\"prev\" 
href=\"$datnam?&amp;me=$me&amp;in=$in&amp;stil=$stilnr\" 
title=\"Vorheriger Stil\" media=\"screen\" /> \n";
} else {
foreach ($stilname as $key => $value) {
    echo "<link rel=\"alternate stylesheet\" type=\"text/css\" 
    href=\"$verzcss/$key.css\" title=\"$key: $value\" media=\"screen\" /> \n";
}
}
}

    echo "<link rel=\"stylesheet\" type=\"text/css\" 
    media=\"print\" href=\"$verzcss/p.css\" title=\"p: Zum Drucken\" /> \n";
?>
<link rel="shortcut icon" href="favicon.ico" />