WMLScript

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.

Prom∞nnΘ

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&nbsp;<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&nbsp;<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.

Obrßzek 1. Obsah prom∞nnΘ si p°i p°echodu mezi kartami zachovß

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>

Vstupnφ pole

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>

Obrßzek 2. Vstupnφ pole pro zadßnφ textu

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

ZnakV²znam
ALibovolnΘ velkΘ pφsmeno nebo interpunkce.
aLibovolnΘ malΘ pφsmeno nebo interpunkce.
NLibovolnß Φφslice (0-9).
XLibovolnΘ velkΘ pφsmeno nebo dalÜφ znak.
xLibovolnΘ malΘ pφsmeno nebo dalÜφ znak.
MLibovolnΘ pφsmeno nebo dalÜφ znak, prohlφ₧eΦ by m∞l primßrn∞ nabφzet vstup velk²ch pφsmen.
mLibovolnΘ pφsmeno nebo dalÜφ znak, prohlφ₧eΦ by m∞l primßrn∞ nabφzet vstup mal²ch pφsmen.
*fLibovoln² 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.
nfMaximß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²b∞r ze seznamu

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.

Zßklady äbezdrßtovΘhoô skriptovßnφ

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.

Obrßzek 3. Smajlφk vygenerovan² skriptem

Prom∞nnΘ, podmφnky, cykly, à

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>

Obrßzek 4. S funkcemi a parametry lze vykouzlit r∙znΘ v∞ci. Otßzkou z∙stßvß, jak moc jsou u₧iteΦnΘ ;û)

Knihovny funkcφ

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.

KalkulaΦka

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.

⌐ Ji°φ Kosek 2000-2001