PHP

Strona WAP bez znajomości WML

SebaZ

Przeglądając zasoby WorldWideWeb natrafiłem na bardzo prostą i bardzo funkcjonalną klasę PHP generującą dokumenty WML tworzące jakże popularne teraz strony WAP. Co czyni je tak popularnymi? a no to, że są dostępne z poziomu telefonów komorkowych, gdyż do ich przegladania nie potrzeba specjalnie wgranej przeglądarki. Obecnie każdy model posiada taka przeglądarkę WAP wbudowaną w telefon.

Najbardziej ucieszyło mnie to, że autorem tej klasy (a raczej 2 klas o czym sie zaraz przekonacie) jest Polak, niejaki Marcin Laber.

No ale dość już tych informacji wstępnych, przechodzimy do rzeczy, czyli opisu jak się ta zabawką posługiwać...

Co będzie potrzebne?

*Plik
mlswap.php

<?
  /*******************************************************************
  **                                                                **
  **  mlswap                                                 v 2.0  **
  **  obiektowe tworzenie stron wml w php                           **
  **  ? 2002 mls                              [email protected]  **
  **                                                                **
  **  Distributed under GNU General Public License.                 **
  **                          http://www.fsf.org/copyleft/gpl.html  **
  **  Dystrybucja na zasadach Powszechnej Licencji Publicznej GNU.  **
  **                      http://gnu.org.pl/text/licencja-gnu.html  **
  **                                                                **
  *******************************************************************/
 
  /*
  **  class wml_doc
  **
  **  Klasa odzwierciedla dokument WML. Można zdefiniować kodowanie znaków (->encoding ), etc.
  **  Wy?wietlenie dokumentu metod? ->show()
  */
  class wml_doc {
    var $content_type = "text/vnd.wap.wml";
    var $cache = "no-store, no-cache, must-revalidate, post-check=0, pre-check=0";
    var $encoding = "utf-8";
    var $cards = array();
    var $template = array();
 
    function add_card($card) {
      $this->cards[] = $card;
    }
 
    function add_button($title, $action = "prev", $href = "") {
      $action = strtolower($action);
      // check - is right action?
      if ($action != "prev" && $action != "options") $action = "prev";
      $temparray[title] = $title;
      $temparray[action] = $action;
      $temparray[href] = $href;
      $this->template[] = $temparray;
      unset($temparray);
    }
 
    function show() {
      if ($this->content_type != "") header("Content-Type: ".$this->content_type);
      if ($this->cache != "") header("Cache-Control: ".$this->cache);
      if ($this->encoding != "") $enc = " encoding=\"".$this->encoding."\""; else $enc = "";
      print("<?xml version=\"1.0\"".$enc."?>\n");
      print("<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" \"http://www.wapforum.org/DTD/wml_1.1.xml\">\n");
      print("<wml>\n");
      if ($this->cache != "") {
        print("<head>\n");
        print("<meta http-equiv=\"Cache-Control\" content=\"".$this->cache."\"/>\n");
        print("</head>\n");
      }
      if (count($this->template) > 0) {
        print("<template>\n");
        for ($tc = 0; $tc < count($this->template); $tc ++) {
          $at = $this->template[$tc];
          $rets = "<do type=\"".$at[action]."\" label=\"".$at[title]."\">";
          if ($at[action] == "prev") $rets .= "<prev/>"; 
             else $rets .= "<go href=\"".$at[href]."\"/>";
          $rets .= "</do>\n";
          print($rets);
        }
        print("</template>\n");
      }
      for ($cc = 0; $cc < count($this->cards); $cc ++) {
        $card = $this->cards[$cc];
        if (!empty($card->timer)) $time="ontimer=\"".$card->timer[url]."\""; else $time="";
        print("<card id=\"".$card->id."\" title=\"".$card->title."\"".$timr.">\n");
        if (!empty($card->timer)) 
          print("<timer name=\"".$card->timer[name]."\" value=\"".$card->timer[time]."\"/>\n");
        for ($clc=0; $clc < count($card->source); $clc++) print($card->source[$clc]."\n");
        print("</card>\n");
      }
      print("</wml>\n");
    }
  }
 
  /*
  **  class wml_card
  **
  **  Klasa odzwierciedla kartę dokumentu WML.
  **  Dokument WML _musi_ zawierać co najmniej jedn? kartę.
  */
  class wml_card {
    var $id = "main";
    var $title = "Main";
    var $source = array();
    var $timer = array();
 
    function create($title = "Main", $id = "main") {
      $this->id = $id;
      $this->title = $title;
    }
 
    function add_timer($time, $url, $name = "maintimer") {
      $this->timer[time] = $time;
      $this->timer[url] = $url;
      $this->timer[name] = $name;
    }
 
    function add($code) {
      $this->source[] = $code;
    }
  }
 
  /*
  **
  **  Funkcje dla klasy wml_doc:
  **
  **    void add_card(object card)
  **    void show(void)
  **
  **  Funkcje dla klasy wml_card:
  **
  **    void create([string title] [, string id])
  **    void add_timer(string time, string url [, string name])
  **    void add(string code)
  **
  */
?>

W kodzie powyżej zawarte sa 2 klasy, o których wspominałem na samym początku. Są to klasy: wml_doc oraz wml_card i na nich jest wszystko oparte
Przeglądarka WAP (najbardziej znana to Opera, Firefox oraz IE nie umożliwiają wyświetlania dokumentów WML a tym samym stron WAP)
telefon komórkowy z opcją WAP

