Manual de eBDML Versión 3.5 Autor: Carlos Juan Última Revisión: 01/02/2010 1. Introducción 1.1. ¿Que es eBDML? 7 1.2. Usos de eBDML 8 2. Variables en eBDML 2.1. Tipos de variables 11 2.2. Estructuras de datos. ARRAY vs HASH 12 3. Instrucciones eBDML 3.1. Declaración de Variables 13 3.1.1. eBD:STRICT 13 3.1.2. eBD:VAR 13 3.1.3. eBD:SET 13 3.1.4. eBD:OUT 14 3.1.5. eBD:ARGS 14 3.1.6. eBD:SYNCHRONIZE 14 3.2. Tipos complejos de datos 16 3.2.1. eBD:PUSH 16 3.2.2. eBD:POP 16 3.2.3. eBD:SHIFT 16 3.2.4. eBD:UNSHIFT 16 3.2.5. eBD:SORT 17 3.2.6. eBD:INDEXOF 17 3.2.7. eBD:KEYS 18 3.2.8. eBD:JOIN 18 3.2.9. eBD:SPLIT 18 3.3. Enlaces y encriptación 19 3.3.1. eBD:ENCRYPT 19 3.3.2. eBD:LINKTO 19 3.3.3. eBD:DECRYPT 20 3.3.4. eBD:REDIRECT 20 Manual de eBDML 2 3.4. Acceso a Base de Datos 21 3.4.1. eBD:QUERY 21 3.4.2. eBD:FETCHROW 21 3.4.3. eBD:INSERT 21 3.4.4. eBD:UPDATE 22 3.4.5. eBD:DELETE 22 3.4.6. eBD:QUOTE 22 3.4.7. eBD:EXECDATASOURCE 23 3.4.8. eBD:XQUERY 23 3.4.9. eBD:TRANSACTION 24 3.4.10. eBD:COMMIT 24 3.4.11. eBD:ROLLBACK 25 3.5. Control de Flujo 26 3.5.1. eBD:RETURN 26 3.5.2. eBD:BREAK 26 3.5.3. eBD:FOREACH 26 3.5.4. eBD:IF 27 3.5.5. eBD:WHILE 27 3.5.6. eBD:USE 28 3.5.7. eBD:CALL 28 3.5.8. eBD:FORK 28 3.5.9. eBD:CACHE 29 3.5.10. eBD:CLEARCACHE 29 3.5.11. eBD:INCLUDE 29 3.6. Integración y Comunicación 31 3.6.1. eBD:SENDMAIL 31 3.6.2. eBD:SENDSMS 31 3.6.3. eBD:BODY 32 3.6.4. eBD:ATTACH 32 3.6.5. eBD:HTTPGET 32 Manual de eBDML 3 3.6.6. eBD:HTTPPOST 33 3.6.7. eBD:WS 33 3.6.8. eBD:XMLPARSE 34 3.6.9. eBD:EXECPROCESS 34 3.6.10. eBD:EXECTASK 35 3.6.11. eBD:FTPCLOSE 35 3.6.12. eBD:FTPCWD 35 3.6.13. eBD:FTPDELETE 35 3.6.14. eBD:FTPGET 36 3.6.15. eBD:FTPLOGIN 36 3.6.16. eBD:FTPLS 36 3.6.17. eBD:FTPMKDIR 37 3.6.18. eBD:FTPPUT 38 3.6.19. eBD:FTPPWD 38 3.6.20. eBD:FTPRENAME 38 3.6.21. eBD:FTPRMDIR 38 3.6.22. eBD:FTPSIZE 39 3.7. Manipulación de datos 40 3.7.1. eBD:REPLACE 40 3.7.2. eBD:LENGTH 40 3.7.3. eBD:UNICODE 40 3.7.4. eBD:HTMLENCODE 41 3.7.5. eBD:HTMLDECODE 41 3.7.6. eBD:ENCODE 41 3.7.7. eBD:DECODE 42 3.7.8. eBD:URIESCAPE 42 3.7.9. eBD:URIUNESCAPE 42 3.7.10. eBD:SERIALIZE 43 3.7.11. eBD:DESERIALIZE 43 3.8. Manipulación de ficheros Manual de eBDML 44 4 3.8.1. eBD:TMPFILE 44 3.8.2. eBD:READ 44 3.8.3. eBD:READLINE 45 3.8.4. eBD:WRITE 45 3.8.5. eBD:SEEK 45 3.8.6. eBD:XSLTPROC 45 3.8.7. eBD:EXTRACT 46 3.9. Manipulación de Imágenes 47 3.9.1. eBD:IMGCREATE 47 3.9.2. eBD:IMGINFO 47 3.9.3. eBD:IMGCOLOR 47 3.9.4. eBD:IMGDRAW 48 3.9.5. eBD:IMGTRANSFORM 49 3.9.6. eBD:IMGCOPY 50 3.9.7. eBD:IMGFILTER 50 3.9.8. eBD:IMGGRAPH 51 3.9.9. eBD:IMGSAVE 54 3.10. Acceso a buzones IMAP 55 3.10.1. eBD:IMAP 55 3.10.2. eBD:IMAP_COPY 55 3.10.3. eBD:IMAP_CREATE 55 3.10.4. eBD:IMAP_DELETE 55 3.10.5. eBD:IMAP_GET 56 3.10.6. eBD:IMAP_MAILBOXES 56 3.10.7. eBD:IMAP_RENAME 57 3.10.8. eBD:IMAP_LOGOUT 57 3.10.9. eBD:IMAP_FLAGS 57 3.10.10. eBD:IMAP_STATUS 58 3.11. Varios 3.11.1. eBD:LOGIN Manual de eBDML 59 59 5 3.11.2. eBD:FORCELOGIN 59 3.11.3. eBD:LOGOUT 59 3.11.4. eBD:INFOUSER 59 3.11.5. eBD:INFOFILE 60 3.11.6. eBD:FILEPATH 61 3.11.7. eBD:DAVPATH 61 3.11.8. eBD:WARN 61 3.11.9. eBD:BR 62 3.11.10. eBD:EVAL 62 3.11.11. eBD:CODE 62 3.11.12. eBD:DOC 63 4. Consideraciones Generales 4.1. Tipos de variables 64 4.2. Expresiones 66 4.3. Referencias y estructuras de datos 68 4.4. Varios 70 5. Ejemplo 5.1. Resumen de un pedido 72 Anexos. Anexo A. Funciones Internas (#) 74 Anexo B. Funciones para Ajax (eBDSection) 84 Manual de eBDML 6 1. INTRODUCCIÓN 1. Introducción 1.1. ¿Que es eBDML? eBDML es el lenguaje de programación propio de eBD, que permite la programación de código ejecutable en el servidor. Con eBDML se puede modificar el comportamiento de las páginas, definir cabeceras personalizadas, crear plantillas y funciones genéricas, programar eventos de la base de datos, webservices, etc... eBDML está basado en XML, de forma que sus instrucciones están formadas por tags (delimitadas con caracteres < y >). Todas las instrucciones de eBDML empiezan por "eBD:" y tanto el nombre como los atributos son case-insensitive, por lo que <eBD:SET VAR="a" value="1"/> es exactamente lo mismo que <ebd:set var="a" vAlue="1"/>. eBDML incorpora instrucciones propias de un lenguaje de programación de alto nivel, entre las cuales destacan: • Control de flujo como <eBD:IF>, <eBD:WHILE>, <eBD:FOREACH>, etc... • Acceso a variables locales, globales y temporales, como <eBD:VAR> o <eBD:SET> • Tipos de datos complejos, como ARRAY o HASH • Acceso a base de datos, con <eBD:QUERY>, <eBD:INSERT>, etc... • Definicion de funciones propias, y invocación con <eBD:CALL> • Ejecución de webservices con <eBD:WS> • Envio de email y sms, con <eBD:SENDMAIL> y <eBD:SENDSMS> • Cacheado de codigo intermedio, con <eBD:CACHE> Manual de eBDML 7 1. INTRODUCCIÓN 1.2. Usos de eBDML Secciones eBDML Las secciones de tipo eBDML dan al programador total libertad para crear funcionalidades especiales en las páginas o zonas de eBD, que puede incluir consultas a la base de datos, recepción de datos de un formulario, llamadas a webservices, y otros tipos de integración. Generalmente se intercala el código eBDML con código HTML o Javascript, para generar la sección deseada de forma dinámica. Además tambien se puede incluir ficheros adicionales como imágenes, hojas de estilo CSS, ficheros de código JavaScript, etc. El acceso a los ficheros adicionales desde el código HTML generado se debe hacer de forma directa, es decir, sin añadirle ningun path delante del nombre del fichero (como si el codigo html estuviera en el mismo directorio que el fichero adicional). Por ejemplo, en el caso anterior, si queremos incluir la imagen "test.jpg" desde el codigo HTML generado con eBDML, simplemente debemos usar el tag IMG de la siguiente forma: <img src="test.jpg"> Plantillas de Menú Podemos utilizar eBDML para dar formato a los menús, usando las plantillas de menú. Las plantillas son recursos globales de manera que pueden ser usadas en cualquier sección de tipo Menú. Manual de eBDML 8 1. INTRODUCCIÓN Paginación Personalizada Podemos utilizar eBDML para personalizar todo cuanto queramos en la paginación de una sección de tipo Tabla. Para más información sobre las paginaciones usando eBDML, véase el Tutorial "Paginaciones". Plantillas de Seccion Utilizamos eBDML para personalizar el formato de un registro en una sección de tipo Tabla. Cabecera y Pie de Zona Podemos usar eBDML para personalizar la cabecera y el pie de las zonas, modificando el código HTML inicial como el "head" o los "meta". Manual de eBDML 9 1. INTRODUCCIÓN Diseños de Pagina, Zona y Sección Grupo Los diseños de las Paginas, las Zonas y las Secciones de tipo Grupo se pueden personalizar, usando eBDML para generar la estructura de la pagina dinámicamente. Se usa la instrucción <eBD:INCLUDE> para hacer las llamadas a las secciones correspondientes. Otros objetos avanzados En el desarrollo de otros tipo de objetos de servidor mas avanzados, como los WebServices, Widgets, funciones de validacion en carpetas WebDAV, etc... también se usa eBDML para programar el comportamiento deseado de cada uno de ellos. Manual de eBDML 10 2. VARIABLES EN EBDML 2. Variables en eBDML 2.1. Tipos de variables En eBD se pueden distinguir tres tipos de variables, según su ámbito de ejecución: Variables Locales Variables que se definen dentro de un código eBDML (ya sea una sección, o una función, plantilla, etc...) y sólo se pueden usar dentro del mismo código. Al finalizar la ejecución la variable deja de existir. Variables Temporales Variables que se pueden definir en cualquier momento de la ejecución de una página (generalmente en un código eBDML) pero que mantienen su valor durante toda la ejecución de la request. Es decir, se puede definir una variable temporal en una sección, y usarla posteriormente en otra sección de la misma página, en eventos, en el pie de zona, etc... Al finalizar la ejecución de la request la variable deja de existir. Se suelen utilizar para pasar información de una sección a otra, sin mantenerla en la sesión del usuario. Variables Globales Variables que se pueden definir en cualquier momento de la ejecución de una página (generalmente en un código eBDML) pero que mantienen su valor durante toda la sesión del usuario. Una vez se ha definido la variable, ésta se mantiene hasta que la sesión del usuario expira. Manual de eBDML 11 2. VARIABLES EN EBDML 2.2. Estructuras de datos. ARRAY vs HASH Las variables de eBDML pueden almacenar cualquier información (textos, numeros, fechas, etc...), ya que no se especifica su tipo de datos al declararlas. Adicionalmente, se pueden crear estructuras de datos usando tipos abstractos de datos, como ARRAY o HASH. Los dos tipos de variables sirven para contener una lista de datos pero de forma diferente. Un ARRAY es una lista de datos ordenados, que tiene esta forma: (valor1, valor2, valor3,…, valorN) Se puede recorrer un array usando la instrucción eBD: FOREACH; se creará automáticamente la variable $iterator que nos devuelve el valor actual del vector. También podemos cambiarle el nombre a esta variable (ver FOREACH). Un Hash es una lista de pares clave-valor, tiene esta forma: (clave1 => valor1, clave2 => valor2, clave3 => valor3,…, claveN => valorN) Es muy útil en el caso de que queramos guardar los datos objeto estructurado. Por ejemplo, los datos de una persona serian (Nombre => Juan, Apellido => García, TF => 941256489, etc.). La única forma de acceder a los valores de un hash es usando la clave de cada uno de los campos. En caso de no conocer los valores de las claves, se puede usar la funcion KEYS que devuelve un array con las claves del HASH. Ejemplo: <eBD:KEYS HASH="objeto" ARRAY="claves"/> <eBD:FOREACH ARRAY="claves" ITERATOR="k"> ... <eBD:SET VAR="valor" VALUE="@objeto{$k}"/> ... </eBD:FOREACH> O mas sencillo todavia: <eBD:FOREACH KEYS="objeto" ITERATOR="k"> ... <eBD:SET VAR="valor" VALUE="@objeto{$k}"/> ... </eBD:FOREACH> Manual de eBDML 12 3. INSTRUCCIONES EBDML 3. Instrucciones eBDML 3.1. Declaración de Variables 3.1.1. eBD:STRICT Sintaxis: <eBD:STRICT/> Acción: Activa la declaración obligatoria de variables. 3.1.2. eBD:VAR Sintaxis: <eBD:VAR NAME="nombre" [DEFAULT="valor"] [ TYPE="ARRAY | HASH" ] /> Acción: Declara una variable con o sin valor por defecto. Las variables ARRAY o HASH no pueden tener el mismo nombre que una variable escalar. Ejemplo: <eBD:VAR NAME="test" DEFAULT="0"/> <eBD:VAR NAME="lista" TYPE="ARRAY"/> 3.1.3. eBD:SET Sintaxis: <eBD:SET ( VAR="nombre" | GLOBAL="nombre" | TEMPORAL="nombre" ) [INDEX="indice"] ( VALUE="valor" | EXPR="expresión" | QUERY="queryname" | ROW="rowname" ) /> Acción: Asigna un valor a una variable (si es una variable global se usa GLOBAL, si es temporal TEMPORAL y sino VAR). El atributo INDEX indica la posición en el caso que la variable sea un tipo complejo (ARRAY o HASH). Si la expresión es un cálculo matemático debe usarse EXPR. Si se usa QUERY o ROW, se estara asignando un objeto de tipo Query (resultado de un eBD:QUERY) o ROW (resultado de un FETCHROW) a una variable de tipo ARRAY o HASH respectivamente. Ejemplo: <eBD:SET <eBD:SET <eBD:SET <eBD:SET <eBD:SET <eBD:SET Manual de eBDML VAR="test" VALUE="444"/> VAR="test" EXPR="$test+20/4"/> VAR="lista" INDEX="0" VALUE="testlista"/> VAR="lista_hash" INDEX="nombre" VALUE="pepito"/> TEMPORAL="request" VALUE="solo para request"/> GLOBAL="IDOBJETO" VALUE="256"/> 13 3. INSTRUCCIONES EBDML 3.1.4. eBD:OUT Sintaxis: <eBD:OUT (VALUE="valor" | EXPR="expresión" )/> Acción: Escribe en el buffer de salida el valor especificado. Ejemplo: <eBD:OUT <eBD:OUT <eBD:OUT <eBD:OUT <eBD:OUT VALUE="$test"/> VALUE="@lista[0]"/> VALUE="@lista{nombre}"/> VALUE="%IDOBJETO"/> VALUE="%$request"/> //VARIABLE ESCALAR //VARIABLE ARRAY //VARIABLE HASH //VARIABLE GLOBAL //VARIABLE TEMPORAL 3.1.5. eBD:ARGS Sintaxis: <eBD:ARGS NAME="nombre" [VAR="nombre"] [DEFAULT="valor"] [TYPE="string|bool|date|datetime|enum|integer|word" NOTNULL="1" VALIDS="ARRAYREF|values" DATEMASK="maskdate" OPTIONALMASK="timemask" BIGGERTHAN="date" LOWERTHAN="date"]/> Acción: 'Declara' una variable que espera recibir y le asigna un valor por defecto. Si el atributo VAR está definido, en vez de crear la variable con el nombre del parámetro, la crea con el nombre que le pongamos en el atributo VAR. Se puede definir el tipo de argumento esperado, así como mascaras de fechas para validar el dato recibido. Si el tipo es 'enum' el argumento 'VALIDS' podrá ser: ARRAYREF|val1,val2,val3.... Ejemplo: <eBD:ARGS NAME="idnoticia" DEFAULT="1"/> 3.1.6. eBD:SYNCHRONIZE Sintaxis: <eBD:SYNCHRONIZE GLOBALS="variable_global" [TIMEOUT="segundos"]> Acción: Permite sincronizar el acceso a las variables globales de la sesión entre varias requests concurrentes. Esto permite bloquear las otras requests concurrentes (que esten ejecutando la misma sesión), y sincronizar la lectura y escritura de las variables globales para evitar que se pierdan los cambios realizados. Esta situación, aunque poco común, se puede dar en aplicaciones que hagan un uso intensivo de peticiones ajax, por lo que conviene sincronizar el acceso de lectura y escritura a las variables de sesión que sean utilizadas por varias requests concurrentes. Se pueden añadir varias variables globales, separándolas por comas. La opción TIMEOUT es opcional, si no se especifica su valor será de 5 segundos. Manual de eBDML 14 3. INSTRUCCIONES EBDML Ejemplo: <eBD:SYNCHRONIZE GLOBALS="counter,data" TIMEOUT="10"> <eBD:DOC> This session is locked for 10 seconds and %counter and %data are synchronized with other concurrent requests </eBD:DOC> <eBD:SET GLOBAL="counter" EXPR="%counter+1"/> <eBD:SET GLOBAL="data" VALUE="my_data_value"/> <eBD:SYNCHRONIZE> Manual de eBDML 15 3. INSTRUCCIONES EBDML 3.2. Tipos complejos de datos 3.2.1. eBD:PUSH Sintaxis: <eBD:PUSH ARRAY="nombre" ( VALUE="valor" | EXPR="expresión" )/> Acción: Añade un valor (o una expresión) al final de un array. Ejemplo: <eBD:PUSH ARRAY="lista" VALUE="uno mas!"/> 3.2.2. eBD:POP Sintaxis: <eBD:POP ARRAY="nombre" [VAR="nombre"] /> Acción: Extrae el último valor de un array y lo guarda en una variable (si se le indica con VAR). Ejemplo: <eBD:POP ARRAY="lista" VAR="nextdato"/> 3.2.3. eBD:SHIFT Sintaxis: <eBD:SHIFT ARRAY="nombre" VAR="nombre" /> Acción: Extrae el primer valor de un array y lo guarda en una variable (VAR). Ejemplo: <eBD:SHIFT ARRAY="lista" VAR="nextdato"/> 3.2.4. eBD:UNSHIFT Sintaxis: <eBD:UNSHIFT ARRAY="nombre" ( VALUE="valor" | EXPR="expresión") /> Acción: Añade un valor (o una expresión) al principio de un array. Ejemplo: <eBD:UNSHIFT ARRAY="lista" VALUE="nuevo dato"/> Manual de eBDML 16 3. INSTRUCCIONES EBDML 3.2.5. eBD:SORT Sintaxis: <eBD:SORT ARRAY="nombre" [CMP="string"]/> Acción: Reordena alfabéticamente un array. Los métodos de ordenación pueden ser: $a $b $a $a cmp cmp <=> cmp $b: $a: $b: $b: ordena ordena ordena ordena alfabéticamente inversamente números de menor a mayor números de mayor a menor Ejemplo: comparacion alfabética, ascendente: <eBD:SORT ARRAY="lista" CMP="$a cmp $b"/> comparación numérica, descendente: <eBD:SORT ARRAY="lista" CMP="$b <=> $a"/> comparación alfabetica por el campo "nombre", en una lista de hashes: <eBD:SORT ARRAY="lista" CMP="$a->{nombre} cmp $b->{nombre}"/> 3.2.6. eBD:INDEXOF Sintaxis: <eBD:INDEXOF ARRAY="varname" VALUE="value" VAR="varname"/> Acción: Obtiene la posicion del valor "value" dentro del array "varname". Si el elemento no se encuentra en el array, devuelve undef. Ejemplo: <ebd:indexof array="lista" value="uno" var="i"/> <ebd:if expr="#[eBDUtil.defined($i)]"> el elemento si que esta y la posicion en el array es <ebd:out value="$i"/> </ebd:if> Manual de eBDML 17 3. INSTRUCCIONES EBDML 3.2.7. eBD:KEYS Sintaxis: <eBD:KEYS HASH="nombre" ARRAY="nombre" /> Acción: Extrae la lista de claves de un hash y las guarda en el array. Ejemplo: <eBD:KEYS HASH="datos" ARRAY="claves"/> 3.2.8. eBD:JOIN Sintaxis: <eBD:JOIN ( ARRAY="nombre" | HASH="nombre" | ARRAY1="nombre1" ARRAY2="nombre2") VAR="nombre" [CHAR="valor"] /> Acción: Concatena todos los valores del ARRAY (o los pares clave/valor del HASH), intercalando el carácter CHAR entre ellos, y lo guarda en la variable VAR. En el caso de usar los parámetros ARRAY1 y ARRAY2, devuelve un array con la union de todos los elementos de los 2 arrays. Ejemplo: <eBD:JOIN ARRAY="claves" VAR="result" CHAR=","/> 3.2.9. eBD:SPLIT Sintaxis: <eBD:SPLIT VALUE="valor" (ARRAY="nombre" | HASH="nombre") CHAR="valor" [LIMIT="n"] /> Acción: Divide el valor en trozos separados por el carácter CHAR, y lo guarda en el ARRAY o el HASH. Si se usa HASH, los trozos generados se agruparán por parejas clave/valor. Si se define LIMIT="n", sólo se dividirá n veces. Ejemplo: <eBD:SPLIT ARRAY="claves" VALUE="result" CHAR=","/> Manual de eBDML 18 3. INSTRUCCIONES EBDML 3.3. Enlaces y encriptación 3.3.1. eBD:ENCRYPT Sintaxis: <eBD:ENCRYPT [VAR="varname"] VALUE="value" [NOT_URL="1" (KEY="key"|SALT="pwd_salt"|DIGEST="digest")] /> Acción: En versiones anteriores a 3.2, se usaba principalmente para encriptar enlaces a páginas de eBD. A partir de dicha versión, el uso de la instrucción eBD:ENCRYPT para encriptar URLs está DESACONSEJADO. Es preferible usar eBD:LINKTO. También podemos utilizar eBD:ENCRYPT para encriptar valores usando una clave simetrica (KEY), o para crear un digest de los datos. Los digest válidos son: MD5, MD5_HEX, MD5_BASE64, SHA1, SHA1_HEX, SHA1_BASE64. Si existe la variable guarda el resultado en ella, sino lo imprime. El parámetro KEY es opcional, y especifica la semilla que se utilizará para encriptar el valor; debe tener una longitud mínima de 8 carácteres. En caso de que no se le pase ningún valor, utilizará la misma semilla que se utiliza para encriptar las URL de la sesión. Otra funcionalidad de eBD:ENCRYPT es la de encriptar textos con el mismo algoritmo de encriptación que se usa para codificar los campos de tipo "Contraseña". Para ello se usa el parámetro SALT, cuyo valor debe ser la semilla (string de 2 carácteres) con la que se quiere encriptar el valor. El resultado encriptado contiene la propia semilla al principio, con lo que para comparar si un password es válido se debe encriptar el password plano usando como semilla la versión encriptada Ejemplo: <eBD:ENCRYPT VAR="encripted" VALUE="string a encriptar" NOT_URL="1" DIGEST="MD5"/> <eBD:ENCRYPT VAR="encripted" VALUE="string a encriptar" NOT_URL="1" KEY="$clave"/> encripta un password <eBD:ENCRYPT VAR="codedpwd" VALUE="$password" NOT_URL="1" SALT="$salt"/> comprueba un password existente <eBD:ENCRYPT VAR="check" VALUE="$password" NOT_URL="1" SALT="$codedpwd"/> <eBD:IF EXPR="$check == $codedpwd"> el password es correcto! </eBD:IF> 3.3.2. eBD:LINKTO Sintaxis: <eBD:LINKTO [PAGE="page name" | PAGEID="id page"] [ZONE="zone name" | ZONEID="id page"] (VAR="varname" | GLOBAL="varname" | TEMP="varname") [FRIENDLY_URL="string"] [SECURITY="USER|NONE"] (ARGS="var=value&var=value...")/> Acción: Sirve para encriptar los enlaces de eBD, si omitimos el parámetro VAR GLOBAL I TEMP lo añadirá al buffer html de salida. El parámetro FRIENDLY_URL permite modificar el texto que generan los enlaces si esta activada la opción de "URLs Amigables". Si el valor de este parámetro empieza por /, se usara unicamente este string como path en la URL. Si no es así, se concatenara este string al path generado automaticamente por eBD. Manual de eBDML 19 3. INSTRUCCIONES EBDML El parámetro SECURITY permite definir el nivel de seguridad de la URL generada. Si no se especifica ninguno se usará el nivel definido en la zona actual. Los posibles valores son: - USER: Se encriptará la URL usando la clave propia del usuario (recomendado). - NONE: Se usará la clave del usuario anónimo, con lo que la url será visible por cualquier usuario. Ejemplo: <eBD:LINKTO PAGE="home" ZONE="principal" ARGS="param1=44&param2=333"/> 3.3.3. eBD:DECRYPT Sintaxis: <eBD:DECRYPT [VAR="varname"] VALUE="value" [KEY="key"]/> Acción: Esta instrucción permite desencriptar un valor encriptado con una clave simértica. Si se especifica un nombre de variable dejará en ella el resultado, en caso contrario se imprimirá el valor desencriptado en el HTML. El Parámetro KEY es opcional, y especifica la semilla utilizada cuando se encriptó el valor, debe tener una longitud mínima de 8 carácteres. En caso de que no se le pase ningún valor, utilizará la misma semilla que se utiliza para encriptar las URL de la sesión. Ejemplo: <eBD:DECRYPT VAR="texto_ori" VALUE="$encripted" /> 3.3.4. eBD:REDIRECT Sintaxis: <eBD:REDIRECT TO="pagename|pageid" [argname="value"]/> Acción: Instrucción que al ejecutarse nos redireccionará a la página llamada "pagename" o a aquella cuyo id sea "pageid". Los demás parámetros son enviados como tal. Ejemplo: <eBD:REDIRECT TO="home" param1="44" idnot="15"/> Manual de eBDML 20 3. INSTRUCCIONES EBDML 3.4. Acceso a Base de Datos 3.4.1. eBD:QUERY Sintaxis: <eBD:QUERY [NAME="nombre"] [DATASOURCE="nombre servidor de datos"] [STATIC="1"]> query sql </eBD:QUERY> Acción: Prepara y ejecuta la consulta contra el servidor de datos indicado, dejando el HANDLER preparado para hacer FETCH, identificándolo con el nombre (NAME). Si se especifica el parámetro STATIC, no se evaluarán los carácteres especiales que se encuentren en la query SQL, por lo que no será necesario usar \ para escaparlos ($,%,etc...) Ejemplo: <eBD:QUERY NAME="test" DATASOURCE="principal"> Select * from test </eBD:QUERY> 3.4.2. eBD:FETCHROW Sintaxis: <eBD:FETCHROW NAME="nombre" QUERY="nombre de la query"/> Acción: Hace FETCHROW del HANDLER identificado con el nombre del atributo QUERY y guarda el registro identificándolo con el nombre (NAME). Ejemplo: <eBD:FETCHROW QUERY="test" NAME="T"/> 3.4.3. eBD:INSERT Sintaxis: <eBD:INSERT TABLE="nombre de la tabla"> <eBD:DATAFIELD FIELD="nombre" VALUE="valor"/> </eBD:INSERT> Acción: Realiza una inserción de un registro en la tabla (TABLE), insertando aquellos campos indicados con el tag eBD:DATAFIELD. Ejemplo: <eBD:INSERT TABLE="test"> <eBD:DATAFIELD FIELD="nombre" VALUE="mi primer insert"/> <eBD:DATAFIELD FIELD="publicado" VALUE="S"/> </eBD:INSERT> Manual de eBDML 21 3. INSTRUCCIONES EBDML 3.4.4. eBD:UPDATE Sintaxis: <eBD:UPDATE TABLE="tablename" IDFIELD="campoid" IDVALUE="valorcampoid" [ADDWHERE=""]> <eBD:DATAFIELD FIELD="fieldname" VALUE="value"/> </eBD:UPDATE> Acción: Realiza un UPDATE del registro o registros indicado por el campo IDFIELD con valor IDVALUE, modificando aquellos campos que indiquen con eBD:DATAFIELD, de la Tabla TABLE. Ejemplo: <eBD:UPDATE TABLE="test" IDFIELD="idconte" IDVALUE="1"> <eBD:DATAFIELD FIELD="nombre" VALUE="mi primer update"/> <eBD:DATAFIELD FIELD="fecha" VALUE="#hoy"/> <eBD:DATAFIELD FIELD="publicado" VALUE="N"/> </eBD:UPDATE> 3.4.5. eBD:DELETE Sintaxis: <eBD:DELETE TABLE="tablename" IDFIELD="campoid" IDVALUE="valorcampoid" [ADDWHERE=""]/> Acción: Realiza un DELETE del registro o registros indicados por el campo IDFIELD con valor IDVALUE. Ejemplo: <eBD:DELETE TABLE="test" IDFIELD="idconte" IDVALUE="1"/> 3.4.6. eBD:QUOTE Sintaxis: <eBD:QUOTE VAR="nombre" VALUE="valor" /> Acción: Pone entre comillas simples (') el valor que le hayamos asignado y lo guarda en la variable VAR. También se escaparán las comillas internas para poder usar la variable directamente en una query sin tener que preocuparnos de escapar las comillas a mano, es decir, nos sustituirá (') por (\'). Ejemplo: <eBD:QUOTE VAR="frase" VALUE="esto es el texto"/> Manual de eBDML 22 3. INSTRUCCIONES EBDML 3.4.7. eBD:EXECDATASOURCE Sintaxis: <eBD:EXECDATASOURCE DATASOURCE="name" [IGNORE_FILTERS="1|0" ADDWHERE="string" ORDERBY="string" LIMIT="string" COUNT="var name"] (lista de parámetros nombre="valor") /> Acción: Permite ejecutar un DataSource definido en el widget identificado por el nombre "name", o de consultas predefinidas. En el propio tag se pueden especificar la lista de parámetros a pasar en la consulta. El parámetro COUNT recoge el valor de 'select count(*)' si está definido el parámetro LIMIT. Ejemplo: <eBD:EXECDATASOURCE DATASOURCE="data" param1="10"/> 3.4.8. eBD:XQUERY Sintaxis: <eBD:XQUERY TABLE="tablename" [NAME="queryname"] [VAR="varname"] [STATIC="1"] > XQuery </eBD:XQUERY> Acción: Ejecuta una consulta XQuery contra una Tabla vinculada usando el formato XML El parámetro NAME definirá el nombre con el que se guardara el HANDLER para poder hacer FETCHROW para poder recorrer el resultado de la expresion como una estructura de registros y campos (array de hashes). El parámetro VAR especifica una variable escalar en la que se almacenará el contenido XML de la respuesta de la query, para poder parsear ese XML manualmente con XMLPARSE. Si se especifica el parámetro STATIC, eBD no interpretara variables ni expresiones dentro de la XQuery, por lo que se podran usar los caracteres especiales ($,%,etc..) sin necesidad de escaparlos. Ejemplo: <ebd:set var="doc" value="#[eBDDB.xml_document(nombre_tabla)]"/> <ebd:xquery table="slashdot" name="datos" var="xml"> for \$a in doc("$doc")/rss/channel/item return <dato> <nombre>{data(\$a/title)}</nombre> <enlace>{data(\$a/link)}</enlace> </dato> </ebd:xquery> Manual de eBDML 23 3. INSTRUCCIONES EBDML 3.4.9. eBD:TRANSACTION Sintaxis: <eBD:TRANSACTION ISOLATION="isolation_value"> COMMIT o ROLLBACK </eBD:TRANSACTION> Acción: Permite una ejecución atómica y confiable en presencia de fallos y una correcta ejecución en presencia de accesos de usuarios múltiples. La base de datos ha de ser (o convertirse) en innoDB. Los valores de ISOLATION pueden ser: • READ UNCOMMITED • READ COMMITED • REPETEABLE READ • SERIALIZABLE Ejemplo: <eBD:TRANSACTION ISOLATION="SERIALIZABLE"> <eBD:INSERT TABLE="tbl_News" DATASOURCE="datasource_A"> <eBD:DATAFIELD FIELD="Title" VALUE="$title"/> <eBD:DATAFIELD FIELD="Date" VALUE="#[eBDDate.CurrentDate]"/> </eBD:INSERT> <eBD:IF EXPR="#[eBDDB.ErrCode]<>0"> <eBD:ROLLLBACK/> <eBD:ELSE> <eBD:INSERT TABLE="tbl_Line_News" DATASOURCE="datasource_A"> <eBD:DATAFIELD FIELD="NewsContent" VALUE="$content_txt"/> </eBD:INSERT> <eBD:IF EXPR="#[eBDDB.ErrCode]<>0"> <eBD:ROLLLBACK/> <eBD:IF> </eBD:ELSE> </eBD:IF> </eBD:TRANSACTION> 3.4.10. eBD:COMMIT Sintaxis: <eBD:COMMIT/> Acción: Al final de una transacción, la finaliza y pone todos los cambios visibles a otros usuarios. Ejemplo: Manual de eBDML 24 3. INSTRUCCIONES EBDML <eBD:TRANSACTION ISOLATION="SERIALIZABLE"> <eBD:INSERT TABLE="tbl_News" DATASOURCE="datasource_A"> <eBD:DATAFIELD FIELD="Title" VALUE="$title"/> <eBD:DATAFIELD FIELD="Date" VALUE="#[eBDDate.CurrentDate]"/> </eBD:INSERT> <eBD:IF EXPR="#[eBDDB.ErrCode]<>0"> <eBD:ROLLLBACK/> <eBD:ELSE> <eBD:COMMIT/> </eBD:ELSE> </eBD:IF> </eBD:TRANSACTION> 3.4.11. eBD:ROLLBACK Sintaxis: <eBD:ROLLBACK/> Acción: Revierte una transacción hasta el inicio de la transacción o hasta un punto de retorno de la transacción. Ejemplo: (Ver ejemplo de eBD:TRANSACTION y eBD:COMMIT) Manual de eBDML 25 3. INSTRUCCIONES EBDML 3.5. Control de Flujo 3.5.1. eBD:RETURN Sintaxis: <eBD:RETURN [ VALUE="valor" ] /> Acción: Aborta la ejecución del SCRIPT y devuelve el valor que se puede recoger con el atributo VAR del la instrucción eBD:CALL. 3.5.2. eBD:BREAK Sintaxis: <eBD:BREAK/> Acción: Aborta la ejecución del contexto que se esté ejecutando. 3.5.3. eBD:FOREACH Sintaxis: <eBD:FOREACH ( QUERY="nombre" | ARRAY="nombre" | KEYS="hashname") [ITERATOR="nombre"] [START="número"] > código eBDML y HTML </eBD:FOREACH> Acción: Hace un bucle con tantas iteraciones como registros haya devuelto la ejecución de la consulta. Típicamente, la primera instrucción de su interior deberá ser un eBDFETCHROW. El atributo START indica el número de registro por el que se debe comenzar el bucle. Se puede hacer un recorrido sobre un ARRAY usando el parámetro ARRAY en lugar de KEYS. También se puede hacer un recorrido sobre las claves de un HASH usando KEYS y el nombre del HASH. El atributo ITERATOR indica el nombre de la variable que se usará para iterar sobre todos los elementos del array. Si no se especifica ITERATOR, se creará automáticamente la variable $iterator. Ejemplo: <eBD:FOREACH ARRAY="lista"> <eBD:OUT VALUE="$iterator"/> </eBD:FOREACH> <eBD:FOREACH QUERY="noticias"> <eBD:FETCHROW QUERY="noticias" NAME="noticia"/> .... </eBD:FOREACH> <eBD:FOREACH KEYS="hash" ITERATOR="k"> <eBD:OUT VALUE="$k : @hash{$k}/> </eBD:FOREACH> Manual de eBDML 26 3. INSTRUCCIONES EBDML 3.5.4. eBD:IF Sintaxis: <eBD:IF EXPR="expresión"> código eBDML <eBD:ELSIF EXPR="expresion"> código eBDML <eBD:ELSE> código eBDML </eBD:ELSE> </eBD:ELSIF> </eBD:IF> Acción: Estructura condicional IF ... ELSIF ... ELSE ... Ejemplo: <eBD:IF EXPR=" $id == 0 "> El id es 0 <eBD:ELSIF EXPR=" '$nombre' =~ '^R' | '$nombre' == 'Juan' "> El nombre empieza por R o es Juan <eBD:ELSE> Ni la id es 0 ni el nombre empieza por R ni es Juan </eBD:ELSE> </eBD:ELSIF> </eBD:IF> <eBD:IF EXPR=" '$numero' =~ '^(\d+).(\d+)$' "> Parte entera = <eBD:OUT VALUE="$1"/> <eBD:OUT VALUE="Parte decimal = $1"/> </eBD:IF> 3.5.5. eBD:WHILE Sintaxis: <eBD:WHILE EXPR="expresión"> código eBDML </eBD:WHILE> Acción: Realiza iteraciones mientras la evaluación de la expresión sea un valor cierto. Ejemplo: <eBD:WHILE EXPR=" $count < =10 "> <eBD:SET VAR="count" EXPR="$count+1"/> ... </eBD:WHILE> Manual de eBDML 27 3. INSTRUCCIONES EBDML 3.5.6. eBD:USE Sintaxis: <eBD:USE (LIB="nombre_libreria" | SCRIPT="nombre_script")/> Acción: Usando el parámetro LIB, carga la librería eBDML y prepara las funciones para su ejecución. Si se usa el parámetro SCRIPT, incrusta en el HTML resultante el código fuente del Script indicado. Ejemplo: <eBD:USE LIB="funciones"/> 3.5.7. eBD:CALL Sintaxis: <eBD:CALL [FUNCTION="nombre_función" | EVENT="widgetEventName] [LIB="nombre_libreria"] [VAR="variable"] [STORE="variable"] (lista de parámetros nombre="valor" )* /> Acción: Llama la función ebdml "Nombre_funcion" de la librería, o a un evento en el caso de un widget, y muestra el HTML generado. Si definimos el STORE guardará el contenido HTML en la variable en vez de mostrarlo al instante. El atributo VAR es para recoger el valor del return y los demás parámetros son enviados como tal. El parámetro EVENT permitirá ejecutar eventos de un widget desde el propio código eBDML del widget. Ejemplo: <eBD:CALL FUNCTION="redondea" VAR="numero_ok" STORE="basura" numero="$numero" decimales="2"/> <eBD:CALL FUNCTION="html_table" VAR="pintable" STORE="html_table" idnot="$idnot"/> 3.5.8. eBD:FORK Sintaxis: <eBD:FORK> Código EBDML </eBD:FORK> Acción: OBSOLETO!!! en entorno Linux/Unix y no soportada bajo Windows. Sirve para crear un proceso de servidor hijo. El código entre los dos TAGS se ejecutará en modo BACKGROUND. Ejemplo: <eBD:FORK> ... </eBD:FORK> Manual de eBDML 28 3. INSTRUCCIONES EBDML 3.5.9. eBD:CACHE Sintaxis: <eBD:CACHE NAME="cachename" ID="identifier_string" [EXPIRES="expiration"] STORE_VARS="$var1,%$var2,%var3"> Código EBDML </eBD:CACHE> Acción: El nombre será identificativo, el ID será el patrón a seguir para evaluar el código o mostrar el código cacheado. Si deseamos que tenga un límite, podemos especificar un EXPIRES donde pondremos un número y una letra, que debe ser [smhdw] (segundo, minutos, horas, dias y semanas). Si se especifica el parámetro STORE_VARS, se cachearan tambien las variables locales, globales o temporales indicadas en él. Ejemplo: <eBD:CACHE NAME="test" ID="#usuario" EXPIRES="1 d"> ... </eBD:CACHE> 3.5.10. eBD:CLEARCACHE Sintaxis: <eBD:CLEARCACHE (ID="(pageid | sectionid | tableid)" | SECTION="name" | PAGE="name" | TABLE="name" | NAME="string" )/> Acción: Elimina la cache de la Página, Sección o Tabla XML especificada. Si se ha añadido un identificador a la cache, se podrá eliminar mediante la opción "NAME". Ejemplo: <eBD:CLEARCACHE PAGE="home"/> <eBD:CLEARCACHE NAME="identifier_1"/> 3.5.11. eBD:INCLUDE Sintaxis: <eBD:INCLUDE SECTION="name" [PAGE="name" | ZONE="name"] [STORE="var"] (lista de parámetros nombre="valor" ) /> Acción: Ejecuta la sección indicada y devuelve el código HTML resultante, si indicamos un 'STORE' guardará el código en dicha variable. Se pueden modificar los parámetros de la sección. También se puede usar desde archivos dinámicos y Web Services para ejecutar secciones. Mediante las opciones PAGE y ZONE se puede ejecutar secciones de otras páginas o zonas. Manual de eBDML 29 3. INSTRUCCIONES EBDML Atención: Los parámetros enviados se pasan de forma case-sensitive. Ejemplo: <eBD:INCLUDE SECTION="grafica" param1="$idconte" STORE="contenido"/> .... <eBD:OUT VALUE="$contenido"/> <eBD:INCLUDE SECTION="test" param1="$idconte" param2="$idcategoria" mostrable="S"/> Manual de eBDML 30 3. INSTRUCCIONES EBDML 3.6. Integración y Comunicación 3.6.1. eBD:SENDMAIL Sintaxis: <eBD:SENDMAIL TO="mail" FROM="mail" [CC="mail;..." ] [BCC="mail;..." ] [REPLYTO="address"] SUBJECT="subject" [SERVER="smtp"] [PORT="25"] [TYPE="text/html"] [USER="username" PASSWORD="password"] > Contenido del mensaje | <eBD:BODY></eBD:BODY><eBD:ATTACH .. > </eBD:SENDMAIL> Sintaxis avanzada: <eBD:SENDMAIL TO="mail" FROM="mail" [CC="mail;..." ] [BCC="mail;..." ] [REPLYTO="address"] SUBJECT="subject" [SERVER="ip"] [PORT="25"] [TYPE="text/html"] [USER="username" PASSWORD="password"]> <eBD:BODY> Contenido del mensaje </eBD:BODY> <eBD:ATTACH FILE="fichero" [NAME="nombre"] /> + </eBD:SENDMAIL> Acción: Envía el contenido (body) por correo electrónico. Si se usa la sintaxis avanzada enviará también los archivos adjuntos. Ejemplo: <eBD:SENDMAIL TO="ebd.soporte@oasyssoft.com" FROM="test@oasyssoft.com" SUBJECT="test mundo" TYPE="text/plain"> hola mundo eBD!! Soy #usuario </eBD:SENDMAIL> <eBD:SENDMAIL TO="ebd.soporte@oasyssoft.com" FROM="test@oasyssoft.com" SUBJECT="test mundo" TYPE="text/html"> <eBD:ATTACH file="/files/1-149-img_petita/image003.jpg" /> <eBD:BODY> <html><head><body> <h3>hola mundo eBD!!<br>Sigo siendo #usuario</h3> </body></head></html> </eBD:BODY> </eBD:SENDMAIL> 3.6.2. eBD:SENDSMS Sintaxis: <eBD:SENDSMS TO="móvil" FROM="móvil" [SERVER="smpp"] [PORT="port"] [USER="username" PASSWORD="password"] > Message Body </eBD:SENDSMS> Manual de eBDML 31 3. INSTRUCCIONES EBDML Acción: Envía el contenido (Message Body) por SMS. Ejemplo: <eBD:SENDSMS TO="666999888" FROM="555444222" > Hola!!!! Llegaré tarde! </eBD:SENDMAIL> 3.6.3. eBD:BODY Sintaxis: <eBD:BODY> Cuerpo del mail </eBD:BODY> Acción: Instrucción que debe ir dentro de <eBD:SENDMAIL>. Sirve para escribir el cuerpo del mensaje. Esto mismo lo podemos hacer incluyendo el texto entre los tags <eBD:SENDMAIL> y </eBD:SENDMAIL> 3.6.4. eBD:ATTACH Sintaxis: <eBD:attach FILE="filename1" [NAME="filename2"] [ID="content-id"]/> Acción: Instrucción que va dentro de <eBD:SENDMAIL>. Podemos adjuntar un fichero cuyo nombre es 'filename1' y opcionalmente cambiarle el nombre por 'filename2'. Debemos haber subido previamente el fichero que adjuntamos antes de enviarlo, por ejemplo usando un TMPFILE. 3.6.5. eBD:HTTPGET Sintaxis: <eBD:HTTPGET URL="value" [VAR="varname" | GLOBAL="varname" | TEMPORAL="varname"] [ ENCODING="source encoding" ] [ UPDATE_HTML="1" ] [ USERNAME="username" ] [ PASSWORD="password" ] [ REQUEST_HEADERS="varname" ] [ RESPONSE_HEADERS="varname" ] /> Acción: Realiza una Petición GET a un servidor HTTP de una URL que se recibe como parámetro, y deja el contenido en una Variable Local, global o Temporal. Si no se especifica ninguna variable se genera la salida al documento HTML. Si especificamos el parámetro UPDATE_HTML se pondrá el dominio en los links y referencias encontradas. Si se especifican los parámetros USERNAME y PASSWORD, éstos se usaran para construir las cabeceras de autenticación. Los parámetros REQUEST_HEADERS y RESPONSE_HEADERS permiten usar HASHES para enviar o recibir en ellos las cabeceras de la request respectivamente. Ejemplo: Manual de eBDML 32 3. INSTRUCCIONES EBDML <eBD:HTTPGET VAR="test" URL="http://my.domain.com/index.html"/> <eBD:HTTPGET VAR="test" URL="http://www.google.es/" UPDATE_HTML="1"/> 3.6.6. eBD:HTTPPOST Sintaxis: <eBD:HTTPPOST URL="value" [VAR="varname" | GLOBAL="varname" | TEMPORAL="varname"] [ USERNAME="username" ] [ PASSWORD="password" ] [ REQUEST_HEADERS="varname" ] [ RESPONSE_HEADERS="varname" ] [ ENCODING="source encoding" ] > <eBD:PARAM NAME="param name" VALUE="value"/>+ </eBD:HTTPPOST> Acción: Realiza una Petición POST a un servidor HTTP de una URL que se recibe como parámetro, y deja el contenido en una Variable Local, global o Temporal. Si no se especifica ninguna variable se genera la salida al documento HTML. Si se especifican los parámetros USERNAME y PASSWORD, éstos se usaran para construir las cabeceras de autenticación. Los parámetros REQUEST_HEADERS y RESPONSE_HEADERS permiten usar HASHES para enviar o recibir en ellos las cabeceras de la request respectivamente. Los argumentos a enviar en el contenido del POST se especifican usando tantas instrucciones eBD:PARAM como parámetros se quieran enviar. Ejemplo: <eBD:HTTPPOST VAR="html" URL="http://my.domain.com/index.html"> <eBD:PARAM NAME="name" VALUE="$my_name"> <eBD:PARAM NAME="email" VALUE="$my_email"> </eBD:HTTPPOST> 3.6.7. eBD:WS Sintaxis: <eBD:WS [SERVICE="servicio" | WSDL="wsdl_url"] OPERATION="funcion" [VAR="variable"]> <eBD:PARAM NAME="nombre" VALUE="valor" [TYPE="type|AUTO"]/> .... </eBD:WS> Acción: Ejecuta un Webservice y guarda el resultado en una variable. Se puede indicar el servicio a usar con el parámetro SERVICE (que debe contener el nombre del servicio tal y como se ha configurado en el menu "Recursos compartidos", o directamente usando la url del archivo de definición del servicio con el parámetro WSDL. Ejemplo: <eBD:WS SERVICE="users" OPERATION="login" VAR="dato"> <eBD:PARAM NAME="username" VALUE="$username"/> Manual de eBDML 33 3. INSTRUCCIONES EBDML <eBD:PARAM NAME="password" VALUE="$password"/> </eBD:WS> 3.6.8. eBD:XMLPARSE Sintaxis: <eBD:XMLPARSE (VAR="varname" | GLOBAL="varname" | TEMPORAL="varname") VALUE="value" [PARSER="LITE|RECORDSET"] [ENCODING="source encoding"]/> Acción: Parsea un documento XML y genera un árbol (basado en HASHES) con la información del xml recibido. Si se usa el parámetro PARSER="LITE", se usará un parser que no valida ni interpreta entities. Este parser sólo es útil si el XML recibido no cumple estrictamente el estándar en lo que se refiere a la codificación de carácteres usando entities. El parámetro PARSER="RECORDSET" parsea estructuras XML simples, devolviendo un array de hashes. Con el parámetro ENCODING le indicamos el tipo de codificación, para que no lo deduzca del automáticamente del archivo. Cada nodo del árbol generado tendrá esta estructura: tag nombre del tag. namespace namespace asociado al tag. localname nombre del tag, excluyendo el namespace. prefix prefijo que se usa para identificar el namespace en el xml. childs un array con todos los nodos hijos, que tendran esta misma estructura. attributes un hash con los atributos del nodo. data variable con el contenido del nodo. parent puntero al nodo padre. Ejemplo: <eBD:XMLPARSE VAR="arbol" VALUE="$xml"/> 3.6.9. eBD:EXECPROCESS Sintaxis: <eBD:EXECPROCESS [PROCESSID="idprocess" | PROCESS="name"] [ARGS="value value value..."] [STDOUT="varname"] [STDERR="varname"] [STATUS="varname"]/> Acción: Ejecutará el proceso especificado inmediatamente, y espera a que finalize la ejecución. En las variables indicadas por los parámetros STDOUT, STDERR y STATUS se guardarán los valores generados por los canales de comunicación estándar del proceso, y el valor de retorno de la ejecución. Ejemplo: Manual de eBDML 34 3. INSTRUCCIONES EBDML <eBD:EXECPROCESS PROCESS="boletin"/> 3.6.10. eBD:EXECTASK Sintaxis: <eBD:EXECTASK (TASKID="idtask" | TASK="name") [EXECDATE="AAAA-MM-DD hh:ii:ss"]/> Acción: Ejecutara la tarea programada especificada, si se omite el parámetro EXECDATE se ejecutara inmediatamente. Ejemplo: <eBD:EXECTASK TASK="boletin"/> 3.6.11. eBD:FTPCLOSE Sintaxis: <eBD:FTPCLOSE FTP="ftp_connection" ERR="varname"/> Acción: Cierra la conexión FTP. Ejemplo: <eBDFTPCLOSE FTP="my_ftp" ERR="error"/> 3.6.12. eBD:FTPCWD Sintaxis: <eBD:FTPCWD FTP="ftp_connection" ERR="varname" DIR="directory"/> Action: Permite cambiar el directorio de trabajo. Ejemplo: <eBDFTPCWD FTP="my_ftp" ERR="error" DIR="other_dir"/> 3.6.13. eBD:FTPDELETE Sintaxis: <eBD:FTPDELETE FTP="ftp_connection" ERR="varname" REMOTE="remote_file"/> Acción: Borra un archivo remoto indicado en el nombre de la ruta. Ejemplo: Manual de eBDML 35 3. INSTRUCCIONES EBDML <eBD:FTPDELETE FTP="my_ftp" ERR="error" REMOTE="old_file.txt"/> 3.6.14. eBD:FTPGET Sintaxis: <eBD:FTPGET FTP="ftp_connection" ERR="varname" LOCAL="local_file" REMOTE="remote_file"/> Acción: Coge un fichero remoto y lo guarda en la variable LOCAL. Ejemplo: <eBD:FTPGET FTP="my_ftp" ERR="error" LOCAL="new_file.txt" REMOTO="remote_file.txt"/> 3.6.15. eBD:FTPLOGIN Sintaxis: <eBD:FTPLOGIN [PASSWORD="password"] VAR="ftpcon_var" ERR="varname" [PASSIVE="0|1"] [PORT="port"] HOST="hostname" [LOGIN="login"]/> Acción: Crea la conexión con el FTP. La conexión guarda un puntero sobre la conexión en VAR para referenciarlo en el resto de comandos. • PASSWORD: Contraseña de acceso al servidor FTP. • VAR: Variable en la que se almacena la respuesta del FTP. • ERR: Variable en la que se almacena el error del FTP en caso de existir. • PASSIVE: Modo pasivo (1) o Modo activo (0). • PORT: Puerto de conexión al servidor. • HOST: Nombre del servicio FTP. • LOGIN: Nombre del usuario de acceso al FTP. El HOST en caso de ser la misma máquina, no puede llamarse 'localhost', sino 'localhost.domain' ó 127.0.0.1 Ejemplo: <eBD:FTPLOGIN VAR="my_ftp" ERR="error" HOST="ftp.my_server.com"/> <eBD:FTPLOGIN PASSWORD="12345" VAR="my_ftp" ERR="error" HOST="ftp.my_server.com" LOGIN="john"/> Retorno: Net::FTP=GLOB(0xe313a84) 3.6.16. eBD:FTPLS Sintaxis: Manual de eBDML 36 3. INSTRUCCIONES EBDML <eBD:FTPLS OUT="varname" FTP="ftp_connection" ERR="varname" [LONG="1|0"] [DIR="directory"]/> Acción: Lista el contenido del directorio remoto. • OUT: Array con el contenido del directorio mostrado, de la raiz en caso que no sea informado. • FTP: Nombre de la conexión del FTP. • ERR: Mensaje de error en caso de que exista. • LONG: Muestra toda la informacion del fichero/carpeta (1) o no (0): o 1: devuelve permisos, usuario, fecha, nombre fichero. o 0: devuelve el path absoluto (partiendo de la raiz del FTP) del fichero/carpeta • DIR: Directorio al que se quiere acceder. Ejemplo: <eBD:FTPLS OUT="file_list" FTP="my_ftp" ERR="error"/> <ebd:foreach array="file_list"> <ebd:out value="$iterator"/> </ebd:foreach> Retorno: Long=1 , devuelve un array con el siguiente contenido: drwxr-xr-x drwxr-xr-x drwxr-xr-x -rw-r--r--rw-r--r-- 3 3 2 1 1 ftptesting ftptesting ftptesting ftptesting ftptesting ftptesting ftptesting ftptesting ftptesting ftptesting 4096 May 12 10:11 . 4096 May 12 10:10 .. 4096 May 12 10:11 33 52535 May 12 10:05 859714.jpg 57726 May 12 10:05 dr-slump.JPG **NOTA** Para separar cada uno de los valores y tenerlo en un array usar: <ebd:split value="$iterator" array="arCont" char="\s+"/> ya que el número de espacios que separan cada parámetro es irregular e indefinido Long=0 , devuelve un array con el siguiente contenido: varis/fc-barcelona-poster.jpg varis/atari_logo.jpg varis/wam-tux-maul-starwars-1771.png 3.6.17. eBD:FTPMKDIR Sintaxis: <eBD:FTPMKDIR [RECURSIVE="1|0"] FTP="ftp_connection" ERR="varname" DIRECTORY="remote_dir"/> Acción: Crea un directorio en directorio remoto. Manual de eBDML 37 3. INSTRUCCIONES EBDML Ejemplo: <eBD:FTPMKDIR FTP="my_ftp" ERR="error" DIRECTORY="images"/> 3.6.18. eBD:FTPPUT Sintaxis: <eBD:FTPPUT FTP="ftp_connection" ERR="varname" LOCAL="local_file" REMOTE="remote_file"/> Acción: Envia un archivo al directorio remoto. Ejemplo; <eBD:FTPPUT FTP="my_ftp" ERR="error" LOCAL="image1.jpg" REMOTE="image1.jpg"/> 3.6.19. eBD:FTPPWD Sintaxis: <eBD:FTPPWD OUT="varname" FTP="ftp_connection" ER="varname"/> Acción Indica en que directorio se está trabajando Ejemplo: <eBDFTPPWD OUT="directorio" FTP="my_ftp" ERR="error"/> 3.6.20. eBD:FTPRENAME Sintaxis: <eBD:FTPRENAME FTP="ftp_connection" ERR="varname" NEW="remote_file" OLD="remote_file"/> Acción: Cambia el nombre de un fichero remoto. Si se especifica en el parámetro NEW una ruta distinta, el archivo será movido de directorio. Ejemplo: <eBD:FTPRENAME FTP="my_ftp" ERR="error" NEW="new_image.jpg" OLD="old_image.jpg"/> 3.6.21. eBD:FTPRMDIR Sintaxis: <eBD:FTPRMDIR [RECURSIVE="1|0"] FTP="ftp_connection" ERR="varname" DIRECTORY="remote_dir"/> Acción: Borra un directorio remoto. Puede hacer borrados recursivos. Ejemplo: Manual de eBDML 38 3. INSTRUCCIONES EBDML <eBD:FTPRMDIR FTP="my_ftp" ERR="error" DIRECTORY="images"/> 3.6.22. eBD:FTPSIZE Sintaxis: <eBD:FTPSIZE OUT="varname" FTP="ftp_connection" ERR="varname" REMOTE="remote_file"/> Acción: Guarda en OUT el valor del tamaño del archivo remoto. Ejemplo: <eBD:FTPSIZE OUT="size" FTP="my_ftp" ERR="error" REMOTE="image1.jpg"/> Manual de eBDML 39 3. INSTRUCCIONES EBDML 3.7. Manipulación de datos 3.7.1. eBD:REPLACE Sintaxis: <eBD:REPLACE VAR="nombre" MATCH="regexp" REPLACE="valor" /> Acción: Sustituye el patrón definido en el parámetro MATCH por el valor del parámetro REPLACE. El parámetro MATCH es una expresión regular, de forma que se pueden recuperar los trozos incluidos entre paréntesis con las variables $1, $2, etc. desde el REPLACE. Ejemplo: <eBD:REPLACE VAR="frase" MATCH="([aeiou])" REPLACE="-$1-"/> 3.7.2. eBD:LENGTH Sintaxis: <eBD:LENGTH VAR="varname" VALUE="value"/> Acción: Obtenemos la longitud de VALUE y dejamos el resultado en VARNAME. Ejemplo: <eBD:LENGTH VAR="longitud" VALUE="esto nos dara 16"/> 3.7.3. eBD:UNICODE Sintaxis: <eBD:UNICODE (VAR="varname" | GLOBAL="varname" | TEMPORAL="varname") VALUE="value" FROM="charset" TO="charset"/> Acción: Pasará el valor del parámetro VALUE del charset FROM al charset TO. Ejemplo: <eBD:UNICODE VALUE="buenos días" FROM="latin1" TO="utf8"/> Manual de eBDML 40 3. INSTRUCCIONES EBDML 3.7.4. eBD:HTMLENCODE Sintaxis: <eBD:HTMLENCODE (VAR="varname" | GLOBAL="varname" | TEMPORAL="varname") VALUE="valor" /> Acción: Esta rutina reemplaza carácteres inseguros en el valor por los elementos HTML correspondientes. Los caracteres considerados peligrosos con caracteres de control, los caracteres <, &, >, " y los caracteres cuyo código es mayor que 128 (high-bit). Si se especifica una variable, se deja el resultado en la variable, en caso contrario se genera la salida al documento HTML. Ejemplo: <eBD:HTMLENCODE VAR="test" VALUE="buenos diás."/> 3.7.5. eBD:HTMLDECODE Sintaxis: <eBD:HTMLENCODE (VAR="varname" | GLOBAL="varname" | TEMPORAL="varname" ) VALUE="valor" /> Acción: Esta rutina reemplaza las entidades HTML por el correspondiente valor Unicode. Si se especifica una variable, se deja el resultado en la variable, en caso contrario, se genera la salida al documento HTML. Ejemplo: <eBD:HTMLDECODE VAR="test" VALUE="buenos días."/> 3.7.6. eBD:ENCODE Sintaxis: <eBD:ENCODE [VAR="varname"] VALUE="value" INTO="encoding" /> Acción: Esta rutina codifica un texto en el formato indicado por el encoding, y lo almacena en la variable "varname". Actualmente, el único encoding soportado es BASE64. Ejemplo: <eBD:ENCODE VAR="test" VALUE="buenos diás." INTO="BASE64"/> Manual de eBDML 41 3. INSTRUCCIONES EBDML 3.7.7. eBD:DECODE Sintaxis: <eBD:DECODE [VAR="varname"] VALUE="value" FROM="encoding" /> Acción: Esta rutina decodifica un texto codificado en el formato indicado por el encoding, y lo almacena en la variable "varname". Actualmente, el único encoding soportado es BASE64. Ejemplo: <eBD:DECODE VAR="test" VALUE="$base64encoded" FROM="BASE64"/> 3.7.8. eBD:URIESCAPE Sintaxis: <eBD:URIESCAPE [VAR="varname" | GLOBAL="varname" | TEMPORAL="varname"] VALUE="value" [ UTF8="1|0" ]/> Acción: Escapa los caracteres especiales que se encuentren en el valor "value" para convertirlo en una URL válida segun el RFC 2396, y lo almacena en la variable indicada por var, global o temporal. El parámetro UTF8 indica si se debe interpretar el texto original como utf8 o no. Ejemplo: <eBD:URIESCAPE VAR="url" VALUE="un parámetro" UTF8="1"> 3.7.9. eBD:URIUNESCAPE Sintaxis: <eBD:URIUNESCAPE [VAR="varname" | GLOBAL="varname" | TEMPORAL="varname"] VALUE="value" [ UTF8="1|0" ]/> Acción: Recupera los carácteres especiales que se habian escapado en "value" para obtener el texto original, y lo almacena en la variable indicada por var, global o temporal. El parámetro UTF8 indica si se debe interpretar el texto original como utf8 o no. Ejemplo: <eBD:URIESCAPE VAR="text" VALUE="$escaped_url" UTF8="1"> Manual de eBDML 42 3. INSTRUCCIONES EBDML 3.7.10. eBD:SERIALIZE Sintaxis: <eBD:SERIALIZE [VAR="varname"] VALUE="value" INTO="format" [AUTOTYPE="0|1"] [METHOD="xmlrpc_method"] [METHODNAME="methodname"] /> Acción: Serializa una estructura de datos compleja (formada por combinaciones de ARRAYS y HASHES), en un escalar que representa esa estructura y se puede almacenar en una única variable. Los formatos soportaros son XML-RPC o JSON El parámetro AUTOTYPE indica si se deben generar los tags XML-RPC en funcion del tipo de datos de los valores de forma automática. El parámetro METHOD indica el tipo de XML que se quiere generar en caso de usar XML-RPC. Los posibles valores son CALL, RESPONSE o FAULT. En el caso de CALL, se usa el parámetro METHODNAME para indicar el nombre del metodo a llamar. Ejemplo: <eBD:SERIALIZE VAR="serialized" VALUE="$data" INTO="JSON"> <eBD:OUT VALUE="$serialized"/> 3.7.11. eBD:DESERIALIZE Sintaxis: <eBD:DESERIALIZE [VAR="varname"] VALUE="value" FROM="format" /> Acción: Recupera una estructura de datos serializada en alguno de los formatos soportados por eBD:SERIALIZE: XMLRPC o JSON. Ejemplo: <eBD:DESERIALIZE VAR="data" VALUE="$serialized" FROM="JSON"> Manual de eBDML 43 3. INSTRUCCIONES EBDML 3.8. Manipulación de ficheros 3.8.1. eBD:TMPFILE Sintaxis: <eBD:TMPFILE (SOURCE="varname" | VALUE="value" | FILEPATH="value" | TABLE="value" IDFIELD="value" IDVALUE="value" ADDWHERE="value" FIELD="value") VAR="varname" [NAME="value" | MAXSIZE="number" | EXTENSION="ext" | MODE="binary|text" | CHARSET="charset"] /> Acción: Crea un archivo temporal y dejara el puntero al archivo en la variable VAR. El contenido puede venir, o de un input de tipo "file" (SOURCE), de un valor especifico VALUE o del campo fichero de una tabla. Se puede devolver un tmpfile como un archivo dinámico o una función de Web Service, así como crear el fichero a partir de una URL de un FILEPATH directamente. También se le puede especificar la extensión que tendrá el fichero, mediante EXTENSION. Ejemplo: <eBD:TMPFILE SOURCE="imagen" VAR="fichero_source"/> <eBD:TMPFILE VALUE="esto sera el valor del fichero" VAR="ficherotxt"/> <eBD:TMPFILE TABLE="test" IDFIELD="idtest" IDVALUE="22" FIELD="imagen" VAR="copia_imagen"/> 3.8.2. eBD:READ Sintaxis: <eBD:READ FILE="varname" SIZE="size_bytes" BUFFER="varname" [VAR="bytes_read"] /> Acción: Lee del fichero temporal especificado en FILE el numero de bytes en SIZE y lo almacena en la variable BUFFER. Si se especifica el parámetro VAR se guardara el numero de bytes leidos. Ejemplo: <eBD:READ FILE="fichero_source" SIZE="500" BUFFER="todo"/> Ejemplo de uso: Creación de un fichero dinámico que retorna un fichero almacenado en una tabla. <eBD:CODE> <eBD:DOC> Vamos a leer en bloques de 64Kbtes </eBD:DOC> <eBD:SET VAR="bytes" VALUE="65536"/> <eBD:TMPFILE TABLE="tmp_ficheros" FIELD="fichero" IDFIELD="idfichero" IDVALUE="2" VAR="mi_pdf"/> <eBD:SET VAR="bytesleidos" VALUE="$bytes"/> <eBD:WHILE EXPR="$bytesleidos=$bytes"> Manual de eBDML 44 3. INSTRUCCIONES EBDML <eBD:READ FILE="mi_pdf" SIZE="$bytes" BUFFER="tmp" VAR="bytesleidos"/> <eBD:SET VAR="resultado" VALUE="$resultado$tmp"/> </eBD:WHILE> <eBD:OUT VALUE="$resultado"/> </eBD:CODE> 3.8.3. eBD:READLINE Sintaxis: <eBD:READLINE FILE="varname" (VAR="varname" | ADDTO="varname") /> Acción: Lee una linea del fichero temporal especificado en FILE y se guardar en la variable VAR, o se concatena con la variable especificada en ADDTO. Ejemplo: <eBD:READLINE FILE="fichero_source" ADDTO="todo"/> 3.8.4. eBD:WRITE Sintaxis: <eBD:WRITE FILE="varname" (VALUE="value" | EXPR="expression") /> Acción: Escribe en el posición acutal del puntero del fichero FILE el contenido o expresión especificada. Ejemplo: <eBD:WRITE FILE="fichero_source" VALUE="se añade al fichero...."/> 3.8.5. eBD:SEEK Sintaxis: <eBD:SEEK FILE="varname" TO="bytes" /> Acción: Posiciona el puntero del fichero FILE en el byte especificado en TO. Ejemplo: <eBD:SEEK FILE="fichero_source" TO="0"/> 3.8.6. eBD:XSLTPROC Sintaxis: <eBD:XSLTPROC XSLT="template_name" INPUT="varname" [VAR="varname"] [OUTPUT="TMPFILE"] [TYPE="PDF"] /> Acción: Manual de eBDML 45 3. INSTRUCCIONES EBDML Ejecuta una transformacion XSLT sobre un string o fichero temporal que contiene datos XML. La variable indicada en INPUT puede ser un escalar o un fichero creado con TMPFILE. La variable indicado en VAR contendra el resultado como un escalar, o como un TMPFILE si se ha especificado asi con el parámetro OUTPUT. El parámetro TYPE permite forzar la ejecución del proceso FOP para generar el documento PDF a partir del resultado de la transformación. Ejemplo: <eBD:XSLTPROC XSLT="xml_to_html" INPUT="xmlfile" VAR="data" OUTPUT="TMPFILE" /> 3.8.7. eBD:EXTRACT Sintaxis: <eBD:EXTRACT FILE="tmpfile" [VAR="array"] [CHARSET="charset"] /> Acción: Devuelve un array de TMPFILEs con todos los ficheros que estaban comprimidos en el TMPFILE original. Los posibles formatos que soporta la instruccion extract son: zip, tgz, tar.gz, gz, tar, jar, par, tbz, tar.bz2, bz2, lzma, Z El parámetro opcional "CHARSET" permite definir el charset en el que están codificados los nombres de los ficheros dentro del archivo comprimido. Las claves que podemos usar en el array son "name" y "path", donde name nos devolverá el nombre del fichero, y path, su ruta. <eBD:EXTRACT FILE="fichero" VAR="extracted" /> <ebd:foreach array="extracted" iterator="file"> <ebd:out value="Fichero subido! @file{name}"/><br> </ebd:foreach> Manual de eBDML 46 3. INSTRUCCIONES EBDML 3.9. Manipulación de Imágenes 3.9.1. eBD:IMGCREATE Sintaxis: <eBD:IMGCREATE VAR="imgvar" ( WIDTH="pixels" HEIGHT="pixels" [TRUECOLOR="1|0"] | TMPFILE="tmpfile" )/> Acción: Crea una imagen vacia, con las dimensiones indicadas. Puede crearse en modo truecolor o no (usara una paleta). Si se usa la opcion TMPFILE, creará la imagen a partir de un fichero temporal previamente abierto con TMPFILE. Ejemplo: <eBD:IMGCREATE VAR="img" WIDTH="$w" HEIGHT="$h" TRUECOLOR="1" /> <eBD:IMGCREATE VAR="img" TMPFILE="tmpFileName" /> 3.9.2. eBD:IMGINFO Sintaxis: <eBD:IMGINFO IMG="imgvar" [WIDTH="varname"] [HEIGHT="varname"] /> Acción: Devuelve la anchura y la altura de la imagen. Ejemplo: <eBD:IMGINFO IMG="img" WIDTH="w" HEIGHT="h" /> <eBD:OUT VALUE="Ancho: $w, Alto: $h"/> 3.9.3. eBD:IMGCOLOR Sintaxis: <eBD:IMGCOLOR IMG="image_var" ( ALLOCATE="(XXXXXX|r,g,b)" VAR="index" | DEALLOCATE="colorindex" | COUNT="varname" | CLOSEST="(XXXXXX|r,g,b)" [USEHWB="(0|1)"] VAR="index" | EXACT="(XXXXXX|r,g,b)" VAR="index" [ALLOC="(0|1)"] | PIXEL="x,y" VAR="varname" | INDEX="index" VAR="varname" | TRANSPARENT="(FFFFFF|r,g,b)" ) /> Acción: Permite realizar varias operaciones sobre la paleta de colores de una imagen. Los parámetros XXXXXXXX representan un codigo RGB en hexadecimal (6 caracteres). Ejemplo: Manual de eBDML 47 3. INSTRUCCIONES EBDML <eBD:IMGCOLOR IMG="imgvar" ALLOCATE="r,g,b" VAR="index" /> Añade un color especificado por los componentes RGB a la paleta. <eBD:IMGCOLOR IMG="imgvar" DEALLOCATE="index" /> Elimina el color indicado por el indice de la paleta. <eBD:IMGCOLOR IMG="imgvar" CLOSEST="r,g,b" USEHWB="1" VAR="index" /> Devuelve el indice del color de la paleta que mas se parece al que estamos buscando, según los componentes RGB. Si se usa el parámetro USEHWB, buscara el color mas parecido según los componentes HWB, que se acercan mas a la percepción humana. <eBD:IMGCOLOR IMG="imgvar" EXACT="r,g,b" ALLOCATE="1" VAR="index" /> Busca el color indicado por los componentes RGB en la paleta y devuelve el indice. Si no encuentra el color, y se ha usado el parámetro ALLOCATE, se añade el color a la paleta automaticamente. <eBD:IMGCOLOR IMG="imgvar" PIXEL="x,y" VAR="color" /> (color = r,g,b) Devuelve los componentes RGB del color con el que esta pintado el pixel indicado. <eBD:IMGCOLOR IMG="imgvar" INDEX="index" VAR="color" /> (color = r,g,b) Devuelve los componentes RGB de la posición indicada de la paleta. <eBD:IMGCOLOR IMG="imgvar" TRANSPARENT="r,g,b" /> Activa el flag de transparencia para el color indicado de la paleta. 3.9.4. eBD:IMGDRAW Sintaxis: <eBD:IMGDRAW IMG="image_var" [ANTIALIAS="(FFFFFF|r,g,b)"] ( FILL="x,y" [THICKNESS="pixels"] ( COLOR="(FFFFFF|r,g,b)" | FILLCOLOR="(FFFFFF|r,g,b)" | STYLE="color1;color2;..." ) | ELLIPSE="cx,cy,width,height" [THICKNESS="pixels"] ( COLOR="(FFFFFF|r,g,b)" | FILLCOLOR="(FFFFFF|r,g,b)" | STYLE="color1;color2;..." ) | RECT="x1,y1,x2,y2" [THICKNESS="pixels"] ( COLOR="(FFFFFF|r,g,b)" | FILLCOLOR="(FFFFFF|r,g,b)" | STYLE="color1;color2;..." ) | STRING="text" DIRECTION="(V|H)" COLOR="(FFFFFF|r,g,b)" [FONT="font-name|(size;rotation angle)"] [START="x,y"] | ARC="cx,cy,w,h,start,end" [THICKNESS="pixels"] ( COLOR="(FFFFFF|r,g,b)" | FILLCOLOR="(FFFFFF|r,g,b)" | STYLE="color1;color2;..." ) | LINE="x1,y1,x2,y2" [THICKNESS="pixels"] ( COLOR="(FFFFFF|r,g,b)" | FILLCOLOR="(FFFFFF|r,g,b)" | STYLE="color1;color2;..." ) | ) /> Acción: Permite dibujar elementos geometricos sobre la imagen. Ejemplo: Manual de eBDML 48 3. INSTRUCCIONES EBDML <eBD:IMGDRAW IMG="imgvar" LINE="0,0,10,10" COLOR="$color" THICKNESS="$t"/> Dibuja una linea desde 0,0 hasta 10,10, de "$t" pixels de anchura. <eBD:IMGDRAW IMG="imgvar" RECT="0,0,100,100" COLOR="$color" STYLE="$color1,$color2" /> Dibuja un rectangulo desde 0,0 hasta 100,100, alternando los pixels entre 2 colores. <eBD:IMGDRAW IMG="imgvar" FILL="x,y" COLOR="$index" /> Rellena el area de la imagen que contenga el mismo color de forma contigua, empezando por las coordenadas 50,50 con el color $index. <eBD:IMGDRAW IMG="imgvar" STRING="Hello" START="20,20" COLOR="$c" FONT="MEDIUM" /> Escribe el string "texto" en las coordenadas 20,20. El parámetro font indica el tamaño del texto pudiendo ser uno de los siguientes valores: GIANT, LARGE, MEDIUM, SMALL, TINY. Se pueden utilizar tipografias de tipo TrueType para introducir texto en la imagen, añadiendo el archivo de la tipografia dentro del directorio /userdata/resources/fonts/ Y especificando en el parámetro font la cadena: archivo.ttf;tamaño(ppp);ángulo de rotacion(grados) por ejemplo: FONT="arial.ttf;20;5" 3.9.5. eBD:IMGTRANSFORM Sintaxis: <eBD:IMGTRANSFORM IMG="image_var" ( ROTATE="degrees" | CLIP="x1,y1,x2,y2" | SCALE="width,height" [ASPECTRATIO="(1|0)"] | FLIP="(H|V)" ) /> Acción: Permite realizar diferentes transformaciones sobre la imagen. Ejemplo: <eBD:IMGTRANSFORM IMG="imgvar" FLIP="H" /> Voltea la imagen horizontalmente. <eBD:IMGTRANSFORM IMG="imgvar" ROTATE="90" /> Hace una rotación de la imagen de 90 grados en el sentido horario. <eBD:IMGTRANSFORM IMG="imgvar" SCALE="100,*" ASPECTRATIO="1" /> Escala la imagen a 100 pixels de anchura, manteniendo la relacion de aspecto. Los parámetros width y height se pueden indicar en pixels o en porcentage, usando el carácter % al final. Por ejemplo: SCALE="50%,*" <eBD:IMGTRANSFORM IMG="imgvar" CLIP="10,10,50,50" /> Recorta el trozo de la imagen indicado por el parámetro CLIP (desde 10,10 hasta 50,50). Manual de eBDML 49 3. INSTRUCCIONES EBDML 3.9.6. eBD:IMGCOPY Sintaxis: <eBD:IMGCOPY SRC="image_var" FROM="x,y,width,height" DST="image_var" TO="x,y(,width,height)?" [ROTATE="degrees"]/> Acción: Copia un trozo de una imagen sobre otra, permitiendo realizar una transformación de escalado o rotación al mismo tiempo. Ejemplo: <eBD:IMGCOPY SRC="imgvar" FROM="0,0,100,100" DST="imgvar2" TO="0,0" /> Copia el trozo de la imagen imgvar entre 0,0 y 100,100 sobre la imagen imgvar2 (en las coordenadas 0,0). 3.9.7. eBD:IMGFILTER Sintaxis: <eBD:IMGFILTER IMG="src_image_var" (PIXELIZE="tgt_image_var" | OILIFY="tgt_image_var" (SEED="seed") | CHANNEL="1" [GREEN="tgt_image"] [BLUE="tgt_image"] [RED="tgt_image"] | POSTERIZE="tgt_image_var" | SOLARIZE="tgt_image_var" (SEED="seed") | ERASELINE="tgt_image_var" [THICKNESS="linewidth"] [COLOR="(colorname|XXXXXX|r,g,b)"] [ORIENTATION="H|V"] | GREYSCALE="tgt_image_var" | SWIRL="tgt_image_var" | SHARPEN="tgt_image_var" | BLUR="tgt_image_var" | INVERT="tgt_image_var" | EDGE="tgt_image_var" | GAUSSIAN="tgt_image_var" | TWIRL="tgt_image_var" | RIPPLE="tgt_image_var" | FLOYD="tgt_image_var" | LEVEL="tgt_image_var" (LIMIT="level") | ROTATE="tgt_image_var" | EMBOSS="tgt_image_var") /> Acción: Permite aplicar distintos efectos sobre la imagen. Ejemplo: Manual de eBDML 50 3. INSTRUCCIONES EBDML <eBD:IMGFILTER BLUE="imgvar"/> Aplica un efecto de desenfocado sobre la imagen imgvar. <eBD:IMGFILTER SOLARIZE="imgvar" SEED="128"/> Aplica un efecto de solarizado sobre la imagen imgvar. 3.9.8. eBD:IMGGRAPH Sintaxis: <eBD:IMGGRAPH IMG="varname" TYPE="(lines|bars|hbars|points|linespoints|area|mixed|pie)" WIDTH="width" HEIGHT="height" [TRANSPARENT="(0|1)"] [EXTENDED="hash_varname"]> <eBD:IMGGRAPHDS [DSTYPE="(lines|bars|hbars|points|linespoints|area)"] DATASET="array_varname"/> + </eBD:IMGGRAPH> Acción: Permite generar varios tipos de gráficas usando los DataSets proporcionados por las instrucciones eBD:IMGGRAPHDS. El parámetro EXTENDED permite definir varios parámetros extendidos mediante un HASH. Los posibles parámetros a usar dependen del tipo de gráfica que se va a generar. parámetros para cualquier gráfica: width, height t_margin, b_margin, l_margin, r_margin dimensiones de la grafica a dibujar. margenes laterales que se deben dejar. (top,bottom,left y right) interlaced indica si la imagen generada sera entrelazada o no (default: 1) parámetros sobre colores: bgclr fgclr boxclr accentclr shadowclr color color color color color de de de de de fondo de la grafica los ejes y la regilla relleno de la caja definida por los ejes resaltado en las graficas "bar","area" y "pie" la sombra en las graficas "bar" shadow_depth anchura de la sombra. Puede ser positiva => sombra derecha/inferior, o negativa => sombre izquierda/superior labelclr axislabelclr legendclr valuesclr textclr Manual de eBDML color color color color color usado usado usado usado usado para para para para para las etiquetas de los ejes los valores de los ejes la leyenda los valores cualquier otro texto 51 3. INSTRUCCIONES EBDML dclrs colores usados para los dataset. Este parámetro debe ser una referencia a un array de colores, que indicaran los colores para cada dataset segun su posicion. borderclrs colores para los borsers de los dataset en graficas "bar". Sigue la misma estructura que dclrs. cycle_clrs Indica si la secuencia de colores especificada por dclrs se usa por dataset o por valor. parámetros para gráficas con ejes: x_label y_label Etiqueta para el eje X Etiqueta para el eje Y long_ticks Las marcas de los ejes deben tener la misma longitud que los ejes tick_length Longitud de las marcas de los ejes (si long_ticks es 0) Se pueden especificar independientemente para el eje x o y, usando x_long_ticks, y_long_ticks, x_tick_length y y_tick_length. x_ticks Indica si se deben dibujar las marcas del eje X y_tick_number Numero de marcas que se deben dibujar en el eje Y x_label_position Posicion de la etiqueta X definida con un valor entre 0 y 1. (0 => alineada a la izquierda, 1 => alineada a la derecha) y_label_position Posicion de la etiqueta X definida con un valor entre 0 y 1. (0 => alineada abajo, 1 => alineada arriba) x_labels_vertical Indica si las etiquetas del eje X deben escribirse verticalmente x_plot_values y_plot_values Indica si se deben dibujar los valores de las marcas del eje X Indica si se deben dibujar los valores de las marcas del eje Y box_axis no_axes Indica si se deben dibujar los ejes como una caja Desactiva el dibujado de los ejes zero_axis zero_axis_only Indica si se debe dibujar el eje 0. Solo se debe dibujar el eje 0 (no se mostrará el eje X habitual) y_max_value y_min_value Valor maximo a mostrar en el eje Y Valor minimo a mostrar en el eje Y axis_space text_space Espacio entre el eje y las etiquetas de las marcas de los ejes. Espacio entre los textos (titulo y etiquetas) y la grafica cumulate overwrite Dibuja las graficas acumulando los valores de los DataSet. Dibuja las graficas superponiendo los valores de los DataSet. show_values Muestra los valores de cada punto de la grafica Manual de eBDML 52 3. INSTRUCCIONES EBDML values_vertical values_space Muestra los valores de cada punto verticalmente Espacio entre los valores y el punto en la grafica parámetros para gráficas de barras: bar_width bar_spacing Anchura de la barra en pixels. Espacio entre barras parámetros para gráficas de lineas: line_types Tipo de lineas. Debe ser un array de numeros, (uno para cada DataSet), donde el valor indica el tipo de linea 1 => solida 2 => guiones 3 => puntos 4 => punto/guion line_type_scale Longitud de los guiones en los tipos de linea 3 y 4 line_width Anchura en pixels de la linea skip_undef Creara un salto en la linea si se encuentra un valor no definido parámetros para gráficas de puntos: markers Tipo de puntos. Debe ser un array de numeros, (uno para cada DataSet), donde el valor indica el tipo de punto: 1 => cuadrado relleno, 2 => cuadrado abierto 3 => cruz horizontal, 4 => cruz diagonal, 5 => rombo relleno, 6 => rombo abierto, 7 => circulo relleno, 8 => circulo abierto, 9 => linea horizontal, 10 => linea vertical marker_size Tamaño del punto en pixels parámetros para tartas: 3d pie_height start_angle suppress_angle label Manual de eBDML Indica si se debe dibujar la tarta en 3d Altura de la tarta en pixels Angulo de inicio por el que se debe empezar a rellenar la tarta. Angulo minimo para que un valor se represente en la tarta Etiqueta a escribir bajo la tarta 53 3. INSTRUCCIONES EBDML Ejemplo: <eBD:VAR <eBD:SET <eBD:SET <eBD:SET NAME="options" TYPE="HASH"/> VAR="options" INDEX="x_label" VALUE="Posiciones"/> VAR="options" INDEX="y_label" VALUE="Valores"/> VAR="options" INDEX="title" VALUE="Titulo"/> <eBD:IMGGRAPH IMG="imagen" TYPE="bars" WIDTH="300" HEIGHT="400" EXTENDED="$options"> <eBD:IMGGRAPHDS DATASET="$datos"/> </eBD:IMGGRAPH> 3.9.9. eBD:IMGSAVE Sintaxis: <eBD:IMGSAVE IMG="imgvar" TMPFILE="file" FORMAT="jpg|png|gif" [NAME="filename"] [QUALITY="png:9-1,jpeg:1-100"] /> Acción: Guarda la imagen en el fichero temporal, usando el formato indicado. Ejemplo: <eBD:IMGSAVE IMG="imgvar" TMPFILE="file" FORMAT="jpg" JPEGQUALITY="80" /> Manual de eBDML 54 3. INSTRUCCIONES EBDML 3.10. Acceso a buzones IMAP 3.10.1. eBD:IMAP Sintaxis: <eBD:IMAP SERVER="server_address" [PORT="143"] USERNAME="username" PASSWORD="password" VAR="varname"/> Acción: Conecta con un servidor IMAP y almacena la conexión en la variable varname Ejemplo: <eBD:IMAP SERVER="$my_server_ip" USERNAME="$user" PASSWORD="$pwd" VAR="imap"/> 3.10.2. eBD:IMAP_COPY Sintaxis: <eBD:IMAP_COPY IMAP="varname" ID="message_id" FROM="INBOX.folder.name" TO="INBOX.folder.other.name"/> Acción: Copia un mensaje de un mailbox (o carpeta) a otro Ejemplo: <eBD:IMAP_COPY IMAP="$imap" ID="$id" FROM="INBOX" TO="INBOX.folder"/> 3.10.3. eBD:IMAP_CREATE Sintaxis: <eBD:IMAP_CREATE IMAP="varname" MAILBOX="INBOX.folder.name" /> Acción: Crea una nueva carpeta o mailbox Ejemplo: <eBD:IMAP_CREATE IMAP="$imap" MAILBOX="INBOX.other" /> 3.10.4. eBD:IMAP_DELETE Sintaxis: <eBD:IMAP_DELETE IMAP="varname" MAILBOX="INBOX.folder.name" [ ID="message_id" ] /> Acción: Borra todo un mailbox (o carpeta) o sólo un mensaje de esa carpeta (si se indica el parámetro ID). Ejemplo: Manual de eBDML 55 3. INSTRUCCIONES EBDML <eBD:IMAP_DELETE IMAP="$imap" MAILBOX="INBOX.folder" ID="$message_id"/> 3.10.5. eBD:IMAP_GET Sintaxis: <eBD:IMAP_GET IMAP="varname" MAILBOX="INBOX.folder.name" [ SEARCH="search_hash" ] [ ID="message_id" ] [ STRINGIFY="1|0" ] VAR="[string|list|hash]"/> Acción: Obtiene la lista de mensages de un mailbox, o descarga el mensaje de ese mailbox identificado con el parámetro ID. El parámetro STRINGIFY indica si el mensaje debe descargarse como una estructura de datos (HASH) o como un string (código fuente del mensaje). El parámetro SEARCH permite realizar búsquedas en el FROM, TO o SUBJECT de los mensajes, si no se especifica por defecto su valor será 'All'. Ejemplo: <eBD:IMAP_GET IMAP="$imap" MAILBOX="INBOX" VAR="headers"/> <eBD:IMAP_GET IMAP="$imap" MAILBOX="INBOX" ID="$message_id" VAR="msg_content"/> <eBD:SET VAR="search" INDEX="from" VALUE="ebdsoft.com"/> <eBD:SET VAR="search" INDEX="to" VALUE="cjuan"/> <eBD:SET VAR="search" INDEX="subject" VALUE="this is a message"/> <eBD:IMAP_GET IMAP="$imap" MAILBOX="INBOX" SEARCH="$search" VAR="messages"/> 3.10.6. eBD:IMAP_MAILBOXES Sintaxis: <eBD:IMAP_MAILBOXES IMAP="varname" [ MAILBOX="INBOX.folder" ] VAR="arrayname"/> Acción: Devuelve el arbol de mailboxes o carpetas de la raiz, o solo las subcarpetas de una carpeta concreta (si se identifica con el parámetro MAILBOX). Ejemplo: <eBD:IMAP_MAILBOXES IMAP="$imap" VAR="foldertree"/> <eBD:IMAP_MAILBOXES IMAP="$imap" MAILBOX="INBOX.folder" VAR="subfolders"/> Manual de eBDML 56 3. INSTRUCCIONES EBDML 3.10.7. eBD:IMAP_RENAME Sintaxis: <eBD:IMAP_RENAME IMAP="varname" MAILBOX="INBOX.folder.name" TO="INBOX.folder.other"/> Acción: Renombra un mailbox o carpeta Ejemplo: <eBD:IMAP_RENAME IMAP="$imap" MAILBOX="INBOX.folder.name" TO="INBOX.folder.other"/> 3.10.8. eBD:IMAP_LOGOUT Sintaxis: <eBD:IMAP_LOGOUT IMAP="varname"/> Acción: Cierra la conexión con el servidor IMAP. Ejemplo: <eBD:IMAP_LOGOUT IMAP="$imap"/> 3.10.9. eBD:IMAP_FLAGS Sintaxis: <eBD:IMAP_FLAGS IMAP="varname" MAILBOX="INBOX.folder.name" ID="message_id" ADD="\Seen|\Draft|\Answered|\Flagged|\Deleted|\Recent|my_label_1" REMOVE="\Seen|\Draft|\Answered|\Flagged|\Deleted|\Recent|my_label_1"/> Acción: Modifica el estatus de los flags de los mensajes. Pueden ser flags definidos por el usuario o del sistema (que empiezan por una barra invertida), estos puedes ser: \Seen \Answered \Flagged \Deleted \Draft \Recent Ejemplo: <eBD:IMAP_FLAGS IMAP="$imap" MAILBOX="INBOX" ID="$message_id" ADD="\Seen,my_label_1" REMOVE="\Answered,my_label_2"/> Manual de eBDML 57 3. INSTRUCCIONES EBDML 3.10.10. eBD:IMAP_STATUS Sintaxis: <eBD:IMAP_STATUS IMAP="varname" MAILBOX="INBOX.folder.name" VAR="hashname"/> Acción: Devuelve el número total de emails en la carpeta y el número de emails no leidos. Ejemplo: <eBD:IMAP_STATUS IMAP="$imap" MAILBOX="INBOX" VAR="num_of_messages"/> Manual de eBDML 58 3. INSTRUCCIONES EBDML 3.11. Varios 3.11.1. eBD:LOGIN Sintaxis: <eBD:LOGIN USERNAME="usuario" PASSWORD="password"/> Acción: Hace login en eBD con el usuario (USERNAME). Ejemplo: <eBD:LOGIN USERNAME="$username" PASSWORD="$pass"/> 3.11.2. eBD:FORCELOGIN Sintaxis: <eBD:FORCELOGIN USERNAME="usuario" [TYPE="EBD|REMOTE"] /> Acción: Hace login sin necesidad de password en eBD con el usuario (USERNAME). Sino especificamos el type sera en cualquiera de ellos. Se puede utilizar FORCELOGIN sobre usuarios administradores, siempre y cuando estubiera logado anteriormente dentro de la misma request. Ejemplo: <eBD:FORCELOGIN USERNAME="anonimo" TYPE="EBD"/> 3.11.3. eBD:LOGOUT Sintaxis: <eBD:LOGOUT/> Acción: Hace logout en eBD y deja la sesión logueada como usuario Anónimo. No se pierden los atributos de la sesión tras un logout (no se cierra la sesión), tan solo se cambia el atributo de usuario, manteniendo el resto de atributos como la zona o variables globales. 3.11.4. eBD:INFOUSER Sintaxis: <eBD:INFOUSER [INFOHASH="varname"] [GROUPSARRAY="varname"] [GROUPSHASH="varname"]/> Acción: Sirve para conseguir información sobre el usuario. Si tenemos INFOHASH obtendremos información personal sobre el usuario en una variable llamada "varname" de tipo HASH. Si utilizamos la opción GROUPSARRAY, obtendremos un array con todos los grupos de usuarios a los que pertenece el usuario. Si por el contrario, usamos GROUPSHASH dispondremos de un hash en cuyas claves tendremos todos los grupos del usuario con valor '1'. Dentro del infohash tendremos: Manual de eBDML 59 3. INSTRUCCIONES EBDML address dirección region region phone telefono city ciudad name nombre completo cp codigo postal email email username nombre de usuario admin indica si es administrador de proyecto o no Ejemplo: <eBD:INFOUSER INFOHASH="datos"/> <eBD:OUT VALUE="@datos{address}"/> 3.11.5. eBD:INFOFILE Sintaxis: <eBD:INFOFILE FILE="file" HASH="varname" [TYPE="type" METATAGS="1|S|Y"]/> Acción: Nos crea un hash con la siguiente información de un fichero: ext extensión del fichero full_path path completo al fichero size tamaño del fichero en bytes. metatags en caso de poner los metatgs crea un hash con todos los metatags del fichero. Si el campo es una imagen y se especifica el parámetro TYPE="IMAGE", se obtienen tambien los campos: width anchura en caso de ser una imagen height altura en caso de ser una imagen Si el campo es un pdf, también se guardara la información del documento en los siguientes campos: ModDate, PDF version, Page size, Pages, Creator, Encrypted, Title, File size, CreationDate, Producer, Optimized, Tagged. Ejemplo: Manual de eBDML 60 3. INSTRUCCIONES EBDML <eBD:INFOFILE FILE="/files/1-149-pdffile/triptic.pdf" HASH="datos" TYPE="PDF"/> 3.11.6. eBD:FILEPATH Sintaxis: < eBD:FILEPATH [VAR="varname"] [TABLEID="value"|TABLE="tablaname"] ROW="value" FIELDNAME="value" [DOWN Acción: Monta la url para cualquier fichero de cualquier tabla. En el ROW deberemos poner el nombre de la fila del fetchrow, o la referéncia a un HASH. Ejemplo: <eBD:FILEPATH VAR="path" TABLEID="49" ROW="test" FIELDNAME="userfile"/> <eBD:OUT VALUE="@datos{Pages} - @datos{size}"/> 3.11.7. eBD:DAVPATH Sintaxis: < eBD:DAVPATH [VAR="varname"] WEBDAV="webdav_folder" FOLDERID="value" /> Acción: Calcula la url correspondiente a la carpeta identificada por FOLDERID, según la estructura definida en la carpeta WebDAV (WEBDAV). Ejemplo: <eBD:DAVPATH VAR="url" WEBDAV="/services/dav" FOLDERID="1"/> 3.11.8. eBD:WARN Sintaxis: <eBD:WARN VALUE="valor" /> Acción: Muestra en el archivo de trazas de eBD y en el DEBUGER el valor especificado. Es exactamente igual a la función eBD:OUT con la diferencia de que la salida no se produce a un documento HTML sino al archivo de trazas y DEBUGER. Ejemplo: <eBD:WARN VALUE="valor de test:$test"/> Manual de eBDML 61 3. INSTRUCCIONES EBDML 3.11.9. eBD:BR Sintaxis: <eBD:BR/> Acción: Instrucción utilizada dentro de <eBD:CODE>. Fuerza a dar un salto de línea en el resultado. Ejemplo: <eBD:BR/> 3.11.10. eBD:EVAL Sintaxis: <eBD:EVAL [VAR="varname" | GLOBAL="varname" | TEMPORAL="varname"]/> Acción: Evalúa el contenido de la variable, es decir, si la variable vale '#param1' al hacer EVAL, ésta tomará el valor del parámetro 1. Ejemplo: <eBD:SET VAR="test" VALUE="#param$num"/> <eBD:EVAL VAR="test"/> 3.11.11. eBD:CODE Sintaxis: <eBD:code> Código eBDML </eBD:CODE> Acción: El código que incluyamos entre los dos TAGS no generará HTML. Es especialmente útil cuando utilizamos archivos dinámicos para evitar tener saltos de líneas. Si no utilizamos eBDCODE, cada tag eBDML se convierte en un salto de línea en HTML. Ejemplo: <eBD:CODE> <eBD:OUT VALUE="este texo sale"/><eBD:BR/> Esto no saldrá.<br>Porque no esta en el un eBD:OUT </eBD:CODE> Manual de eBDML 62 3. INSTRUCCIONES EBDML 3.11.12. eBD:DOC Sintaxis: <eBD:DOC > código eBDML y HTML </eBD:DOC > Acción: Comenta las líneas entre el tag eBD:DOC. No se evaluará el contenido dentro del tag. Ejemplo: <eBD:DOC> .... </eBD:DOC> Manual de eBDML 63 4. CONSIDERACIONES GENERALES 4. Consideraciones Generales 4.1. Tipos de variables • Para hacer referencia a las variables locales se debe usar '$', para acceder a variables temporales '%$' y para acceder a variables globales '%' Código eBDML Resultado <eBD:VAR NAME="var1" DEFAULT="hello world!"/> local: <eBD:OUT VALUE="$var1"/> <br> local: hello world! temporal: hello temp! global: hello global! <eBD:SET VAR="temp" VALUE="hello temp!"/> temporal: <eBD:OUT value="%$temp"/> <br> <eBD:SET VAR="glob" VALUE="hello global!"/> global: <eBD:OUT value="%glob"/> • Para obtener el número de elementos de un ARRAY se debe usar '@. Código eBDML Resultado <eBD:VAR NAME="lista" TYPE="ARRAY"/> <eBD:SET VAR="lista" INDEX="0" VALUE="valor0"/> <eBD:SET VAR="lista" INDEX="1" VALUE="valor1"/> Núm elementos: 2 Num elementos: <eBD:OUT VALUE="@lista"/> • Para hacer referencia a los elementos de un ARRAY o un HASH usaremos '@ combinado con [] para ARRAY y {} para HASH. Entre [] puede ir un valor o una variable. Código eBDML Resultado <eBD:VAR NAME="lista" TYPE="ARRAY"/> <eBD:SET VAR="lista" INDEX="0" VALUE="valor0"/> <eBD:SET VAR="lista" INDEX="1" VALUE="valor1"/> pos0: valor0 pos1: valor1 pos0: <eBD:OUT VALUE="@lista[0]"/> <br> <eBD:SET VAR="k" VALUE="1"/> pos1: <eBD:OUT VALUE="@lista[$k]"/> • Para obtener el valor de un atributo de un registro recuperado con un FETCHROW tenemos que usar &[registro].[atributo] Manual de eBDML 64 4. CONSIDERACIONES GENERALES Código eBDML Resultado <eBD:QUERY NAME="puntero" DATASOURCE="principal"> QUERY SQL </eBD:QUERY> NOMBRE = (nombre) <eBD:FETCHROW NAME="registro" QUERY="puntero"/> NOMBRE= <eBD:OUT value="&registro.nombre"/> NOTA: Usando '& delante del nombre de una query ejecutada con <eBD:QUERY nos devolverá el número de registros que ha devuelto esa query. Manual de eBDML 65 4. CONSIDERACIONES GENERALES 4.2. Expresiones • Los operadores disponibles en las expresiones son: Operadores matematicos + suma - resta * multiplicación / división % módulo ** potencia == igual < menor <= menor o igual != diferente > mayor >= mayor o igual =~ match !~ not match Comparadores Comparadores sobre strings eq igual lt menor le menor o igual ne diferente gt mayor ge mayor o igual << shift left >> shift right ~ bitwise not & bitwise and | bitwise or ^ bitwise xor || or ! not Operadores binarios Operadores booleanos && and • Expresiones para obtener valores de campos: Si estamos programando una plantilla de una seccion tabla, podemos usar &Tabla.campo para mostrar un campo de la seccion. Esta expresión mostrara el campo con todos los tags adicionales de estilo, enlaces, etc... Si deseamos obtener únicamente el valor del campo, podemos usar &Tabla.campo:value. Para mostrar la etiqueta de un campo, tal y como esta definida en "Campos a mostrar", podemos usar &Tabla.campo:label. En el caso de un campo basado en ficheros (Imagen, Fichero, Audio, Video...), para obtener la url absoluta del fichero almacenado podemos usar &Tabla.campo:filepath. Manual de eBDML 66 4. CONSIDERACIONES GENERALES • Se pueden usar expresiones regulares. Código eBDML Resultado <eBD:SET VAR="dia" VALUE="28/12/2001" /> <eBD:VAR NAME="expr" DEFAULT="(\d+)/(\d+)/(\d+)"/> La fecha es: Dia: 28 Mes: 12 <eBD:IF EXPR=" '$dia =~ '$expr"> La fecha es: <br> Dia: <eBD:OUT VALUE="$1"/> <br> Mes: <eBD:OUT VALUE="$2"/> <br> Año: <eBD:OUT VALUE="$3"/> <eBD:ELSE> NO ES UNA FECHA </eBD:ELSE> </eBD:IF> Año: 2001 • Se puede usar \ para escapar aquellos caracteres especiales que no queremos que se interpreten Código eBDML Resultado <eBD:SET VAR="var1" VALUE="test"/> value: <eBD:OUT VALUE="$var1"/> <br> value: test escaped: $var1 espaced: <eBD:OUT VALUE="\$var1"/> • Podemos usar { y } para delimitar el nombre de una variable que queremos interpolar entre caracteres estáticos. Código eBDML Resultado <eBD:SET VAR="var1" VALUE="test"/> value: <eBD:OUT VALUE="${var1}_demo"/> value: test_demo Manual de eBDML 67 4. CONSIDERACIONES GENERALES 4.3. Referencias y estructuras de datos • Podemos recuperar un HASH con todos los argumentos que hemos recibido en la página usando la variable global %_ARGS Código eBDML Resultado <eBD:SET VAR="args" VALUE="%_ARGS"/> <eBD:KEYS HASH="args" ARRAY="claves"/> <eBD:FOREACH ARRAY="claves" ITERATOR="k"> Valor de <eBD:OUT VALUE="$k"/> es <eBD:OUT VALUE="@args{$k}"/> <br> </eBD:FOREACH> • Se pueden crear referencias a variables de tipo complejo (ARRAY,HASH) usando $ en vez de @ Código eBDML Resultado <eBD:VAR NAME="lista" TYPE="ARRAY" /> <eBD:PUSH ARRAY="lista" VALUE="valor1"/> <eBD:PUSH ARRAY="lista" VALUE="valor2"/> valor1 valor2 <eBD:SET VAR="referencia" VALUE="$lista"/> <eBD:FOREACH ARRAY="referencia"> <eBD:OUT VALUE="$iterator"/><br> </eBD:FOREACH> • Una función puede devolver una referencia a una variable de tipo complejo. Código eBDML Resultado <!—codigo de la función get_listado --> <eBD:VAR NAME="lista" TYPE="ARRAY" /> <eBD:PUSH ARRAY="lista" VALUE="valor1"/> valor1 valor2 <eBD:PUSH ARRAY="lista" VALUE="valor2"/> <eBD:RETURN VALUE="$lista"/> <!-- codigo externo --> <eBD:CALL FUNCTION="get_listado" VAR="referencia" /> <eBD:FOREACH ARRAY="referencia"> <eBD:OUT VALUE="$iterator"/><br> </eBD:FOREACH> Manual de eBDML 68 4. CONSIDERACIONES GENERALES • El valor de un elemento de un ARRAY o un HASH puede ser una referencia a otra variable de tipo ARRAY o HASH. Código eBDML Resultado <eBD:VAR NAME="lista" TYPE="ARRAY" /> <eBD:PUSH ARRAY="lista" VALUE="valor1"/> <eBD:PUSH ARRAY="lista" VALUE="valor2"/> valor1 valor2 <eBD:VAR NAME="otra" TYPE="ARRAY"/> <eBD:SET VAR="otra" INDEX="0" VALUE="$lista"/> <eBD:SET VAR="copia" VALUE="@otra[0]"/> <eBD:FOREACH ARRAY="copia"> <eBD:OUT VALUE="$iterator"/><br> </eBD:FOREACH> Manual de eBDML 69 4. CONSIDERACIONES GENERALES 4.4. Varios • Utilización del HTTPGET y el XMLPARSER. Código eBDML Resultado <eBD:HTTPGET VAR="xml" URL="..../download/eventos.txt"/> <eBD:XMLPARSE VAR="arbol" VALUE="$xml"/> Eventos: 2005-06-21 - Presentación 2005-06-29 - Formación <p> 2005-06-21 - Reunión <div style="font:11px Verdana,Arial,Helvetica,sans-serif;"> Eventos: <eBD:IF EXPR="'$arbol' =~ 'HASH'"> <eBD:SET VAR="eventos" VALUE="@arbol{hijos}"/> <eBD:OUT VALUE="hijos: $eventos"/> <eBD:FOREACH ARRAY="eventos" ITERATOR="nodo"> <eBD:IF EXPR="'$nodo' =~ 'HASH'"> <eBD:SET VAR="attrs" VALUE="@nodo{atributos}"/> <eBD:SET VAR="nombre" VALUE="@nodo{datos}"/> <eBD:REPLACE VAR="nombre" MATCH="\n" REPLACE=" "/> <eBD:OUT VALUE="@attrs{fecha}"/> - <eBD:OUT VALUE="$nombre"/> </eBD:IF> </eBD:FOREACH> </eBD:IF> • Utilización de TMPFILE para insertar o modificar un registro. Código eBDML Resultado <eBD:ARGS NAME="send" DEFAULT="0"/> - Inicialmente veremos un formulario, con un input tipo file. <eBD:IF EXPR="'$send' == '0'"> <form action="" method="post" ENCTYPE="multipart/form-data"> <input type="file" name="img"> <input type="submit" name="send" value="send"> </form> <eBD:ELSE> <eBD:TMPFILE SOURCE="img" VAR="curriculum"/> <eBD:UPDATE TABLE="t_images" idfield="imageid" idvalue="17"> <eBD:DATAFIELD FIELD="img" VALUE="$curriculum"/> </eBD:UPDATE> El fichero se actualizó correctamente </eBD:ELSE> </eBD:IF> Manual de eBDML - Al hacer el submir, se guardará el fichero y se mostrará el mensaje. 70 4. CONSIDERACIONES GENERALES • Utilización de TMPFILE para enviar un mail. Código eBDML Resultado <eBD:ARGS NAME="send" DEFAULT="0"/> - Inicialmente veremos un formulario, con un input tipo file. <eBD:IF EXPR="'$send' == '0'"> <form action="" method="post" ENCTYPE="multipart/form-data"> <input type="file" name="img"> <input type="submit" name="send" value="send"> </form> <eBD:ELSE> - Al hacer el submir, se enviará el mail y se mostrará el mensaje. <eBD:TMPFILE SOURCE="img" VAR="curriculum"/> <eBD:SENDMAIL FROM="me@my_domain.com" TO="me@my_domain.com" SUBJECT="test"> <eBD:ATTACH FILE="curriculum"/> <eBD:BODY> message content </eBD:BODY> </eBD:SENDMAIL> Mail enviado correctamnte </eBD:ELSE> </eBD:IF> • Creación de una imagen a través de un archivo dinámico. Código eBDML Resultado <eBD:CODE> <eBD:IMGCREATE VAR="imgvar" WIDTH="100" HEIGHT="30"/> <eBD:IMGDRAW IMG="imgvar" RECT="0,0,50,20" COLOR="00FFF0"/> <eBD:IMGDRAW IMG="imgvar" STRING="My Image" START="18,7" COLOR="000000" FONT="MEDIUM"/> <eBD:IMGSAVE IMG="imgvar" FORMAT="jpg"/> </eBD:CODE> Manual de eBDML 71 5. EJEMPLO 5. Ejemplo 5.1. Resumen de un pedido El siguiente código es una sección que muestra el resumen de un pedido: <eBD:QUERY NAME="query_carrito" DATASOURCE="principal"> SELECT * FROM carrito_procesados WHERE usuario = '#usuario' </eBD:QUERY> <eBD:IF EXPR="&query_carrito > 0"> <table border="0" cellpadding="0" cellspacing="0" width="590"> <tr> <td align="left" height="21" NOWRAP><span class="titulo">Confirmar pedido</span></td> <td width="99%" class="linia" align="left"><img src="void.gif" width="1" height="1" border="0" alt=""></td> </tr> </table> <table class="ter" width="100%" border="0"> <tr> <td class="labels">Unidades</td> <td class="labels">Referencia</td> <td class="labels">Producto</td> <td class="labels">Fabricante<td> <td class="precio">Precio</td> </tr> <eBD:FOREACH QUERY="query_carrito" START="0"> <eBD:FETCHROW NAME="item" QUERY="query_carrito"/> <tr>&nbsp;</tr> <tr> <td class="datos"><eBD:OUT VALUE="&item.cantidad"/></td> <td class="datos"><eBD:OUT VALUE="&item.referencia"/></td> <td class="datos" style="font-weight: bold"> <eBD:OUT VALUE="&item.articulo"/></td> <td class="datos" style="font-weight: bold"> <eBD:OUT VALUE="&item.fabricante"/></td> <td class="precio" style="font-weight: bold; color: gray"> <eBD:OUT VALUE="&item.precio"/>&nbsp;€</td> <eBD:SET VAR="total_prod" EXPR="&item.quantitat*&item.precio"/> <eBD:SET VAR="total" EXPR="$total+$total_prod"/> </tr> </eBD:FOREACH> <tr style="border-bottom: 1px solid blue"> <eBD:SET VAR="total_iva" EXPR="$total*1.16"/> <td class="cc" style="color: #209ddd; line-height: 12pt" colspan="6"> Subtotal<br/> Total con IVA </td> <td class="precio" style="line-height: 12pt"> Manual de eBDML 72 5. EJEMPLO <b><eBD:OUT VALUE="$total"/>&nbsp;€</b><br/> <b><eBD:OUT VALUE="$total_iva"/>&nbsp;€</b> </td> </tr> </table> En la parte superior podemos ver una consulta llamada query_carrito a la base de datos principal. En esta consulta seleccionamos aquellos registros de la tabla carrito_procesados cuyo campo usuario sea igual a #usuario (función interna de eBD que indica el usuario que se ha logueado). A continuación tenemos una instrucción if. Continuaremos ejecutando el código secuencialmente sólo si la consulta query_carrito devuelve algún registro. Después definimos una tabla (podemos usar estilos), en el primer <tr> tenemos los nombres de los campos. La siguiente instrucción es un FOREACH (equivalente a la instrucción FOR de C) sobre la consulta hecha anteriormente, el número de iteraciones es igual al número de registros devueltos por la consulta. Con FETCHROW damos un nombre (ítem) al registro obtenido, démonos cuenta que para cada iteración este valor será diferente. En las siguientes instrucciones listamos ciertos campos de la tabla carrito_procesados. Para obtener estos valores debemos utilizar la instrucción <eBD:OUT>, estos valores los colocaremos dentro de las celdas de la tabla. En la imagen superior tenemos el resultado del código. Esta tabla la hubiéramos podido hacer con una sección tipo tabla pero usando código eBDML tenemos la posibilidad de personalizarla mucho más. Manual de eBDML 73 ANEXOS. Anexos. Anexo A. Funciones Internas (#) eBD proporciona una serie de funciones internas que se pueden utilizar en filtros, valores por defecto, editor de expresiones, etc. Estas funciones dan acceso a un conjunto de funcionalidades o variables internas, y están agrupadas en objetos abstractos según las funcionalidades que proporcionan. La sintaxis para acceder a estos objetos es: #[Nombre.funcion(p1,p2)] o #[Nombre.atributo] Por ejemplo #[eBDUser.Username] Los objetos disponibles son: eBDUser Atributos: Username -> string Devuelve el usuario actual Name -> string Devuelve el nombre del usuario actual Email -> string Devuelve el email del usuario actual IsAdmin -> bool Devuelve S o N según sea o no administrador IsAnonymous -> bool Devuelve S o N según sea el usuario anónimo o no IsRemote -> bool Devuelve S o N dependiendo si se ha logado a través de un acceso remoto SessionId -> string Devuelve el string identificador de la sesión RemoteUserSource -> string Devuelve el nombre del Origen de Usuarios Remotos con el que se ha validado el usuario actual NTLMUser -> string Devuelve el nombre de usuario autenticado con NTLM NTLMDomain -> string Devuelve el dominio usado para autenticar con NTLM NTLMEnabled -> bool Es cierto si se ha autenticado el usuario con NTLM Rejected -> bool Es cierto si se ha intentado autenticar con NTLM pero el usuario ha sido rechazado Métodos in_group(name) -> bool Recibe como parámetro el nombre de un grupo y devuelve 1 ó 0 dependiendo si el usuario está o no en el grupo set_attribute(name,value) -> Permite asignar el valor a un atributo del usuario (definido por el desarrollador) get_attribute(name) -> string Devuelve el valor del atributo del usuario eBDServer Atributos InstanceName -> string Devuelve el nombre de la instancia de eBD InstancePath -> string Devuelve el path absoluto al "userdata" de la instancia actual. Métodos get_label(name) -> string Devuelve el valor de la etiqueta name configurada en el servidor (véase archivo ebd.xml en el manual del Administrador) Manual de eBDML 74 ANEXOS. eBDSession Atributos Id -> int Devuelve el identificador de la sesión Expired -> bool Indica si la sesión acaba de expirar o no ExpirationInterval -> int Permite obtener el tiempo de expiracion de la sesion (en segundos) Métodos get_temporal(name) -> string Devuelve el valor de una variable temporal set_temporal(name, string) -> int Modifica el valor de una variable temporal get_global(name) -> string Devuelve el valor de una variable global set_global(name, string) -> int Modifica el valor de una variable global eBDProject Atributos: Name -> string Devuelve el nombre del proyecto Id -> int Devuelve el identificador del proyecto IsPublic -> bool Devuelve S o N dependiendo de si el proyecto es público o no get_env -> string Permite acceder a las variables de entorno creadas en el proyecto. eBDRequest Atributos: Language -> string Devuelve el ‘iso_lang’ del navegador del usuario Url -> string Devuelve la URL actual sin el dominio, sólo carpetas y parámetros Referer -> string Devuelve la URL completa de la página anterior RequestMethod -> string Devuelve el método de la request actual RequestProtocol -> string Devuelve el protocolo de la request actual RemoteIp -> string Devuelve la IP del usuario RemoteHost -> string Devuelve el dominio del usuario, si el servidor reconoce la IP Https -> bool Indica si la request se ha ejecutado usando HTTPS o no WebDAV -> bool Indica si la request es de tipo WebDAV o no Host -> string Devuelve el dominio introducido por el usuario Port -> string Devuelve el puerto que se está usando para la conexión HTTP RemoteUser -> string Devuelve el usuario con el que se esta conectando UserAgent -> string Devuelve es UserAgent del usuario, ‘navegador’ ParamX -> string Devuelve el valor del parámetro X indicado Filename -> string Devuelve el nombre del fichero que solicita la request actual GeoIPCountry -> string Devuelve el nombre del país desde el que está conectando el usuario (según su IP de origen) GeoIPCountryCode -> string Devuelve el código ISO del país desde el que está conectando el usuario (según su IP de origen) Métodos: Manual de eBDML 75 ANEXOS. get_param(name) -> string Devuelve el valor del parámetro especificado get_params -> hash_of_string Devuelve un hash con todos los parámetros de la página get_header(name) -> string Devuelve el valor de la cabecera HTTP especificada get_headers -> hash_of_string Devuelve un hash con todas las cabeceras HTTP recibidas get_cookie(name) -> string Devuelve el valor de la cookie especificada get_cookies -> hash_of_string Devuelve un hash con todas las cookies recibidas get_ssl_var(name) -> string Devuelve el valor de la variable de entorno SSL especificada. Las variables disponibles son: HTTPS SSL_PROTOCOL SSL_CIPHER SSL_CLIENT_I_DN_O SSL_CLIENT_I_DN_OU SSL_CLIENT_S_DN_O SSL_CLIENT_S_DN_OU SSL_CLIENT_I_DN_CN SSL_CLIENT_I_DN SSL_CLIENT_S_DN_CN SSL_CLIENT_S_DN get_content ->string Devuelve el valor del contenido de la request http sin decodificar (raw data) set_arg(param_name,value) -> Modifica el valor del parámetro especificado set_param(param_name,value) -> Permite modificar el valor de un parámetro recibido en la request eBDResponse Métodos: header(name,value) -> int Modifica el valor de una cabecera HTTP status(int) -> int Modifica el valor de la respuesta HTTP (status code) type(value) -> int Modifica el valor del la cabecera “Content-Type” add_styles_text(text) -> int Añade el texto dentro del tag head add_style(url) -> int Añade ficheros CSS a la cabecera. add_script(url) -> int Añade un fichero javascript a la cabecera de la respuesta, controlando que no se repita. add_scripts_text(text) -> int Añade el texto dentro del tag head get_head_content() -> string Devuelve el contenido (tags de estilos y scripts) del head generado automáticamente al ejecutar secciones set_cookie(name,value,expires,path,domain) -> int Añade la cabecera "Set-Cookie" en la respuesta HTTP. Los parámetros "expires","path2 y "domain" son opcionales. Algunos ejemplos de posibles valores del parámetro "expires": • +30s (dentro de 30 segundos) • +10m (dentro de 10 minutos) • +1h (dentro de 1 hora) • -1d (hace 1 hora!) • now (inmediatamente) • +3M (dentro de 3 meses) Manual de eBDML 76 ANEXOS. • +10y (dentro de 10 años) • Thursday, 25-Apr-1999 00:40:33 GMT (a la fecha/hora indicada) Manual de eBDML 77 ANEXOS. eBDZone Atributos: Name -> string Devuelve el nombre de la zona actual Id -> int Devuelve el identificador de la zona actual IsInitial -> bool Devuelve S o N según la zona actual sea la inicial o no eBDPage Atributos: Name -> string Devuelve el nombre de la página actual Id -> int Devuelve el identificador de la página actual Title -> string Devuelve el título de la página actual eBDSection Atributos: Name -> string Devuelve el nombre de la sección actual Id -> id Devuelve el identificador de la sección actual Title -> string Devuelve el título de la sección actual CurrentRecord -> int Devuelve el número de registro que se esta tratando en ese momento TotalRecords -> int Devuelve el número total de registros de la sección ShowRecords -> int Devuelve el número de registros que se están mostrando de la sección UniqueID ->int Devuelve un identificador numérico único para la ejecución de la sección actual. Los widgets envían automáticamente este valor en la URL de sus eventos, por lo que al ejecutar esta función en un evento de widget recibiremos el mismo valor que tenía antes de la ejecución del código principal. eBDDate Atributos: CurrentYear -> int Devuelve el año actual CurrentMonth -> int Devuelve el mes actual CurrentDay -> int Devuelve el día actual CurrentDate -> string Devuelve la fecha actual en formato del locale actual CurrentTime -> string Devuelve la hora actual CurrentMilis ->string Devuelve la fecha Epoch en milisegundos. Métodos: date_add(string,int) -> string Suma en la fecha enviada el número de días especificado date_sub(string,string) -> int Devuelve la diferencia de días entre las dos fechas, si la primera fecha es antes en el tiempo será positivo, sino negativo y si son iguales un 0 week_number(string) -> int Devuelve el número de la semana de la fecha indicada day_of_week(string) -> int Devuelve el día de la semana de la fecha indicada monday_of_week(int,year) -> date Devuelve la fecha del lunes de la semana y año indicado date_format(date,driver) -> date formated Devuelve la fecha enviada en el formato del driver indicado Manual de eBDML 78 ANEXOS. date_to_epoch(data) -> integer Devuelve la fecha en formato epoch (número de segundos desde 1/1/1970) epoch_to_date(int) -> integer Devuelve la fecha en formato estándar a partir del epoch mask(date, src_mask, dst_mask, opt_src_mask, opt_dst_mask)-> Transforma una fecha entre dos formatos especificados (de src_mask a dst_mask). También tiene en cuenta partes de la máscara que pueden ser opcionales (opt_src_mask y opt_dst_mask) 25/06/2009 -> 2009-06-25 #[eBDDate.mask('25/06/2009','dd/mm/yyyy','yyyy-mm-dd')] 25/06/2009 12:34:52 -> 2009-06-25 12.34 #[eBDDate.mask('25/06/2009 12:34:52','dd/mm/yyyy','yyyy-mm-dd','hh:ii:ss',' hh.ii')] 25 06 2009 -> 25_06_09 #[eBDDate.mask('25 06 2009','dd mm yyyy','dd_mm_yy')] 20090625T141529Z -> 25-06-2009 14:15:29 #[eBDDate.mask('20090625T141529Z','yyyymmddThhiissZ','dd-mm-yyyy','ThhiissZ',' hh:ii:ss')] parse(string) -> string Parsea una fecha almacenada en un string y la devuelve formateada según la localización actual. Es capaz de reconocer los siguientes formatos: "Wed, 09 Feb 1994 22:23:32 GMT" "Thu Feb 3 17:03:55 GMT 1994" "Thu Feb 3 00:00:00 1994", "Tuesday, 08#Feb#94 14:15:29 GMT" "Tuesday, 08#Feb#1994 14:15:29 GMT" ## ## ## ## ## HTTP format ctime(3) format ANSI C asctime() format old rfc850 HTTP format broken rfc850 HTTP format "03/Feb/1994:17:03:55 #0700" "09 Feb 1994 22:23:32 GMT" "08#Feb#94 14:15:29 GMT" "08#Feb#1994 14:15:29 GMT" ## ## ## ## common logfile format HTTP format (no weekday) rfc850 format (no weekday) broken rfc850 format (no weekday) "1994#02#03 14:15:29 #0100" "1994#02#03 14:15:29" "1994#02#03" "1994#02#03T14:15:29" "19940203T141529Z" "19940203" ## ## ## ## ## ## ISO 8601 format zone is optional only date Use T as separator ISO 8601 compact format only date "08#Feb#94" "08#Feb#1994" "09 Feb 1994" "03/Feb/1994" ## ## ## ## "Feb "Feb ## Unix ’ls #l’ format ## Unix ’ls #l’ format 3 1994" 3 17:03" "11#15#96 old rfc850 HTTP format broken rfc850 HTTP format proposed new HTTP format common logfile format (no (no (no (no weekday, weekday, weekday, time, no no time) no time) no time) offset) 03:52PM" ## Windows ’dir’ format http_date(string) -> string Devuelve la fecha recibida (en segundos, epoch), convertida a formato estándard para HTTP Manual de eBDML 79 ANEXOS. eBDDB Atributos: CurrentId -> int Devuelve el identificador del registro que se está modificando / borrando LastInsertId -> int Devuelve el identificador de la última inserción LastUpdateId -> int Devuelve el identificador de la última actualización LastDeleteId -> int Devuelve el identificador de la última eliminación ErrCode -> int Devuelve el código de error generado ErrMsg -> string Devuelve el mensaje de error generado Métodos: abort(err_msg) -> string Aborta la ejecución de la inserción / modificación / eliminación, y muestra el mensaje de error especificado. Se debe usar en un evento antes de insertar en una Vista mediante eBD:SET last_insert(fieldname) -> string Devuelve el valor del campo especificado de la última inserción last_update(fieldname) -> string Devuelve el valor del campo especificado de la última actualización current(fieldname) -> string Devuelve el valor del campo especificado del registro que se está modificando / borrando set_new_value(fieldname,value) Permite modificar el valor que se guardará en un campo de la base de datos, si se ejecuta desde un evento de Vista o Tabla disparado antes de la inserción o modificación http_date(string) -> string Devuelve la fecha recibida (en segundos, epoch), convertida a formato estándard para HTTP xml_document(string) ->string Devuelve el nombre del fichero XML relativo a una Tabla XML, para poder ejecutar una consulta XQuery de forma manual eBDLocale Atributos: Name -> string Devuelve el nombre del locale actual Iso -> string Devuelve la ‘iso_lang’ del locale actual Id -> int Devuelve el identificador del locale actual Language -> string Devuelve el language del locale actual DateFormat -> string Devuelve el formato de fecha del locale actual Métodos: set(string | int) -> int Activa el locale especificado por el nombre o por el identificador literal(string) -> string Devuelve el valor del literal especificado get_locales -> array of hashes Devuelve una lista de las localizaciones, se puede accceder a los atributos:id,name,iso_lang,language,number_format y date_format get_literal_names(folder) -> array Devuelve la lista de claves de los literales disponibles. El parámetro 'folder' es opcional, si se indica el idCarpeta o el nombre de la carpeta devolverá los literales de esa carpeta; en caso de no enviarle ningún parámetro devuelve todos los literales. get_literal_value(literal,idLocalizacion) -> string Devuelve el valor de un literal para una localización determinada set_literal_value(literal,idLocalizacion,newLiteral) Modifica el valor de un literal para una localización determinada Manual de eBDML 80 ANEXOS. find_literal(string) -> array Busca un literal que contenga las palabras indicadas en el nombre o los valores eBDUtil eBDVersion -> string devuelve la versión actual de eBD ErrCode -> int devuelve el código de error del último error generado ErrMsg -> string devuelve el mensaje de error del último error generado ErrLine -> int devuelve el numero de linea del último error generado Métodos: random() -> int Devuelve un número aleatorio random(min,max) -> int Devuelve un número aleatorio entre min i max quote(string) -> string Escapa el contenido enviado trim(field,len,[concat]) -> string Acota a la longitud elegida el campo especificado y añade el ‘concat’ al final uc(string) -> string convierte el string a mayúsculas lc(string) -> string convierte el string a minúsculas ucfirst(string) -> string convierte la primera letra del string a mayúsculas lcfirst(string) -> string convierte la primera letra del string a minúsculas length(string) -> int devuelve la longitud de un string defined(string) -> bool devuelve true (1) si el string está definido substr(string,start,count)-> string develve un substring del string inicial, comenzando en la posición “start”, y seleccionando “count” caracteres is_eof -> bool devuelve true si se ha llegado al final de un fichero después de la última lectura chr(int) -> string Devuelve un carácter representado por el código ASCII o la secuencia de escape indicada (\n, \t,...) ord(string) -> int Devuelve el código ASCII del carácter indicado. eBDMath Métodos: int(number) -> int Devuelve la parte entera del número enviado abs(number) -> int Devuelve el valor absoluto del número enviado cos(number) -> float Devuelve el coseno del número enviado sin(number) -> float Devuelve el seno del número enviado tan(number) -> float Devuelve el valor de la tangente del ángulo especificado atan2(number) -> float Devuelve el resultado de la función arcotangente en el rango -PI .. PI exp(number) -> int Devuelve la inversa del logaritmo neperiano hex2dec(hex) -> int Recibe un hexadecimal y devuelve su valor decimal dec2hex(number) -> hex Recibe un decimal y devuelve su valor hexadecimal log(number) -> float Devuelve el logaritmo neperiano del número enviado oct2dec(oct) -> int Recibe un octal y devuelve su valor decimal dec2oct(number) -> oct Recibe un decimal y devuelve su valor octal sqrt(number) -> float Devuelve el resultado de la raíz cuadrada del número enviado Manual de eBDML 81 ANEXOS. round (number,decimals) -> float Devuelve el número enviado acotado al número de decimales especificado, redondeando +0.5 ceil(number) -> int Devuelve el entero más pequeño que sea más grande o igual al número enviado floor(number) -> int Devuelve el entero más grande que sea más pequeño o igual al número enviado eval(expr) -> number Evalúa la expresión matemática enviada eBDSecurity Función para proteger frente ataques XSRF. Métodos: xsrf_security_token() -> string Devuelve el valor del token XSRF. xsrf_security_input(input_name) -> string Devuelve el token dentro de un input oculto, se le puede pasar el nombre del input (por defecto: xsrf_security_token) check_xsrf_security(name) -> bool Devuelve 0 si el token es valido ó 1 si no lo és. Se le puede pasar el nombre del parámetro, que por defecto es xsrf_security_token. is_valid_arg(name) -> bool Devuelve 0 ó 1 dependiendo de si el argumento es válido o no. Para que valide el parámetro se debe de indicar el TYPE en eBD:ARGS is_valid_args() -> bool Devuelve 0 ó 1, según si todos los argumentos eBD:ARGS con algún TYPE son válidos o no. validate_value(value,type,null,[validos|mask,optional_mask,biggerthan,lowerthan]) -> bool Devuelve un boleano según si el valor es válido. Se debe pasar el valor, el tipo (string,bool,date,datetime,integer,word,enum), si puede ser nulo(boleano) y en caso de ser un enum la lista de valores validos (separado por comas o un puntero a un array). Ejemplo: <ebd:out value="#[eBDSecurity.validate_value('sadfkasdfkasdf asdf asdfad f',string)]"/> Return -> 1 <ebd:out value="#[eBDSecurity.validate_value('',string,1)]"/> Return -> 0 <ebd:out value="#[eBDSecurity.validate_value(0,bool)]"/> Return -> 1 <ebd:out value="#[eBDSecurity.validate_value(uno,enum,1,tres,dos,uno,zero)]"/> Return -> 1 <ebd:out value="#[eBDSecurity.validate_value(12-01-1980,date,1,DD-MM-YYYY,,,12-12-1970)]"/> Return -> 0 quote_for_input(value, simple|tag) -> string Devuelve el valor recibido escapado para introducirlo en un atributo de un tag o entre tag de inicio y final de tag. Se Debe pasar el valor y el literal 'simple' en el caso que el atributo este con comillas simples o el literal 'tag' si queremos ponerlo entre dos tags. Ejemplo: <ebd:set var="doble" value='"'/> <input type="text" name="dummy_a" value="<ebd:out value="#[eBDSecurity.quote_for_input(Hallo ${doble}World${doble} K's)]"/>"> <br> <input type="text" name="dummy_b" value='<ebd:out value="#[eBDSecurity.quote_for_input(Hallo Manual de eBDML 82 ANEXOS. ${doble}World${doble} K's, simple)]"/>'> <br> <textarea> <ebd:out value="#[eBDSecurity.quote_for_input(Hallo ${doble}World${doble} K's</textarea> out of the tag, tag)]"/> </textarea> <br> quote_for_javascript(value,simple) -> string Devuelve el valor recibido escapado para introducirlo como un literal de una variable. Se debe pasar el valor y el literal 'simple' si la variable está entre comillas simples. Ejemplo: <ebd:set var="doble" value='"'/> <ebd:out value="#[eBDSecurity.quote_for_javascript(Hello ${doble}world${doble})]"/> Returns -> Hello \"world\" eBDWidget Permite acceder a funciones útiles del objeto Widget que se está ejecutando. Atributos: Name -> string Devuelve el nombre del widget actual. Id -> int Devuelve el identificador del widget actual. Métodos: eventsURL(event_name, [idSection]) -> string Devuelve la URL necesaria para invocar al evento indicado. Si no se indica evento, devolverá el path hacia los eventos. Opcionalmente se puede añadir el ID de la sección sobre la que queremos calcular la URL. filesURL(path, [idSection]) -> string Devuelve el path absoluto del fichero. Opcionalmente se puede añadir el ID de la sección sobre la que queremos calcular la URL. getAttribute(name) ->string Recupera el atributo que hayamos definido en el widget. Esta función puede ser utilizada por cualquier parte del widget (datasources, events, ...) Manual de eBDML 83 ANEXOS. Anexo B. Funciones para Ajax (eBDSection) EBD permite usar AJAX para ejecutar remotamente secciones EBD, y usar el contenido html generado por ellas para modificar la página original. Por ejemplo, se puede usar para mostrar el contenido de una sección dentro de un DIV de forma dinámica. Para ello, es necesario activar la opción "Visible desde AJAX" en la sección que queramos mostrar. Las principales funciones son: eBDSection.show(url, callback) Esta función permite llamar a una sección, página o zona de EBD, ejecutarla y devolver el código HTML resultante a una función de callback que se encargará de publicarla. Un ejemplo de como llamar a una sección al pulsar sobre un enlace: Con este ejemplo hemos conseguido que al pulsar sobre un enlace se despliegue el contenido de una sección sin necesidad de recargar la página, simplemente utilizando una capa como 'recipiente'. Primero es necesario tener cargadas las librerias AjaxCaller, Util y Sections: <script language="Javascript" src="/includes/ajax/ajaxCaller.js";></script> <script language="Javascript" src="/includes/ajax/util.js"></script> <script language="Javascript" src="/includes/ajax/sections.js"></script> Desde EBD calculamos la URL del objeto a cargar, mediante la instrucción eBD:ENCRYPT, por ejemplo, para llamar a una sección podemos utilizar: <ebd:ENCRYPT var="url" value="?idsection=<id_seccion>"/> Los parámetros de eBDSection que podemos utilizar son: idsection ID de la sección que se llama. section Nombre de la sección. Se debe utilizar conjuntamente con los parámetros 'zone' o 'page', de lo contrario se considerará como una sección global. ?section=my_section&page=my_page idpage ID de la página que se llama. page Nombre de la página. idzone ID de la zona que se llama. La función utilizará el DOCTYPE de la zona actual si no se especifica este parámetro. Manual de eBDML 84 ANEXOS. zone Nombre de la zona. La función utilizará el DOCTYPE de la zona actual si no se especifica este parámetro. full_name [1|0] Booleano que indica si se debe generar el contenido HTML completo, por ejemplo: para poder usar esa URL directamente en un IFRAME. Para crear el enlace utilizamos: <a href="javascript:eBDSection.show('<ebd:out value="$url"/>',callback);">SEE SECTION</a> Este enlace llamará a una función, que hemos llamado 'callback' y que se encarga de recoger el HTML devuelto por el objeto llamado y publicarlo. <script language="javascript"> function callback(html){ var obj=document.getElementById('my_div'); if (obj!=null) {obj.innerHTML=html;} } </script> Para que se muestra el resultado debemos tener un objeto que nos sirva para mostrar el resultado. <div id="my_div"></div> Si en la URL encriptada, de eBDSection.show, añadimos el parámetro 'section_containers=1' forzaremos la inserción de los elementos contenedores. Con este ejemplo hemos conseguido que al pulsar sobre un enlace se despliegue el contenido de una sección sin necesidad de recargar la página, simplemente utilizando una capa como 'recipiente'. eBDSection.setDOMContent(dom_node, html) Esta función es auxiliar a eBDSection, ya que esta usa setDOMContent para incrustar el HTML que recibe, además permite cargar todos los scripts en el HEAD, comprobando que no estén cargados previamente. La carga de los STYLE las realiza en el propio DOM node. Manual de eBDML 85