Programowanie w języku PHP

Strona WAP bez znajomości WML

  • 2006-08-03 11:06
  • 0 komentarzy
  • 1084 odsłony
  • Oceń ten tekst jako pierwszy
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ą main oraz Podstrona ładujacy drugą karte card2


Prolog


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).