Strona WAP bez znajomości WML
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ć...
mlswap.php
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 = "prev", $href = "") - 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 = "Main", $id = "main") - 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 = "maintimer") - 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
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:
Następnym krokiem jest stworzenie conajmniej 2 zmiennych, które będa korzystały z obu klas:
Teraz trzeba "stworzyć" wygląd pierwszej strony w $card1:
Na koniec wystarczy zainicjować nową kartę w dokumencie WML oraz wyświetlić wszystko w przeglądarce:
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:
Aranżujemy wygląd obu kart:
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
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).
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 mls@bergerac.home.pl **
** **
** 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/*******************************************************************
** **
** mlswap v 2.0 **
** obiektowe tworzenie stron wml w php **
** ? 2002 mls mls@bergerac.home.pl **
** **
** 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)
**
*/
?>
- 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 = "prev", $href = "") - 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 = "Main", $id = "main") - 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 = "maintimer") - 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");
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 */
$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/>");
$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*/
?>
$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 */
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 */
$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$wml -> add_button("HOME", "options", "#main");
$wml -> add_button("Podstrona", "options", "#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).


