lunes, 17 de mayo de 2010
WMLScript - Parte IV / IV
Con la finalidad de agilizar la tarea del programador y de reducir el número de código a enviar al teléfono cada vez que se ejecuta un programa en WMLScript, se han incorporado a los móviles una serie de bibliotecas estándar de WMLScript, de cuyas funciones podemos hacer uso.
Destacar que, para poder llamar a alguna de dichas funciones:
1. No es necesario incluir ningún fichero extra en el fichero desde el que se hace la llamada
2. La llamada a funciones de biblioteca tiene la forma:
nombreDeLaBiblioteca.nombreDeLaFuncion( parámetros )
Es decir, que se usa el punto (.) y no la almohadilla para llamar a la función.
4.2 WMLBrowser
La biblioteca WMLBrowser se usa para poder acceder al contexto de la página WML, esto es, a sus variables. Las funciones que forman parte de esta biblioteca devolverán el valor invalid solo si el teléfono no soporta llamadas a esta biblioteca.
Veamos algunas de sus funciones (atención a mayúsculas y minúsculas):
--------------------------------------------------------------------------------
getVar( nombreDeVariablestring )
Devuelve el valor de la variable nombreDevariable. Si dicha variable no existiera, devuelve la cadena vacía.
Ejemplo:
var a=WMLBrowser.getVar( 'edad' );
--------------------------------------------------------------------------------
setVar( nombreDeVariablestring, valorstring )
Asigna a la variable el valor especificado.
Devuelve true si la asignación es satisfactoria, false en otro caso.
Ejemplo:
var a=WMLBrowser.setVar( 'edad', '18' ); // a=true
--------------------------------------------------------------------------------
go( urlstring )
Carga en el teléfono la página indicada en url. Si url es la cadena vacía, no hace nada.
Devuelve cadena vacía.
Ejemplo:
var a=WMLBrowser.go( 'http://geneura.ugr.es/wap/index.wml' ); // a=""
-------------------------------------------------------------------------------
prev( )
Carga en el teléfono la página anterior a la actual en el historial.
Devuelve cadena vacía.
Ejemplo:
var a=WMLBrowser.prev(); // a=""
--------------------------------------------------------------------------------
newContext( )
Reinicia el contexto de la página WML activa.
Devuelve cadena vacía.
Ejemplo:
var a=WMLBrowser.newContext(); // a=""
--------------------------------------------------------------------------------
getCurrentCard( )
Devuelve el URL relativo más pequeño especificando la carta (si es que la hay) que está siendo procesada en ese instante por el teléfono.
Ejemplo:
var a=WMLBrowser.getCurrentCard(); //
--------------------------------------------------------------------------------
refresh( )
Actualiza el contexto del teléfono haciendo que muestre de nuevo la carta que está procesando. Es especialmente útil para mostrar en pantalla el valor de las variables "globales" una vez han sido calculadas.
Devuelve la cadena vacía
Ejemplo:
var a=WMLBrowser.refresh(); //
--------------------------------------------------------------------------------
Ejercicio 1:
Realizar una página WML con tres cartas.
La primera dará un mensaje de bienvenida; también pedirá el nombre y el año de nacimiento de una persona e incorporará una opción de "ENTRAR AL SITIO WAP". Al seleccionar esta opción se invocará a una función WMLScript que calculará a partir del año de nacimiento si el usuario tiene más de 17 años o no. Si tiene más de 17 años lo enviará a la segunda carta indicándole que puede entrar al sitio WAP. Si no tiene más de 17 años lo enviará a la tercera carta diciéndole que NO puede entrar.
Ejercicio 2:
Realizar una página WML compuesta de dos cartas.
La primera de ellas debe disponer de una variable que comience valiendo 5 y un temporizador de 2 segundos de duración. Cuando se active el evento provocado por el temporizador se debe llamar a una función en WMLScript que haga decrecer la variable contadora, la muestre en pantalla y provoque un salto de nuevo a la primera carta si el contador no ha llegado a cero y a la segunda si ya lo ha hecho.
La segunda carta no tiene más que mostrar un mensaje para confirmar que se ha saltado a ella.
4.3 Lang
Esta biblioteca, Lang, contiene un conjunto de funciones directamente relacionadas con la especificación del lenguaje WMLScript.
--------------------------------------------------------------------------------
abs( valornúmero )
Devuelve el valor absoluto del número que se le pasa.
Ejemplo:
var a=Lang.abs( -24.89 ); // a=24.89
--------------------------------------------------------------------------------
min( valor_1número, valor_2número )
Devuelve el valor menor de los dos que se le pasan.
Ejemplo:
var a=Lang.min( 75, -1 ); // a=-1
-------------------------------------------------------------------------------
max( valor_1número, valor_2número )
Devuelve el valor mayor de los dos que se le pasan.
Ejemplo:
var a=Lang.max( 75, -1 ); // a=75
--------------------------------------------------------------------------------
parseInt( valorstring )
Devuelve el valor entero correspondiente a la cadena que se le ha pasado, parando en el momento en que encuentra cualquier carácter distinto de los dígitos 0 al 9.
Ejemplo:
var a=Lang.parseInt( '120 km/h' ); // a=175
--------------------------------------------------------------------------------
parseFloat( valorstring )
Devuelve el valor real correspondiente a la cadena que se le ha pasado, parando en el momento en que encuentra cualquier carácter distinto de los dígitos 0 al 9, el punto (.) o la letra e indicadora de la notación científica.
Ejemplo:
var a=Lang.parseFloat( '-1.20e2 km/h' ); // a=1.2e2
--------------------------------------------------------------------------------
isInt( valorcualquier tipo )
Devuelve true si el valor pasado puede convertirse a entero usando parseInt
Ejemplo:
var a=Lang.isInt( '24.78 km/h' ); // a=true
--------------------------------------------------------------------------------
isFloat( valorcualquier tipo )
Devuelve true si el valor pasado puede convertirse a real usando parseFloat
Ejemplo:
var a=Lang.isFloat( '24.78e3 km/h' ); // a=true
--------------------------------------------------------------------------------
maxInt()
Devuelve el mayor número entero soportado.
Ejemplo:
var a=Lang.maxInt( ); // a=2147483647
--------------------------------------------------------------------------------
minInt()
Devuelve el menor número entero soportado.
Ejemplo:
var a=Lang.minInt( ); // a=-2147483648
--------------------------------------------------------------------------------
float()
Devuelve true si se soportan los números reales, false si no.
Ejemplo:
var a=Lang.float( ); // a=depende del teléfono
--------------------------------------------------------------------------------
exit ( valorcualquier tipo)
Finaliza la interpretación del código en WMLScript devolviendo el control a la entidad que llamó a la función.
Devuelve el valor que se le pasa como parámetro.
Ejemplo:
Lang.exit( "Finalizando. Código 1");
--------------------------------------------------------------------------------
abort( valorstring)
Finaliza la interpretación del código en WMLScript devolviendo el control a la entidad que llamó a la función junto a una descripción del error. Se utiliza cuando no se puede continuar con la ejecución del código en WMLScript debido a problemas serios.
Devuelve el valor que se le pasa como parámetro.
Ejemplo:
Lang.abort( "Fatal error");
--------------------------------------------------------------------------------
random( valornúmero)
Devuelve un número entero aleatorio (bueno, pseudo-aleatorio) entre 0 y el valor que se le pasa (ambos incluidos). El valor no puede ser negativo, y si es un número real, primero se pasa a entero (con Float.int).
Ejemplo:
var a=Lang.random( 10 )-5; // a=-5..5
--------------------------------------------------------------------------------
seed( valornúmero)
Inicializa el generador de números aleatorios con el valor que se le pasa. Si dicho valor es negativo se usa inicializa a un valor aleatorio. Si es un valor no válido, no se cambia el valor de inicialización.
Devuelve cadena vacía.
Ejemplo:
var a=Lang.seed( 5 ); // a=""
--------------------------------------------------------------------------------
characterSet( )
Devuelve el código del juego de caracteres usado por el teléfono que está ejecutando el WMLScript. Dicho código es establecido por el IANA.
Ejemplo:
var a=Lang.characterSet(); // a=4 para latin1
--------------------------------------------------------------------------------
Ejercicio 3:
Realizar una página WML que pida dos números reales y permita elegir una operación entre: SUMAR, RESTAR, MULTIPLICAR y DIVIDIR.
Una vez elegida la operación e introducidos los números, llamar a una función WMLScript que realice la operación y muestre el resultado.
Ejercicio 4:
Hacer una función WMLScript que genere secuencias de números de 4 dígitos aleatorios. Estos números podemos pensar que son los PINES de las tarjetas de crédito de una persona.
Para utilizar la función crear una página WML que pida un pin de 4 dígitos el cual será usado como semilla para generar la secuencia anteriormente citada.
Lo que se persigue es que siempre que el usuario introduzca el mismo pin se le muestre la misma secuencia de pines aleatorios.
4.4 Float
La biblioteca Float contiene las funciones que más se utilizan a la hora de operar con números reales.
--------------------------------------------------------------------------------
int( valornúmero )
Devuelve la parte entera del número que se le pasa como parámetro.
Ejemplo:
var a=Float.int( -0.34) // a=0
--------------------------------------------------------------------------------
floor( valornúmero )
Devuelve el número entero más cercano pero no mayor que el valor que se le pasa.
Ejemplo:
var a=Float.floor( -0.34) // a=-1
var b=Float.floor( 2.34) // b=2
--------------------------------------------------------------------------------
ceil( valornúmero )
Devuelve el número entero más cercano pero no menor que el valor que se le pasa.
Ejemplo:
var a=Float.ceil( -0.34) // a=-0
var b=Float.ceil( 2.34) // b=3
--------------------------------------------------------------------------------
pow( valor_1número,valor_2número )
Devuelve valor_1 elevado a valor_2, teniendo en cuenta que si valor_1 es negativo, valor_2 debe ser un entero.
Ejemplo:
var a=Float.pow( 5,3) // a=125
--------------------------------------------------------------------------------
round( valornúmero )
Devuelve el número entero más cercano al valor que se le pasa.
Ejemplo:
var a=Float.round( -0.34) // a=-0
var b=Float.round( 2.65) // b=3
------------------------------------------------------------------------------
sqrt( valornúmero )
Devuelve la raíz cuadrada del valor que se le pasa. Dicho valor debe ser positivo, si no devuelve invalid.
Ejemplo:
var a=Float.sqrt( 123*123) // a=123
--------------------------------------------------------------------------------
maxFloat( )
Devuelve el mayor número real soportado.
Ejemplo:
var a=Float.maxFloat() // a=4.40282347E+38
--------------------------------------------------------------------------------
minFloat( )
Devuelve el menor número real soportado.
Ejemplo:
var a=Float.minFloat() // a=1.17549435E-38
--------------------------------------------------------------------------------
Ejercicio 5:
Modificar la calculadora del ejercicio 3 para que permita hacer otras operaciones como potencias, raíces cuadradas, etc.
4.5 String
String aglutina funciones para el tratamiento de cadenas, aunque también nos puede servir para implementar matrices.
--------------------------------------------------------------------------------
length( cadenastring )
Devuelve un número entero indicando el número de caracteres que forman la cadena.
Ejemplo:
var a=String.length( "Hola!" ) // a=5
--------------------------------------------------------------------------------
isEmpty( cadenastring )
Devuelve true si la cadena es vacía.
Ejemplo:
var a=String.isEmpty( "Hola!" ) // a=false
--------------------------------------------------------------------------------
charAt( cadenastring, posicionnúmero )
Devuelve el carácter que se halla en la posición indicada de la cadena (el primer carácter está en la posición 0).
Ejemplo:
var a=String.charAt( "Hola!",2 ) // a="l"
--------------------------------------------------------------------------------
subString( cadenastring, posicionnúmero, longitudnúmero )
Devuelve la subcadena incluida en cadena empezando en posición y tomando longitud caracteres a partir de ella.
Ejemplo:
var a=String.subString( "Hola!",2,3 ) // a="la!"
--------------------------------------------------------------------------------
find( cadena_1string, cadena_2string )
Devuelve el índice del carácter a partir del cual se encuentra la cadena_2 incluida en cadena_1. Si no se incluye, devuelve -1.
Ejemplo:
var a=String.find( "Hola!","ol" ) // a=1
--------------------------------------------------------------------------------
replace( cadenastring, viejostring, nuevostring )
Devuelve una nueva cadena en la que se han substuido todas las ocurrencias de viejo por nuevo.
Ejemplo:
var a=String.replace( "Pandereta","a","1" ) // a="P1nderet1"
--------------------------------------------------------------------------------
elements( cadenastring, separadorcarácter )
Devuelve el número de elementos en la cadena separados por el separador.
Ejemplo:
var a=String.elements( "mi.casa.es","." ) // a=3
--------------------------------------------------------------------------------
elementAt( cadenastring, posiciónnúmero, separadorcarácter )
Devuelve el elemento número posición que resulta de descomponer la cadena según el separador.
Ejemplo:
var a=String.elementAt( "mi.casa.es",2,"." ) // a="es"
--------------------------------------------------------------------------------
removeAt( cadenastring, posiciónnúmero, separadorcarácter )
Devuelve la misma cadena en la que se ha quitado el elemento número posición que resulta de descomponer la cadena según el separador. El separador que sigue al elemento a quitar también desaparece.
Ejemplo:
var a=String.removeAt( "mi.casa.es",1,"." ) // a="mi.es"
--------------------------------------------------------------------------------
replaceAt( cadenastring, nuevostring posiciónnúmero, separadorcarácter )
Devuelve la misma cadena en la que se ha substituido por nuevo el elemento número posición que resulta de descomponer la cadena según el separador.
Ejemplo:
var a=String.replaceAt( "mi.casa.es","perro",1,"." ) // a="mi.perro.es"
--------------------------------------------------------------------------------
insertAt( cadenastring, nuevostring posiciónnúmero, separadorcarácter )
Devuelve la misma cadena en la que se ha incluido nuevo el elemento número posición que resulta de descomponer la cadena según el separador. Junto a nuevo se incluye el separador si hace falta.
Ejemplo:
var a=String.insertAt( "mi.casa.es","perro",1,"." ) // a="mi.perro.casa.es"
--------------------------------------------------------------------------------
squeeze( cadenastring )
Devuelve la misma cadena en la que se han substituido los grupos de espacios en blanco por uno solo.
Ejemplo:
var a=String.squeeze( "esta es mi casa" ) // a="esta es mi casa"
--------------------------------------------------------------------------------
trim( cadenastring )
Devuelve la misma cadena en la que se han quitado todos los espacios del principio y del final.
Ejemplo:
var a=String.trim( " esta es mi casa " ) // a="esta es mi casa"
--------------------------------------------------------------------------------
compare( cadena_1string, cadena_2string )
Devuelve -1 si cadena_1 va alfabéticamente antes que cadena_2; 0 si son iguales y 1 si es al revés.
Ejemplo:
var a=String.compare( "Juan", "Luis") // a=-1
--------------------------------------------------------------------------------
toString( valorcualquier tipo )
Devuelve una cadena que representa al valor que se le ha pasado.
Ejemplo:
var a=String.toString( 12 ) // a="12";
var b=String.toString( false ) // b="false";
--------------------------------------------------------------------------------
format( formatocadena, valorcualquier tipo )
Devuelve una cadena que representa al valor que se le ha pasado utilizando el formato que se le indica como parámetro.
El formato se especificará como:
%[longitud].[precision] tipo
donde el tipo puede ser:
d Entero
f Real
s Cadena
Ejemplo:
var a=String.format( "%4d",12 ) // a=" 12";
var b=String.toString( "%2.3f", 1.25 ) // b="1.250";
--------------------------------------------------------------------------------
Ejercicio 6:
Crear una función que compruebe si tras quitar los espacios iniciales y finales a una cadena sigue quedando algo o es la cadena vacía.
Ejercicio 7:
Realizar una página WML que pida el nombre y apellidos de una persona. Llamar posteriomente a una función WMLScript que muestre en pantalla las iniciales de dicha persona a partir de su nombre y apellidos.
Ejercicio 8:
Realizar una página WML qie pida el nombre y apellidos de una persona. Posteriormente llamara a una función WMLScript que le genere cinco posibles identificadores (para login o correo electrónico) atendiendo a las siguientes cinco reglas:
1. Iniciales del nombre seguidas del primer apellido.
2. Primer nombre más iniciales de los apellidos.
3. Iniciales del nombre y del primer apellido seguidas del último apellido.
4. Primer nombre y primer apellido separados por _.
5. Nombre completo (cambiando los espacios por _ si los hubiera) seguido de 4 dígitos aleatorios.
4.6 Url
La biblioteca URL contiene funciones que manejan direcciones URL tanto absolutas como relativas.
Téngase en cuenta que la sintaxis genérica de un URL es:
scheme://host:port/path;params?query#fragment
--------------------------------------------------------------------------------
isValid( urlcadena )
Devuelve true si la cadena que se le pasa tiene una sintaxis correcta de URL, y false si no.
Ejemplo:
var a=URL.isValid( "http://geneura.ugr.es/w.html?a=5" )// a=true
var b=URL.isValid( "algo:??//conecta.com" ); // b=false
--------------------------------------------------------------------------------
getScheme( urlcadena )
getHost( urlcadena )
getPort( urlcadena )
getPath( urlcadena )
getParameters( urlcadena )
getQuery( urlcadena )
getFragment( urlcadena )
Devuelven cada una la parte del URL correspondiente según la sintaxis:
scheme://host:port/path;params?query#fragment
Ejemplo:
var a=URL.getScheme( "http://www.algo.es/" ) // a="http" var b=URL.getHost( "http://www.algo.es" ) // b="www.algo.es" var c=URL.getPort( "http://www.algo.es:8080" ) // c="8080" var d=URL.getPath( "http://www.algo.es/d1/d2/h.html" ) // d="/d1/d2/h.html" var e=URL.getParameters( "http://www.algo.es/h.html;3;4" ) // e="3;4" var f=URL.getQuery( "http://www.algo.es/h.html?name=pepe" ) // f="name=pepe" var g=URL.getFragment( "http://www.algo.es/h.html#ancla" ) // g="ancla"
--------------------------------------------------------------------------------
getBase( )
Devuelve el URL absoluto (sin la parte del fragment) de la biblioteca en que se ejecuta.
Ejemplo:
var a=URL.getBase( ) // a="http://www.algo.es/w.wmls"
--------------------------------------------------------------------------------
getReferer( )
Devuelve el URL relativo más pequeño del fichero desde el que se llamó a la biblioteca en que se ejecuta.
Ejemplo:
var a=URL.getReferer( ) // a="w1.wml"
--------------------------------------------------------------------------------
resolve( URLBasestring, URLIncluidostring )
Devuelve el URL absoluto que se forma uniendo el URLBase con el URLIncluido.
Ejemplo:
var a=URL.resolve( "http://www.a.es/","h.html") // a="http://www.a.es/h.html"
--------------------------------------------------------------------------------
escapeString( cadenastring )
Devuelve la cadena que se le pasa convirtiendo los caracteres especiales en su correspondiente secuencia en hexadecimal con la forma %xx.
Los caracteres especiales son:
- De control: del 00 al 1F y el 7F.
- Espacio: el 20.
- Reservados: ; / ? : @ & = + $ ,
- Otros: { } | \ ^ [ ] `
- Delimitadores: < > # % "
Ejemplo:
var a=URL.escapeString( "http://www.a.es/") // a="http%3a%2f%2fwww.a.es%2f"
--------------------------------------------------------------------------------
unescapeString( cadenastring )
Devuelve la cadena que se le pasa convirtiendo los caracteres especiales de su correspondiente secuencia en hexadecimal a su representación normal.
Ejemplo:
var a=URL.escapeString( "http%3a%2f%2fwww.a.es%2f") // a="http://www.a.es/"
--------------------------------------------------------------------------------
loadString( urlstring, contenidostring )
Devuelve el contenido especificado por el url absoluto y el tipo de contenido
Ejemplo:
var a=URL.loadString( "http://www.a.es/yo.vcf", "text/x-vcard") // a=contendría la información de la vcard especificada.
4.7 Dialogs
Dialogs es una biblioteca con tres funciones cuyos nombres y funcionalidad serán muy conocidos por los programadores de JavaScript.
--------------------------------------------------------------------------------
alert( mensajestring)
Muestra el mensaje al usuario y espera hasta que pulsa OK.
Devuelve la cadena vacía.
Ejemplo:
Dialogs.alert( "Contacte en el 555 45 43 42" );
--------------------------------------------------------------------------------
confirm( mensajestring, aceptarstring, cancelarstring )
Muestra al usuario un mensaje junto a las alternativas aceptar y cancelar, y espera a que éste elija una de ellas.
Devuelve true si el usuario elige la alternativa aceptar, false si elige cancelar.
Ejemplo:
var a=Dialogs.confirm( "¿Desea acabar?", "Si", "No") // a=true o false
--------------------------------------------------------------------------------
prompt( mensajestring, valorPorDefectostring )
Muestra al usuario un mensaje y le permite introducir un valor, dándole también un valor por defecto.
Devuelve una cadena con el valor introducido por el usuario.
Ejemplo:
var a=Dialogs.prompt( "Su marca de coche:", "Seat" ); // a=lo que introduzca el usuario
--------------------------------------------------------------------------------
Ejercicio 9:
Realizar una página WML que permita introducir pares de valores nombre de producto/precio, alertando al usuario si introduce valores vacíos o negativos. La página debe ser tal que permita añadir nuevos productos, vaciar la lista entrea y visualizarla.
WMLScript - Parte III / IV
WMLScript es distinto. Es necesario definir funciones en ficheros externos y, posteriormente, hacer llamadas a las mismas desde la página WML.
Los ficheros con código WMLScript deben llevar extensión .wmls. Estos ficheros son a su vez compilados a un código intermedio, llamado bytecode que es el que realmente se manda al teléfono. Las extensiones de los ficheros compilados a bytecode es .wmlsc, conservándose como nombre el mismo que el del fichero con el código fuente.
La estructura de un fichero en WMLScript está formada por dos partes:
1. Zona de directivas pragma.
2. Zona de declaración de funciones.
Pasemos a ver cada una de ellas.
3.2 Directivas Pragma
Los ficheros con código WMLScript comienzan por una zona en la que se incluyen los llamados pragma, que traduciremos por directivas del compilador, dado que son sentencias con información para el compilador, más que para las páginas WML.
Existen tres tipos de directivas:
- Para incluir ficheros externos (pragma url)
- Para controlar el acceso a las funciones(pragma access)
- Para añadir información adicional(pragma meta)
Veamos para qué sirven y cómo se usan cada uno de ellos.
3.3.1. Pragma url
Sirve para poder usar en nuestra biblioteca funciones que están definidas en otras bibliotecas.
Se usan de la siguiente forma:
use url identificador direccion_de_la_biblioteca_a_usar;
Por ejemplo:
use url mi_bib_1 "http://geneura.ugr.es/wap/script/bib_1.wmls";
El haber incorporado esta línea a la biblioteca permitirá hacer llamadas a funciones que estén definidas en el fichero bib_1.wmls que se especifica, y además proporciona un identificador a dicho fichero (en este caso el identificador es mi_bib_1), de modo que podremos hacer llamadas como la siguiente:
mi_bib_1#mi_funcion( parametros)
Por supuesto, la dirección del fichero con la biblioteca externa puede ser absoluta (como en el ejemplo) o relativa al fichero que contiene la biblioteca que estemos construyendo en ese instante. En cualquier caso, deben ser direcciones válidas que NO contengan el carácter #.
Se pueden incluir tantas directivas url como sean necesarias.
3.3.3. Pragma access
Permite restringir el acceso a las funciones contenidas en la biblioteca solo a las páginas WML que procedan de ciertos dominios y/o directorios.
Se usa de la siguiente forma:
use access domain dominio_permitido;
use access path directorio_permitido;
use access domain dominio_permitido path directorio_permitido;
Por ejemplo:
use access domain "ugr.es" path "/wml
Permitiría el acceso desde las siguientes direcciones:
- geneura.ugr.es/wml/~victor/wap
- goliat.ugr.es/wml/wap-pages
- fedro.ugr.es/wml
Pero no lo permitiría a llamadas que proviniesen de sitios como:
- geneura.ugr.es/cgi-bin
- www.ujaen.es
- fedro.ugr.es/wap/wml
Solo se puede incluir una directiva access en cada fichero.
3.3.3. Pragma meta
Permiten añadir información extra al fichero WMLScript, sin requerir ninguna acción especial por parte del teléfono que llama a la función.
Existen tres tipos de directivas meta:
- use meta name nombre contenido esquemaopc;
- use meta http equiv nombre contenido esquemaopc;
- use meta user agent nombre contenido esquemaopc;
donde:
nombre especifica un nombre para la propiedad meta que se está definiendo.
contenido es el valor para dicha propiedad.
esquema indica un formato o estructura que debe ser usada para interpretar el valor (y que varía en función del tipo de meta que se define).
En un fichero en el que se está definiendo una biblioteca se pueden incluir más de una directiva meta, pero solo una de cada tipo.
3.3.3.1. use meta name
Crea información dirigida al servidor web, no al teléfono móvil. De hecho, los servidores suelen quitar está información del bytecode y no la envían al teléfono.
Ejemplo:
use meta name "autor" "Víctor Rivas Santos";
3.3.3.3. use meta http equiv
Permite crear cabeceras HTTP, de modo que podamos definir meta como en HTML
Ejemplo:
use meta http equiv "keywords" "WMLScript,Wap";
3.3.3.3. use meta user agent
Permite mandar cierta información al teléfono que realiza la llamada a la función. Evidentemente, la información que se puede mandar varía de unos teléfonos a otros.
Ejemplo:
use meta user agent "Type" "prueba";
3.3 Declarar funciones
Antes de ver cómo se declaran funciones, vamos a dar algunos datos de ellas:
- No se pueden declarar funciones anidadas
- El nombre de cada función debe ser único dentro de cada fichero
- Todos los parámetros son pasados por VALOR a la función
- En las llamadas a una funcion se le deben pasar el mismo número de valores como parámetros necesite
- Todas las funciones devuelven un valor, que por defecto es la cadena vacía, ""
La declaración de funciones se realiza de la siguiente forma:
externopc function nombre( parámetrosopc ) {
sentenciasopc
}
La palabra extern indica si la función que se declara puede ser llamada desde el exterior de la biblioteca o no (tomando en consideración el contenido del pragma access que se pudiera haber colocado). Como se ve, es necesario indicarlo para que se pueda llamar a la función desde fuera, pues por defecto no se permite.
Todas las funciones devuelven un valor que, por defecto es la cadena vacía. No obstante esto puede ser modificado mediante la sentencia:
return expresion;
Que permite devolver cualquier tipo de valor.
He aquí un ejemplo:
extern function percentage( cantidad, perc ) { return cantidad*perc/100; }
Como ya se dijo, la forma de realizar una llamada a una función dependerá de dónde esté declarada dicha función. Así, distinguiremos llamadas a funciones locales, externas o de biblioteca estándar.
Para la llamada a funciones locales (es decir, definidas en la misma biblioteca desde donde se realiza la llamada) solo hemos de poner el nombre de la función y los parámetros.
Ejemplo:
function f1() { // hace algo } function f2() { f1(); //llama a la función f1 }
Para la llamada a funciones externas (definidas en otra biblioteca), tendremos que dar un alias a la biblioteca externa y posteriormente usar la almohadilla (#) para llamar a la función.
Ejemplo:
use url mi_bib "bib.wmls"; function f1() { mi_bib#f2(); // Llama a f2() definida en bib.wmls }
Por último, Para la llamada a funciones de bibliotecas estándar usaremos el nombre de la biblioteca, un punto y el nombre de la función.
Ejemplo:
function f1() { Dialogs.alert( "Hola" ); // Llama a alert definida en Dialogs }
WMLScript - Parte II/IV
Al igual que Javascript, WMLScript toma su sintaxis de los lenguajes de programación más conocidos, fundamentalmente C, aunque también algo de Pascal.
- Se pueden añadir comentarios con; // y /* ... */
- Distingue entre mayúsculas y minúsculas
- Los nombres de las variables siguen el formato habitual de los lenguajes de programación: empieza por letra o por _, y sigue con más letras, o números o _
- No soporta objetos
- No soporta matrices
- Es obligatorio declarar las variables de la siguiente forma:
var nombreDeLaVariable=valor;
aunque la asignación de un valor inicial es opcional. Como se ve, no hay que decir el tipo de las variables.
- El ámbito de validez de una variable es únicamente la función en la que se ha declarado.
- Se pueden usar variables globales definiendo variables de entorno para la página WML. Estas variables de entorno pueden ser accedidas desde WMLScript mediante la biblioteca estándar WMLBrowser.
- El paso de parámetros a las funciones es SIEMPRE por valor; no existe paso por variable o referencia
- Se pueden usar cinco tipos de datos, que son: Integer, Float, String, Boolean, Invalid
- La función typeof devuelve un entero representando el tipo de dato que es:
0: Integer
1: Float
2: String
3: Boolean
4: Invalid
- A su vez, la función isvalid nos dice si la expresión que se le pasa como parámetro devuelve un valor válido o no. Por ejemplo:
isvalid( 1/0 )
devolvería false, dado que 1/0 no es un número válido.
2.2 Sentencias
La sintaxis de las sentencias es similar a Javascript.
Secuenciales
La asignación se realiza de la misma forma que en C, es decir:
variable=expresion
La sentencia de escritura debe ser simulada mediante la introducción de variables de ENTORNO en las cartas WML. Para cambiar el contenido de la pantalla del móvil crearemos desde WML una variable vacía y la escribiremos en pantalla. Luego se modificará desde una función WMLScript que tendrá en alguna parte de su código instrucciones como las siguientes:
... WMLBrowser.setVar( 'edad', '75' ); WMLBrowser.refresh(); ...
Es el WMLBrowser.refresh(); el que provoca que se reescriba la carta en la pantalla del móvil haciendo que se vea el valor de la variable deseada.
Por su parte, también la sentencia de lectura es simulada con etiquetas del tipo input, o mediante llamadas a la función Dialogs.prompt(), la cual permite pedir un dato al usuario e introducirlo en una variable.
Condicionales
WMLScript incorpora la sentencia condicional por excelencia de cualquier lenguaje: IF... THEN... ELSE..., aunque eso sí en formato de C.
if ( condicion ) { sentencias_true; } else { sentencias_false; }
Iterativas
En este caso también nos encontramos con las sentencias típicas de cualquier lenguaje, a saber:
while( condicion ) { sentencias; }
do { sentencias; } while ( condicion );
for( inicializacion; condición; incremento ) { sentencias; }
Incrementos y operaciones con variables
Como ocurre con C y otros lenguajes, existen formas rápidas de incrementar y decrementar las variables, así como de hacer asignaciones selectivas:
variable++; ++variable; variable--; --variable;
variable+=valor; variable-=valor; variable*=valor; variable/=valor;
variable=(condicion)?valor_true:valor_false;
Comentarios
Como cualquier lenguaje que se precie, WMLScript permite documentar nuestro código mediante la inclusión de comentarios:
Con // obtendremos comentarios hasta el final de la línea. Mientras que con /* .... */ obtendremos comentarios de varias líneas.
WMLScript - Parte I/IV
1.1 Qué es WMLScript |
1.2 Llamadas a funciones |
lunes, 8 de marzo de 2010
WAP - WML en Visual Basic .Net
No todo es rosas
¿Qué es WAP? (Wireless Application Protocol)
MIME TYPE | ||
Tipo de contenido | Mime Type | Extension |
Fichero WML | text/vnd.wap.wml | wml |
Bitmap | image/vnd.wap.wbmp | wbmp |
WML Compilado | application/vnd.wap.wmlc | wmlc |
Fichero WMLScript | text/vnd.wap.wmlscript | wmls |
WMLScript compilado | application/vnd.wap.wmlscriptc | wmlsc |
¿Qué es el WML?
Ahora si, manos a la obra
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-"//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="mycard" title="My first card">
<p>Hola Hemisferio Sur</p>
</card>
</wml>El resultado deberá mostrar la fecha del día que tenga seteada el PC.
<% Response.ContentType = "text/vnd.wap.wml" %>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-"//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="Principal" title="Principal">
<p>Hoy es: <%= day(Now()) & "/" & month(Now()) & year(Now()) %></p>
</card>
</wml>probaremos en un emulador WAP.
<% Response.ContentType = "text/vnd.wap.wml" %>
<% Response.Cookies ("ELUsuario")="Mickey" %>
<?xml version="1.0"?>
<!DOCTYPE wml PUBLIC "-"//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml">
<wml>
<card id="Principal" title="Principal">
<% DIM Name
Name=Request.Cookies ("ELUsuario") %>
<p> El usuario es: <%= Name %> </p>
</card>
</wml>probaremos en un emulador WAP.
Ahora si un ejemplo práctico en .NET
“ASP.NET Mobile Web Application” al que llamaremos “Guapeando”.
generado el proyecto lo renombramos a Bienvenida.aspx. Este archivo
contiene lo que se denomina una pagina móvil y básicamente consiste en un
Form. En el agregaremos un texto “Películas WAP” y un enlace “Enviar” a otro
Form al que llamaremos Resultado.aspx
<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="Bienvenida.aspx.vb" Inherits="Guapeando.MobileWebForm1" %>
<HEAD>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
<meta name="vs_targetSchema" content="http:"//schemas.microsoft.com/Mobile/Page">
</HEAD>
<body Xmlns:mobile="http:"//schemas.microsoft.com/Mobile/WebForm">
<mobile:Form id="Form1" runat="server" Font-Name="Arial Black" Font-Size=" Normal " Alignment="Center"><BR><BR>Peliculas WAP <BR><BR>
<mobile:Link id="Ingresar" Font-Size="Small" runat="server" NavigateUrl="Resultado.aspx">Entrar</mobile:Link><BR>
</mobile:Form>
</body>Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient
Public Class MobileWebForm1
Inherits System.Web.UI.MobileControls.MobilePage
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Protected WithEvents Ingresar As System.Web.UI.MobileControls.Link
Protected WithEvents List1 As System.Web.UI.MobileControls.List
Protected WithEvents Form1 As System.Web.UI.MobileControls.Form
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load
'Put user code to initialize the page here
End Sub
End Class<%@ Register TagPrefix="mobile" Namespace="System.Web.UI.MobileControls" Assembly="System.Web.Mobile" %>
<%@ Page Language="vb" AutoEventWireup="false" Codebehind="Resultado.aspx.vb" Inherits="Guapeando.Resultado" %>
<HEAD>
<meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
<meta name="CODE_LANGUAGE" content="Visual Basic .NET 7.1">
<meta name="vs_targetSchema" content="http:"//schemas.microsoft.com/Mobile/Page">
</HEAD>
<body Xmlns:mobile="http:"//schemas.microsoft.com/Mobile/WebForm">
<P>
<mobile:Form id="Form2" runat="server" Font-Size="Small">
<mobile:List id="List1" runat="server"></mobile:List></mobile:Form>
</P>
</body>Imports System.Data.OleDb
Public Class Resultado
Inherits System.Web.UI.MobileControls.MobilePage
#Region " Web Form Designer Generated Code "
'This call is required by the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
End Sub
Protected WithEvents List1 As System.Web.UI.MobileControls.List
Protected WithEvents Form2 As System.Web.UI.MobileControls.Form
Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Init
'CODEGEN: This method call is required by the Web Form Designer
'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase .Load
'Put user code to initialize the page here
Dim cn As OleDbConnection
Dim ds As Data.DataSet
Dim da As OleDbDataAdapter
Dim strConexion As String
Dim Ssql As String
strConexion = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\inetpub\wwwroot\guapeando\cines.mdb"
'Abrimos la conexión
cn = New OleDbConnection(strConexion)
cn.Open()
ds = New Data.DataSet
Ssql = "SELECT * FROM cartelera"
da = New OleDbDataAdapter(Ssql, cn)
Dim cmdBuilder As New OleDbCommandBuilder(da)
'Cargamos el DataSet
da.Fill(ds, "cartelera")
Dim fila As DataRow
List1.Items.Clear()
For Each fila In ds.Tables("cartelera").Rows
List1.Items.Add(fila("cine") & " - " & fila("film") & " - " & fila("hora"))
Next
End Sub
End Class¿Hacia donde vamos?
sábado, 12 de diciembre de 2009
Manual WML - Parte VI Final
relativas o absolutas
Puede ocurrir que el dispositivo WAP o el gateway no interprete correctamente una URL relativa. Para evitar esto ser recomienda usar la URL absoluta:
| NO | SÍ |
| <a href="../foo/bar.wml"> <a href="#myID"> | <a ref="http://my.server.com/foo/bar.wml"> <a href="http://my.server.com/foo/bar.wml#myID"> |
Nombre de variables
y ficheros
No olvides que los datos se envian y reciben a través del aire. La velocidad suele se de 9600. Intenta que se envien el menor volumen de datos posible.
Idea 1: Usa nombres de ficheros lo más cortos posibles. Ej: http:"//my.server.com/i.wml" mejor que http://my.server.com/index.wml
Idea 2: Usa nombres de variables lo más cortos posibles. Si usas menos de 25 variables lo mejor es que uses las letras del alfabeto.
Imágenes
Cuidado. No todos los dispositivos WAP aceptan imágenes. Utilízalas lo menos posible. Alguna SDK si las aceptan, pero... Y si las utilizas no te olvides nunca de poner el atributo alt <img src="imagen.gif" alt="Icono" />
Nombre de variables
y ficheros
¿Has intentado alguna vez escribir un password en un teléfono móvil? Es muy fácil en un PC o en un PDA, pero en un teléfono... Procura no usar el atributo type="password" en los input
¿Listas o Links
normales?
Hay dos formas de crear una lista de 2 links, con un select o con a. Recomendamos la segunda por lo que se explica abajo
| NO | SÍ |
| <select ivalue="0"> <option onpick="#Card2">Link 1</option> <option onpick="#Card3">Link 2</option> </select> | <p><a href="#Card2">Link 1</a></p> <p><a href="#Card3">Link 2</a></p> |
El problema es que como aparece seleccionado el primer link, no podemos accionarlo, y si bajamos al segundo, se inicializa el evento onpick y nos vamos a al Card3 | Link 1 Link 2 |
Newcontext="true"
&Iquest;Has visto en el código de alguna página <card id="card1" title="Currency" newcontext="true">? ¿ Lo has probado?
Si pones ese atributo, las variables se borran, incluso la history, por lo que no se puede usar el back. Para inicializar variables es mejor
<card title="Titulo">
<<onevent "onenterforward">
<refresh>
<setvar name="Var1" value="
"/>
<setvar name="some_var2" value="
"/>
</refresh>
</onevent>
...
</card>
Pasar datos a ASP o
CGI
Por ejemplo con un
input:
<input format="NN" name="Var1" title="Var1:"/>
<do
type="accept" label="Mandar:">
<go
href="http://*****/test.asp?datos=$(Var1)"/>
Detectar en el
servidor si se accede con un dispositivo WAP
Sorry, pero no lo he traducido...
XP
Sacado de http://www.egroups.com/group/wmlprogramming
I tried to redirect my browser clients using ASP and following your sample
code. For some reason the content type is text/html. I submit the code see if
any of you can see whats wrong. The redirect woks fine when I use the web
browser.
---------code-----------------------------------------------------
<%Response.ContentType = "text/vnd.wap.wml"%>
<% Dim uastring,
wmlURL, htmlURL
uastring = request.ServerVariables("HTTP_USER_AGENT")
wmlURL = "/martin/index.wml"
htmlURL = "some URL"
If
(InStr(uastring,"UP") Or InStr(uastring, "Nokia") Or InStr(uastring,
"Wap"))
Then
Response.Redirect wmlURL
else
Response.Redirect htmlURL
End If %>
-------End of code---------------------------------------
Marco
The only problem with this approach is when you encounter a phone that does
not support WMLScript, or your site gets hit by an HTML client. You're much
better off checking on the server end first. This is a trivial exercise in just
about any language, Perl, ASP, Java, etc...
In Perl 5
#!/usr/local/bin/perl5
$ua = $ENV{"HTTP_USER_AGENT"};
if ($ua =~ "UP"){ print "Status: 302 Moved
Temporarily\r Location: <one location>"; } elsif($ua =~ "Nokia"){ ...
You get the picture.
In asp, this construct would look like:
Dim uastring
uastring = request.ServerVariables("HTTP_USER_AGENT")
If
(InStr(uastring,"UP"))Then Response.Redirect(<onelocation>)
and in a Java Servlet it would look like this:
String ua = req.getHeader(HTTP_USER_AGENT);
if (ua.indexOf("UP")!= null){
res.setStatus(res.SC_MOVED_TEMPORARILY);
res.setHeader("Location",
<one location>);
Manual WML - Parte V
postfield
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| name | Nombre de la variable que va a enviar el usuario(Obligatorio) | Texto |
| value | Valor que toma la variable a enviar | Texto |
| Notas: Atención: Normalmente los datos deben ser enviados en formato escape al servidor, por lo que si los recibimos de un input debemops transformarlos(<postfield name="f" value="$(datos:e)"/> este tema se amplia en variables) Se utiliza dentro de una etiqueta go. Acaba siempre con una barra /. No todos los dispositivos WAP (Ej. Nokia 7110) aceptan el envio de datos | ||
| Ejemplo <go method="post" href="http://www.empresa.com/cgi/banco"> <postfield name="Dinero" value="10000"/> <postfield name="Num_Cta" value="12345"/> <postfield name="Operacion" value="Deposito"/> </go> | Explicación: Enviamos los campos Dinero=10000, Num_Cta=12345 y Operacion=Deposito al servidor | |
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| name | Nombre de la variable que va a inicializar(Obligatorio) | Texto |
| value | Valor que toma la variable | Texto |
| Notas: Se suele utilizar dentro de otras etiquetas. Acaba siempre con una barra / | ||
| Ejemplo <go href="#card2"> <setvar name="Anterior" value="Card1" /> </go> | ||
19- Las variables. Nombres y Usos
Sustitución de variables: A veces queremos que una valor o atributo sea sustituido por los datos que hay almacenados en una variable, y esto se consigue anteponiendo el signo dolar al nombre de la variable entre paréntesis.
Ej.
<input type="text" name="Nombre"/><postfield name="dato1" value="Nombre"/> Esto lo que hace es pasar al servidor el campo dato1 con el valor Nombre, no el nombre que introdujo el usuaior
<input type="text" name="Nombre"/><postfield name="dato1" value="$(Nombre)"/> Esto lo que hace es pasar al servidor el campo dato1 con el nombre que el usuario ha escrito en el input. (Cuidado aún tiene un pequeqo fallo que explicamos ahora).
Caracteres de escape: A veces los servidores necesitan obtener la información en formato de caracteres de escape(el típico
http:\\empresa.com\bancos?%24insertar%24%26true), o una información
obtenida en este formato pasarla a normal. Para ello usamos las transformaciones que implementa WML.
$(nombre_variable:e) --> Pasar a formato escape --> Si el valor de la variable es abc=? nos da
abc%3D%3F
$(nombre_variable:unesc) --> Pasar a formato unescape -->Si el valor de la variable es abc%3D%3F nos da abc=?
Manual WML - Parte IV
input
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| name | Nombre de la variable que va a tomar los datos que introduzca el usuario(Obligatorio) | Texto |
| value | Valor que aparece en el campo input por defecto. Debe cumplir las reglas de formato de este campo o si no será ignorado; También será ignorado si la variable ya tiene un valor previo | Texto |
| type | Forma en la que se introducen los datos | text Texto normal password Aparecen asteriscos en vez del texto tecleado. NO se recomienda, ya que para escribir con un telef. móvil es muy complicado |
| format | Formato en que se acepta la introducción de datos | El formato por defecto es *M, o sea cualquier caracter en mayúsculas. A= Cualquier caracter no numérico en mayúsculas a= Cualquier caracter no numérico en minúsculas N= Sólo números X= Cualquier caracter en mayúsculas x= Cualquier caracter en minúsculas \dato= Dato es un valor que queremos que aparezca tal cual |
| emptyok | En true si queremos que no sea obligatorio introducir este dato, ya que si tenemos un formato en un campo y no queremos cubrirlo, si lo dejamos en blanco puede no cumplir el formato, lo que nos da un error | True o false(Por defecto si el campo tiene formato) |
| size | Especifica el ancho en caracteres del input | Número |
| maxlenght | Especifica el número máximo de caracteres a introducir | Número |
| title | Título usado en la presentación del objeto | Texto |
| tabindex | Especifica el orden en que se accede a los distintos objetos dentro de una card. Por defecto de arriba a abajo | Número |
| Notas: Siempre se acaba la etiqueta con una barra / | ||
| Ejemplo <input type="text" name="ape1" format="A" maxlength="25" emptyok=true /> Acepta 25 letras en mayúsculas y las almacena en la variable ape1. No es un campo obligatorio(emptyok=true) <input type="text" name="fecha" format="NN\-NN\-19NN" maxlength="10"/> Acepta solamente números y ya pone el los quiones y el 19, almacenando esto en la variable fecha. Es un campo obligatorio | ||
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| name | Nombre de la variable que va a tomar los datos que introduzca el usuario(Obligatorio) | Texto |
| value | Valor que tiene la variable por defecto. | Texto |
| multiple | Posibilidad de seleccionar más de una opción. Si es así el valor de la variable será ambos valores separados po ; | True ó False(por defecto) |
| ivalue | Deternima el index de la opción que queremos que esté seleccionada por defecto. El primer item es 0, el segundo 1.... | Número |
| title | Título usado en la presentación del objeto | Texto |
| Notas: Siempre utilizaremos la opción ivalue=0, o al menu que queremos que sea seleccionado por defecto. Siempre se acaba con la etiqueta </select>. Dentro de esta etiqueta deben ir <option> o <optgroup> | ||
| Ejemplo: Se ven en las siguientes etiquetas | ||
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| value | Valor que toma la variable al seleccionar este item | Texto |
| title | Título usado en la presentación del objeto | Texto |
| onpick= | Evento que ocurre al seleccionar o deseleccionar un item | Href. URL o dirección de otra card |
| Notas: Siempre se acaba con la etiqueta </option>. Debe estar dentro de la etiqueta <select> | ||
| Ejemplo: <select name="mascota" value="N" ivalue=1> <option value="N">Ninguno</option> <option value="P">Perro<</option> <option value="G">Gato<</option> </select> | Explicación: Tenemos 3 opciones, y por defecto Ninguno seleccionada(ivalue=1). Sólo podemos elegir 1 de ellas. Si elegimos Perro, la variable mascota es P, gato es G y si no elegimos nada N(value="N"). | |
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| title | Título usado en la presentación del objeto | Texto |
| Notas: Siempre se acaba con la etiqueta </optgroup>. Esta etiqueta es usada para aglurinar a varias option | ||
| Ejemplo: <select name="Pais"> <optgroup title="América"> <option value="USA">USA</option> <option value="Mex">México</option> </optgroup> <optgroup title="Europa"> <option value="Esp">Espaqa</option> <option value="Fra">Francia</option> </optgroup> </select> | Explicación: Tenemos 2 opciones dentro de cada subgrupo. Sólo podemos elegir 1 de ellas. Primero seleccionamos el continente, y dependiendo del seleccionado, nos salen las siguientes opciones, y allí elegimos el valor que asignaremos a la variable Pais | |
Manual WML - Parte III
a
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| title | El texto que sale al entrar en las opciones | Texto |
| href | Dirección a la que accederemos | Href. URL u otra card |
| Notas: Se cierra con </a> | ||
| Ejemplo <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card id="links" title="Links"> <p> Este es un texto normal, pero aquí hay un <a title="LINK" href="#card2">link! </a> </p> </card> <card id="card2" title="Segunda Card"> <p align="center"> <br/> Estamos en la <br/> Card2 </p> </card> </wml> Explicación: Aparece en la pantalla: Este es un texto normal, pero aquí hay un link! y en la barra de navegación del browser aparece options. Al acceder a options nos aparece la lista de links activos(en este caso solamente uno). | ||
timer
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| id | Identificador del objeto. Usado para referirse a ella | Texto |
| value | Tiempo que debe pasar para que se inicialize el evento. Se expresa en décimas de segundo | Número |
| Notas: Si se utiliza una etiqueta timer, siempre hay que definir en la card el valor ontimer, bién sea a otra card ontimer="#card2" u a otra URL ontimer="http://otraempresa.com/pub/inicio.wml" | ||
| Ejemplo <?xml version="1.0"?> <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <card id="card1" ontimer="#card2" title="Demostrando un timer"> <timer value="35"/> <p align="center"> <br/> <big> Bienvenidos a ... </big> </p> </card> <card id="card2" ontimer="#card3" title="Demostrando un timer"> <timer value="50"/> <p align="center"> <br/> <b> WAP facil<br/></b> <u> Wireless Application Protocol </u> ... </p> </card> <card id="card3" title="Demostrando un timer"> <p align="center"> <br/> <big><i> El mejor curso! </i></big> </p> </card> </wml> Explicación: Lo primero que vemos es una pantalla con un texto que dice Bienvenidos a ... y al cumplirse el timer <timer value="35"/>, pasa a la siguiente y al cumplirse el timer de esta se pasa a la última. | ||
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| src | Lugar donde se encuentra la imagen | Href. Por ahora solamente se aceptan ficheros .wbmp, pero en un futuro se aceptarán GIF y JPG(El Nokia WAP Toolkit 1.2 acepta GIF y JPG) . Descárgate el conversor de ficheros PULSANDO AQUÍ |
| alt | Texto alternativo. Se recomienda usarlo siempre | Texto |
| vspace y hspace | Espacio en blanco entre la imagen y el resto de contenidos. Si es expresado en porcentaje, representa el espacio total de visión del browser, no las medidas de la imagen | Número o porcentaje |
| align | Alineación del texto con respecto a la imagen | top, middle o bottom |
| height y width | Alto y ancho de la imagen(por este orden) | Número |
| id | Identificador del objeto. Usado para referirse a ella | Texto |
| Notas: Siempre se debe utilizar la propiedad alt, ya que al estar WML aún en desarrollo, nunca sabemos si el navegador que se está usando acepta imágenes. Esta etiqueta siempre acaba con una barra / | ||
| Ejemplo <img src="./images/ojo.wbmp" alt="ojo" align="middle" /> | ||
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar | |||||||
| title | Título de este elemento. | Texto | |||||||
| colums | Número de columnas que van a ser representadas. Se recomienda usarlo siempre. El valor 0 es un error en WML | Número | |||||||
| align | Alineación del texto dentro de su celda | L= Izquierda C= Centro R= Derecha | |||||||
| id | Identificador del objeto. Usado para referirse a el | Texto | |||||||
| <tr> | Definición de salto de línea. Se cierra con </tr> | Ninguno | |||||||
| <td> | Definición de salto de columna. Se cierra con </td> | Ninguno | |||||||
| <table columns=2> <tr> <td>Pais</td><td>l/m2</td> </tr> <tr> <td>Suiza</td><td>1,3</td> </tr> <tr> <td>Francia</td><td>2,5</td> </tr> </table> |
| ||||||||
Manual WML - Parte II
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| id | Nombre de la etiqueta. Usado para referirse a ella | Texto |
| domain | Dominio de acceso | Href |
| path | Dirección de acceso | Href |
| Notas: Atención Esta etiqueta debe ir dentro de la etiqueta <head> AQUI </head>. Si no se aplica la etiqueta access el acceso es libre. | ||
| Ej. <access domain="miempresa.com" path="/pub"> Se accede a: miempresa.com/pub/stock.asp , miempresa.com/pub/demos/ventas.cgi No se accede a: miempresa.com/cgi-bin/ , otraempresa.com/index.wml | ||
do
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| name | Nombre del objeto. Usado para referirse a ella | Texto |
| label | Texto que aparece al pulsar el botón options en el navegador para iniciar el evento | Texto |
| type | Define el tipo de evento que se va a realizar | accept Aceptar prev Ir atrás reset Resetea el estado actual options Operaciones opcionales delete Borra un objeto o selección |
| Notas: Las etiquetas que pueden ir dentro de un do son <go href="...."/>, <prev/>, <noop/>, <refresh/>. Si una etiqueta do tiene el mismo name que otra definida en la template se usa la de esta card. | ||
| Ejemplo Si quieres ver este ejemplo en acción con fotografías del teléfono móvil PULSA AQUI y se abrirá otra ventana | ||
Los atributos de esta etiqueta son:
| Etiqueta | Explicación | Valores que puede tomar |
| href | Dirección a la que se quiere ir | Href. Url o nombre de otra card |
| method | Utilizado para enviar datos al servidor. Se amplia con el tema postfield | post o get |
| Notas: esta etiqueta siempre acaba con una barra <go href="..."/> | ||
| Ejemplo Si quieres ver este ejemplo en acción con fotografías del teléfono móvil PULSA AQUI y se abrirá otra ventana | ||
Estas etiquetas no tienen atributos
| Etiqueta | Explicación | Ejemplo |
| <prev/> | Ir a la página anterior | <do type="accept" label="Oprima select"><go href="#card2"/></do> |
| <noop/> | Ninguna operación | <do type="accept" label="Oprima select"><noop/></do> |
| <refresh/> | Resetea los valores | <do type="accept" label="Oprima select"><refresh/></do> |
| Notas: estas etiquetas siempre acaban con una barra / | ||