Jazyk WMLScript umo₧≥uje provßd∞nφ jednoduch²ch operacφ p°φmo v mobilnφm za°φzenφ. Typicky se pou₧φvß nap°φklad pro kontrolu vstupnφch ·daj∙ ve wapov²ch aplikacφch a pro jednoduchΘ v²poΦty (nap°. p°epoΦty kurz∙ m∞n). Standard umo₧≥uje pomocφ skript∙ ovlßdat i n∞kterΘ funkce telefonu jako je posφlßnφ SMS zprßv, sestavenφ a p°ijetφ hovoru, prßce s adresß°em na SIM kart∞ a podobn∞. Bohu₧el, tyto u₧iteΦnΘ vlastnosti zatφm v∞tÜina telefon∙ nepodporuje.
Ne₧ se podφvßme na samotn² skriptovacφ jazyk WMLScript, musφme se seznßmit s koncepcφ prom∞nn²ch, kterou zavßdφ jazyk WML. Na strßnkßch lze pou₧φvat prom∞nnΘ, do kter²ch si m∙₧eme uklßdat libovolnΘ hodnoty. Hodnotu prom∞nnΘ m∙₧e interaktivn∞ nastavit u₧ivatel. Samoz°ejm∞, ₧e prom∞nnou m∙₧eme p°edat i WMLScriptu nebo dokonce aplikaci b∞₧φcφ na n∞jakΘm internetovΘm serveru. Prom∞nnΘ nßm zajistφ komunikaci mezi u₧ivatelem a aplikacφ.
Abychom od sebe jednotlivΘ prom∞nnΘ mohli rozeznat, musφ mφt ka₧dß z nich svΘ jmΘno. Volba jmΘna je v podstat∞ libovolnß, nicmΘn∞ by jmΘno m∞lo zaΦφnat pφsmenem nebo podtr₧φtkem. Pokud se ve WML odvolßvßme na prom∞nnou, je pot°eba ji uzav°φt do zßvorek a p°ed n∞ napsat znak `$'. Pokud chceme do strßnky vlo₧it samotn² znak pro americk² dolar, musφme napsat dva dolary za sebe:
<p>Cena auta je $$3500.</p>
Pro nastavenφ prom∞nnΘ slou₧φ element setvar. Ten m∙₧eme pou₧φt nap°φklad uvnit° elementu go, kter² umo₧≥uje vytvß°enφ odkaz∙, podobn∞ jako element a. Nßsledujφcφ k≤d ilustruje pou₧itφch prom∞nn²ch.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Karta 1"> <p>Obsah promenne x je <b>$(x)</b></p> <p>Prechodem na dalsi kartu nastavite obsah promenne.</p> <do type="accept" label="Dalsi karta"> <go href="#karta2"> <setvar name="x" value="Mobil"/> </go> </do> </card> <card id="karta2" title="Karta 2"> <do type="prev"> <prev/> </do> <p>Obsah promenne x je <b>$(x)</b></p> </card> </wml>
Po zobrazenφ strßnky a jejφ prvnφ karty je prom∞nnß x prßzdnß (viz obr. 1). Jejφ obsah do strßnky vklßdßme pomocφ zßpisu $(x). P°i p°echodu na dalÜφ kartu ji pomocφ <setvar> nastavφme na hodnotu äMobilô. Obsah prom∞nn²ch si telefon pamatuje, a proto p°i nßvratu na p°edchozφ strßnku je obsah prom∞nnΘ rovn∞₧ zobrazen.
Pokud chceme, aby p°i vstupu na kartu prohlφ₧eΦ zapomn∞l obsah vÜech prom∞nn²ch, staΦφ u karty pou₧φt atribut newcontext a nastavit ho na true.
<card newcontext="true"> ... </card>
V∞tÜina alespo≥ trochu smyslupln²ch aplikacφ musφ um∞t komunikovat s u₧ivatelem. Jazyk WML proto nabφzφ vstupnφ pole, do kterΘho m∙₧e u₧ivatel zadßvat hodnoty. Vstupnφ pole se vytvß°φ pomocφ elementu input. Jako hodnotu atributu name musφme uvΘst nßzev prom∞nnΘ, kterß se mß nastavit. Nßsledujφcφ p°φklad dovolφ u₧ivateli zadat jeho jmΘno, kterΘ se takΘ hned na kart∞ zobrazφ.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Zadani jmena" newcontext="true"> <p><input name="jmeno"/></p> <p>Jmeno: $(jmeno)</p> </card> </wml>
M∙₧eme pou₧φt i dalÜφ atributy, kterΘ umo₧nφ upravit velikost vstupnφho pole a hodnoty, kterΘ do n∞j lze zapsat. Velikost vstupnφho pole urΦuje atribut size û jako hodnota se zadßvß poΦet znak∙. Pokud chceme za u₧ivatele do pole p°edvyplnit n∞jakou implicitnφ hodnotu, m∙₧eme ji zadat do atributu default.
Chceme-li, aby u₧ivatel musel do pole zadat alespo≥ jeden znak, staΦφ nastavit atribut emptyok na hodnotu false. Mnohem p°esn∞ji m∙₧eme vstup vymezit pomocφ atributu format. Jako jeho hodnota se uvßdφ maska specifikujφcφ mo₧nΘ vstupy. Znaky, kterΘ lze v masce pou₧φvat shrnuje tabulka 1. Jejich pou₧itφ usnadnφ u₧ivateli vstup, ale ne vÜechny telefony um∞jφ pohlφdat dodr₧enφ vstupnφ masky.
Tabulka 1. Znaky pou₧itelnΘ v masce vstupnφho pole
Znak | V²znam |
---|---|
A | LibovolnΘ velkΘ pφsmeno nebo interpunkce. |
a | LibovolnΘ malΘ pφsmeno nebo interpunkce. |
N | Libovolnß Φφslice (0-9). |
X | LibovolnΘ velkΘ pφsmeno nebo dalÜφ znak. |
x | LibovolnΘ malΘ pφsmeno nebo dalÜφ znak. |
M | LibovolnΘ pφsmeno nebo dalÜφ znak, prohlφ₧eΦ by m∞l primßrn∞ nabφzet vstup velk²ch pφsmen. |
m | LibovolnΘ pφsmeno nebo dalÜφ znak, prohlφ₧eΦ by m∞l primßrn∞ nabφzet vstup mal²ch pφsmen. |
*f | Libovoln² poΦet znak∙, kterΘ vyhovujφ n∞kterΘmu z p°edchozφch formßt∙ f. Tuto konstrukci lze v masce pou₧φt jen jednou a pouze na konci. |
nf | Maximßln∞ n znak∙, kterΘ vyhovujφ n∞kterΘmu z p°edchozφch formßt∙ f. Tuto konstrukci lze v masce pou₧φt jen jednou a pouze na konci. |
Pou₧itφ masky vstupnφch polφ ilustruje nßsledujφcφ jednoduch² p°φklad.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Omezeni vstupu"> <p>Jmeno: <input name="jmeno" format="M*m"/></p> <p>PSC: <input name="psc" format="NNN NN"/></p> </card> </wml>
V mnoha p°φpadech je v²b∞r mo₧nostφ pro u₧ivatele omezen². WML nßm proto nabφzφ element select, kter²m m∙₧eme do strßnky vlo₧it seznam hodnot, z n∞j₧ si m∙₧eme vybrat jednu nebo vφce hodnot. JednotlivΘ mo₧nosti se zadßvajφ pomocφ elementu option. Prom∞nnou, do kterΘ se ulo₧φ hodnota v²b∞ru, urΦφme op∞t pomocφ atributu name u elementu select.
Nßsledujφcφ k≤d obsahuje seznam, ze kterΘho si u₧ivatel m∙₧e vybrat jednu hodnotu. Do prom∞nnΘ se pak ulo₧φ hodnota atributu value p°φsluÜnΘ volby.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Vyber ze seznamu"> <p>Vyberte si menu: <select multiple="false" name="mena"> <option value="DEM">nemecka marka</option> <option value="USD">americky dolar</option> <option value="CZK">ceska koruna</option> </select> </p> <p>Kod vybrane meny: $(mena)</p> </card> </wml>
Seznamy majφ samoz°ejm∞ mnohem vφce mo₧nostφ, ale nemßme zde bohu₧el prostor je dßle podrobn∞ji rozebφrat.
WMLScript je velice jednoduch² skriptovacφ jazyk. A₧ na pßr detail∙ je hodn∞ podobn² jazyku JavaScript, kter² se pou₧φvß pro tvorbu skript∙ na webov²ch strßnkßch.
VÜechny skripty se musφ zapisovat odd∞len∞ od WML k≤du do samostatn²ch soubor∙, kterΘ majφ obvykle p°φponu .wmls. Soubor se skripty typicky obsahuje definice n∞kolika funkcφ. N∞kterΘ z t∞chto funkcφ jsou definovßny jako externφ. To znamenß, ₧e je m∙₧eme zavolat z n∞jakΘ wapovΘ strßnky.
Definice funkce, kterou lze zavolat z n∞jakΘ strßnky, se musφ dr₧et nßsledujφcφ kostry:
extern function nßzev (parametry) { t∞lo funkce }
Kdy₧ chceme z n∞jakΘ strßnky takovou funkci zavolat, musφme vytvo°it odkaz ve specißlnφm tvaru. Pokud by se naÜe funkce jmenovala fun a byla ulo₧ena v souboru skript.wmls, pro jejφ vyvolßnφ by slou₧ila URL adresa:
skript.wmls#fun()
Tento dost neobvykl² zp∙sob volßnφ funkce mß jednu podstatnou v²hodu û skripty jsou zcela odd∞leny od WML k≤du. ProblΘm vÜak je, jak od funkce p°evzφt zp∞t n∞jak² v²sledek. Pou₧φvajφ se k tomu prom∞nnΘ. Z WMLScriptu m∙₧eme nastavovat hodnoty prom∞nn²ch, kterΘ se zobrazujφ na strßnce.
Nastavenφ prom∞nnΘ se provede zavolßnφm specißlnφ funkce WMLBrowser.setVar(). Jako parametry se musφ p°edat nßzev prom∞nnΘ a jejφ novß hodnota. Po nastavenφ vÜech prom∞nn²ch je jeÜt∞ pot°eba zavolat funkci WMLBrowser.refresh(), kterß p°ekreslφ kartu a zaktualizuje zobrazenφ prom∞nn²ch.
Pokud si do souboru smajlik.wmls ulo₧φme nßsledujφcφ k≤d
extern function ukaz() { WMLBrowser.setVar("smajlik", ";-)"); WMLBrowser.refresh(); }
nic nebrßnφ tomu ud∞lat strßnku, na kterΘ se smajlφk zobrazφ a₧ v okam₧iku aktivace odkazu u₧ivatelem
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Smajlik" newcontext="true"> <p>$(smajlik)</p> <p><a href="smajlik.wmls#ukaz()">Ukaz smajlika!</a></p> </card> </wml>
Cel² princip prßce strßnky a skriptu je p°itom velice jednoduch². Na strßnku je vlo₧en² obsah prom∞nnΘ (pomocφ zßpisu $(smajlik)). Po aktivaci odkazu skript zm∞nφ obsah tΘto prom∞nnΘ a vyvolß p°ekreslenφ obrazovky prohlφ₧eΦe.
Krom∞ prom∞nn²ch na strßnce m∙₧eme ve WMLScriptu pou₧φvat vlastnφ prom∞nnΘ. Ty je pot°eba p°edem deklarovat. Ve WMLScriptu se neurΦuje typ prom∞nnΘ, pouze se za slovo var napφÜe seznam prom∞nn²ch, kterΘ chceme deklarovat. Pokud budeme ve funkci pou₧φvat nap°φklad prom∞nnΘ a a b, uvedeme na jejφm zaΦßtku:
var a, b;
P°i°azenφ hodnoty do prom∞nnΘ se d∞je pomocφ operßtoru =. Do prom∞nnΘ m∙₧eme p°i°adit Φφslo nebo textov² °et∞zec. Hodnoty textov²ch °et∞zc∙ je pot°eba uzav°φt do uvozovek nebo apostrof∙.
a = 10; b = "Ahoj";
Jak vidφte, je dobrΘ p°φkazy odd∞lovat st°ednφkem, aby prohlφ₧eΦ poznal, kde jeden p°φkaz konΦφ a dalÜφ zaΦφnß.
Podle pot°eb m∙₧eme Φßsti skriptu provßd∞t podmφn∞n∞. Slou₧φ k tomu p°φkaz if, kter² mß nßsledujφcφ syntaxi:
if (podmφnka) { p°φkazy p°i spln∞nφ podmφnky } else { p°φkazy p°i nespln∞nφ podmφnky }
╚ßst else je p°itom nepovinnß a nemusφme ji uvßd∞t. Pokud chceme v zßvislosti na podmφnce provΘst jen jeden p°φkaz, m∙₧eme vynechat i slo₧enΘ zßvorky.
V podmφnce se nejΦast∞ji porovnßvß hodnota prom∞nnΘ. Pro porovnßnφ dvou hodnot se ve WMLScriptu pou₧φvß operßtor ==. Ne, nenφ to p°eklep, rovnφtka musφ b²t dv∞ za sebou. Nap°.
if (a == 10) { b = "Desetkrßt ahoj!!!!!!!"; }
Ve WMLScriptu m∙₧eme pou₧φvat i n∞kolik druh∙ cykl∙. Jednak je to klasick² cyklus while, kter² probφhß dokud je spln∞na n∞jakß podmφnka. Stßle dokola se vykonßvajφ vÜechny v n∞m pou₧itΘ p°φkazy.
while (podmφnka) { p°φkazy }
Pokud chceme p°esn∞ urΦit poΦet opakovßnφ p°φkaz∙, je v∞tÜinou v²hodn∞jÜφ pou₧φt cyklus for. Pokud chceme n∞co provΘst desetkrßt, poslou₧φ k tomu nßsledujφcφ skript.
var i; for (i=0; i<10; i++) { p°φkazy }
PraktickΘ vyu₧itφ ukazuje nßsledujφcφ variace na smajlφky. Strßnka nynφ obsahuje t°i odkazy, ka₧d² vyvolß zobrazenφ jinΘho poΦtu smajlφk∙. P°φklad rovn∞₧ ukazuje, jak lze funkci p°edßvat parametry. Nejprve definice funkce v souboru smajlici.wmls.
extern function ukaz(n) { var s = "", i; if (n > 0) { s = s + ";-"; for (i=0; i<n; i++) { s = s + ")"; } } WMLBrowser.setVar("smajlik", s); WMLBrowser.refresh(); }
A nynφ strßnka, kterß skript pou₧φvß:
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Smajlik" newcontext="true"> <p>$(smajlik)</p> <p> <a href="smajlici.wmls#ukaz(10)">Ukaz 10 smajliku!</a><br/> <a href="smajlici.wmls#ukaz(20)">Ukaz 20 smajliku!</a><br/> <a href="smajlici.wmls#ukaz(0)">Zrus smajliky!</a><br/> </p> </card> </wml>
Pro usnadn∞nφ prßce programßtora obsahuje WMLScript sadu n∞kolika knihoven, kterΘ podporujφ prßci s Φφsly, textov²mi °et∞zci, URL adresami apod. Podrobn² popis vÜech knihoven naleznete ve specifikacφch W@Pu (internetovΘ adresy jsou na konci Φlßnku).
Krom∞ t∞chto standardnφch knihoven jsou k dispozici i knihovny, kterΘ umo₧≥ujφ spolupracovat s prohlφ₧eΦem. Ty jsme pou₧φvali pro nastavenφ hodnoty prom∞nnΘ nebo pro p°ekreslenφ karty.
Na zßv∞r naÜeho krßtkΘho v²letu do sv∞ta WMLScriptu si ukß₧eme, jak pomocφ WMLScriptu vytvo°it jednoduchou kalkulaΦku. Nejprve si vytvo°φme strßnku s kartou, kde m∙₧eme zadat dv∞ Φφsla a ze seznamu si vybrat jednu ze Φty° matematick²ch operacφ. ╚φsla a operßtor se pak pomocφ parametr∙ p°edajφ funkci, ta spoΦφtß v²sledek a vrßtφ nßm ho v prom∞nnΘ.
<?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card title="Kalkulacka" newcontext="true"> <p>A: <input name="a" type="text" format="*N" emptyok="false" size="5"/><br/> B: <input name="b" type="text" format="*N" emptyok="false" size="5"/><br/> Operace: <select multiple="false" name="operace"> <option value="+">scitani</option> <option value="-">odcitani</option> <option value="*">nasobeni</option> <option value="/">deleni</option> </select> </p> <do type="accept" label="Spocti!"> <go href="kalkulacka.wmls#spocti($(a),$(b),'$(operace)')"/> </do> <p>Vysledek: $(vysledek)</p> </card> </wml>
VÜimn∞te si, ₧e kdy₧ p°edßvßme jako parametr funkce prom∞nnou, kterß m∙₧e obsahovat textov² °et∞zec (v naÜem p°φpad∞ operßtor), musφme jejφ hodnotu uzav°φt do apostrof∙ nebo uvozovek.
O samotn² v²poΦet se starß nßsledujφcφ skript kalkulacka.wmls.
extern function spocti(a, b, op) { // deklarace pomocne promenne var vysl; // dekodovani textoveho parametru op = URL.unescapeString(op); // vyber prislusne operace a jeji provedeni if (op == "+") vysl = a + b; else if (op == "-") vysl = a - b; else if (op == "*") vysl = a * b; else if (op == "/" && b == 0) vysl = "Nulou nelze delit"; else vysl = a / b; // nastaveni promenne s vysledkem WMLBrowser.setVar("vysledek", vysl); // aktualizace prohlizece WMLBrowser.refresh(); }
Jedinou novinkou v tomto skriptu je volßnφ funkce URL.unescapeString(), kterß slou₧φ k dek≤dovßnφ °et∞zce z tvaru, ve kterΘm byl p°enesen ze strßnky. Funkce se volajφ jako souΦßst URL adresy a proto se i jejich parametry p°evßdφ v souladu s URL konvencemi.