WML und PHP - Ein erster Schritt

PHP eignet sich hervorragend auch für andere Seitenbeschreibungssprachen wie z.B. WML. So trug es sich zu, dass es eines Tages hiess es, ich solle einige dynamische/interaktive WML-Decks machen, und auf unseren server tun. Da ich ja PHP kann würde mir das sicher nicht sonderlich schwer fallen - doch: Gefehlt. Einfache WML-Doku gab es viel, doch das war nicht so der Hit. Nun habe ich es doch geschafft, und möchte euch den ersten Schritt leichter machen.

Dieser Artikel soll dem PHP-Befähigten und HTML-Geübten zeigen, wie er nun dynamische WML-Seiten und eben vor allem Variablenübergabe machen kann. Zusätzlich schadet eine WML-Referenz natürlich nicht.

Schritt 1: MIME-Typen bekannt machen

Den Webserver auf seine neue Aufgabe vorbereiten. Ein Webserver schickt im HTTP-Header den sog. Content-Type mit. Der ist bei WAP-Browsern aber nicht text/html sondern text/vnd.wap.wml. Deshalb sollten dem Webserver die MIME-Typen bekannt  gemacht werden. Diese Tabelle zeigt welche MIME-Typen unbedingt (reines WML) und welche optional sind:
Beschreibung Zugeordnete Erweiterung Inhaltstyp (MIME) Nötig
WML Quelltext .wml text/vnd.wap.wml
X
Kompiliertes WML .wmlc application/vnd.wap.wmlc  
WML Script .wmlscript text/vnd.wap.wmlscript  
WML Script .wsc text/vnd.wap.wmlscript
X
Kompiliertes WML Script .wmlsc application/vnd.wap.wmlscriptc  
Kompiliertes WML Script .wsc application/vnd.wap.wmlscriptc  
Wireless Bitmap .wbmp image/vnd.wap.wbmp
X

Schritt 2: Meine erste PHP-Datei auf dem Webserver.

Man stellt einfach wie von HTML gewohnt seine PHP-Dateien (.php3 etc.) auf den Webserver. Doch dieser sendet, da ja PHP für HTML-Seiten verwendet wurde/wird text/html als Content-Type. Da vermutlich auch noch HTML-PHPs funktionieren sollen empfiehlt es sich, PHP den Content-Type bestimmen zu lassen. Das passiert gleich als erstes im Code. Danach kommen noch einige weitere Header, die nicht lebenswichtig, aber durchaus sinnvoll sind. Lebenswichtig ist aber wieder der XML-Header. WML ist ja schließlich auch eine XML-Sprache...
Der zweite springende Punkt an dieser Datei ist das <do>-Tag im unteren Viertel. Der WML-Browser an sich,  ist in der Lage Variablen während der Darstellung aufzulösen. Doch damit ist uns nicht geholfen. Wir wollen, dass die Variablen auch den Webserver und damit PHP erreichen. Dafür ist das <postfield/>-Tag da. Ohne dieses, und die erweiterte <go>-Syntax gelangt keine Variable zu uns. Für jede Variable, die wir verarbeiten wollen brauchen wir also ein <postfield/>-Tag. bereich ist der Name der Variable, wie man sie in PHP verwenden kann. Das $(bereich) sagt dem Browser, dass er da beim Senden den Variableninhalt übergeben soll. Hier kann man auch normalen Text eingeben.
zr.php3
<? 
header("Content-type: text/vnd.wap.wml");                 // Sag dem Browser, dass jetzt WML kommt
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Ein Datum der Vergangenheit um nicht gecached zu werden
header("Last-Modified: " . gmdate("D, d M Y H:i:s"). " GMT"); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Pragma: no-cache"); 
echo("<?xmlversion=\"1.0\"?>\n");                            // Dass kann auch dierekt drin stehen
echo("<!DOCTYPE wml PUBLIC\"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n"); 
?> 
<wml> 
 <card id="start" title="Zahlenraten"> 
 <p>Ein weiteres Exemplar.</p> 
 <p>Welcher Bereich darfs denn sein?

 <select title="Bereich" name="bereich" value="B" iname="index_var">
      <option value="A">1-10</option>
             <option value="B">1-100</option>
             <option value="C">1-1000</option>
        </select> 
      </p>

      <do type="accept">
          <go href="z.php3" method="post">
             <postfield name="bereich" value="$(bereich)"/>
          </go>
      </do> 
 </card> 