Dokumentacja - spis metod i funkcji

class wml_doc - klasa główna, odpowiedzialna za wyświetlanie strony WAP

function add_card($card) - funkcja tworząca karty/podstrony, parametr $card - w nim znajduje się wcześniej utworzona karta za pomoca klasy wml_card opisanej niżej

function add_button($title, $action <small>= "prev"</small>, $href = <small>""</small>) - funkcja dodająca przycisk ponad nagłówkiem karty/podstrony, parametr $title - napis na przycisku, parametr $action w obecnej wersji klasy przyjmuje 2 opcje: prev - wtedy przycisk pełni funkcję WSTECZ oraz options - wtedy przenosi pod adres zawarty w parametrze $href

function show() - funkcja parsująca, generująca i wyświetlająca stronę WAP

class wml_card - klasa odpowiedzialna za wygląd i elementy znajdujace się na poszczególnych kartach

function create($title <small>= "Main"</small>, $id <small>= "main"</small>) - funkcja tworząca nową karte/podstronę, parametr $title - jest to tytuł danej karty, parametr $id - opcjonalny, jest to unikalna nazwa danej podstrony

function add_timer($time, $url, $name <small>= "maintimer"</small>) - funkcja przekierowująca na strone z parametru $url jesli czas podany w $time już minął, parametr $name jest opcjonalny

function add($code) - funkcja podobna do echo() w PHP, wyświetla co jest podane w $code - dozwolony jest XHTML

Sposób użycia - przykłady

Chcąc stworzyć stronę WAP na samym początku należy załadować nasza klasę podając właściwą ścieżkę do pliku, którego zawartość podałem w pierwszym punkcie instrukcji:

<?
  require("mlswap.php");

Następnym krokiem jest stworzenie conajmniej 2 zmiennych, które będa korzystały z obu klas:

$wml = new wml_doc; /* przechowuje cały sokument WML */
  $card1 = new wml_card; /* przechowuje pierwsza zarazem glowna strone WAP */

Teraz trzeba "stworzyć" wygląd pierwszej strony w $card1:

  $card1 -> create("Strona głowna WAP"); /* stworzenie karty i nadanie jej nagłówka "Strona głowna WAP" */
  $card1 -> add("<p>To jest moja pierwsza strona WAP<br/>");

Na koniec wystarczy zainicjować nową kartę w dokumencie WML oraz wyświetlić wszystko w przeglądarce:

  $wml -> add_card($card1); /* inicjacja karty/podstrony z $card1 */
 
  $wml -> show(); /* wyswietlenie w przegladarce*/
?>

Oczywiście strona WAP może zawierać także podstrony, do których moga prowadzic linki na stronie głównej. W tym celu ponownie inicjujemy wszystko z tym, że teraz stworzymy 2 podstrony:

<?
  require("mlswap.php"); /* zaladowanie klasy*/
 
  $wml = new wml_doc; /*inicjacja dokumentu WML */
  $card1 = new wml_card; /* Pierwsza podstrona */
  $card2 = new wml_card; /* Druga podstrona */

Aranżujemy wygląd obu kart:

$card1 -> create("Pierwsza");  /* nie podajemy w tej metodzie 2 parametru, wtedy owa karta stanie sie strona glowna i zostanie jej nadany id= main  */
  $card1 -> add("To moja pierwsza strona WAP<br/>");
  $card1 -> add("<a href=\"#card2\">Card 2</a>"); /* wstawiamy link odnoszacy sie do #card2, znak # jest obowiazkowy, a card2 to unikalna nazwa drugiej karty ktora zaraz stworzymy */
 
  $card2 -> create("Druga", "card2");  /* Tworzymy druga karte o identyfikatorze card2 */
  $card2 -> add("A to moja podstrona na wlasnej stronie WAP");
 
  $wml -> add_card($card1); /* tradycyjnie juz inicjujemy 1 karte */
  $wml -> add_card($card2);  /* no i 2 karte */
  $wml -> show(); /* a na koniec wyswietlamy */

Istnieje jeszcze możliwość dodania przycisków nad nagłówkiem strony za pomocą metody add_button z klasy wml_doc. A robi się to tak, że przed wyświetleniem w przeglądarce

$wml -> show();

wstawiamy kod w stylu$wml -> add_button("WSTECZ", "prev");
$wml -> add_button("HOME", "options", "#main");
$wml -> add_button("Podstrona", "options", "#card2");


Wklejenie powyższego kodu wyświetli 3 przyciski kolejn: WSTECZ cofający strone w przeglądarce o jeden do tyłu, HOME ładujący strone główną <i>main</i> oraz Podstrona ładujacy drugą karte <i>card2</i>

<h1>Prolog</h1>

To już wszystko. Wykorzystując ten opis można uatrakcyjnić swój serwis poprzez umożliwienie "komórczakom" wejście na wasza stronę. Napewno przyda się to osobom sprzedajacym loga, gry, dzwonki itp.

Piszczcie w komentarzach co można by dodać do artykułu, co zmienić, ewentualnie co dodać do samej klasy generującej dokument WML, bo świadom jestem, ze nie zawiera ona wszystkiego (jak chociażby parametr $action w języku WML ma conajmniej 4 opcje, a tutaj są dostępne tylko 2).
PHP

0 komentarzy