</wml> 

Schritt 3: Eine Datei, um die Variable anzuzeigen.

Auch hier wieder der etwas umständliche Header. Nach etwas WML folgt auch schon der PHP-Code zum Anzeigen der Variable - genauso wie in alten Zeiten. Eins weiter unten ist noch einmal verdeutlicht, dass man teilweise auch mit den Mitteln des Browsers zu Etwas kommt - durch Verwendung der Browservariablen und WMLScript. An dieser Stelle sei es nocheinmal erwähnt: Die Browservariable { $bla, $(bla), $(bla:mod) } enthält immer einen Wert. Die PHP/CGI oder Server-Variable enthält dur dann einen Wert, wenn man sie im vorangegangenen <go> mit einem <postfield> zur Übergabe an den Server gekennzeichnet hat. WAP spart halt Bandbreite wo es nur grad geht.
z.php3
<? 
header("Content-type: text/vnd.wap.wml");                 // Sag dem Browser, dass jetzt WML kommt
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Ein Datum der Vergangenheit um nicht gecached zu werden
header("Last-Modified: " . gmdate("D, d M Y H:i:s"). " GMT"); 
header("Cache-Control: no-cache, must-revalidate"); 
header("Pragma: no-cache"); 
echo("<?xmlversion=\"1.0\"?>\n");                            // Dass kann auch dierekt drin stehen
echo("<!DOCTYPE wml PUBLIC\"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n"); 
?> 
<wml> 
 <card id="weiter" title="Zahlenraten"> 
 <p>Antwort.
 <? 
 echo "<br/>PHP: $bereich"; 
?>
 <br/>Browser: $(bereich)
 </p> 
      <do type="accept">
       <go href="z.php3"/>
      </do> 
 </card> 
</wml> 

Schritt 4: Sitzungsmanagement mit Variablen

Sitzungsmanagement mit Variablen ist eine übliche Methode um Benutzer auseinanderzukennen. So kann z.B. in einer Variable $Index der Index des Datensatzes des aktuellen Kunden stehen usw. Dazu braucht man Variablen, die man von Seite zu Seite weitergibt. Wenn man das Bisherige und seine PHP-Kenntnisse kombiniert ist es nicht schwer eine Lösung zu finden. So wären folgende beiden Lösungsansäzte möglich. Im ersten wird gleich zu anfang von der PHP-Variable eine Kopie für den Browser gemacht, die dann auch gleich zwei mal Verwendung findet. Im zweiten Ansatz wird auf die Kopie verzichtet, dafür aber an allen Stellen, wo der Wert der Variablen gebraucht wird, PHP verwendet. Je nach Anwendungsfall (ob die Variable verändert wird) sind die Ansätze unterschiedlich gut geeignet. Der erste eignet sich u.A. für Schreibfaule.
<wml> 
 <card id="weiter" title="Zahlenraten"> 
 <p>
 <? 
 echo "<setvar name=\"Index\" value=\"$Index\">"; 
 ?>
 Labalaba Sie haben den Index $(Index)<br/>
 </p> 
      <do type="accept">
          <go href="bla.php3" method="post">
             <postfield name="Index" value="$(Index)"/>
          </go>
      </do> 
   </card> 
</wml> 
<wml> 
 <card id="weiter" title="Zahlenraten"> 
 <p>
    Labalaba Sie haben den Index <? echo "$Index"; ?><br/>
 </p> 
      <do type="accept">
          <go href="bla.php3" method="post">
             <?
                  echo "<postfield name=\"Index\" value=\"$Index\"/>";
             ?>
          </go>
      </do> 
   </card> 
</wml> 

Ich hoffe, dass das ein hilfreicher Einstieg in die Programmierung der Kombination PHP+WML war. Hier ging es in erster Linie um das Übergeben von Variablen, was sicher eine der wichtigsten Dinge in diesem Zusammenhang ist.  Robert Köpferl