4D v16

Etiquetas de transformación 4D

 
4D v16
Etiquetas de transformación 4D

Etiquetas de transformación 4D  


 

 

El servidor web 4D le ofrece un conjunto de etiquetas de transformación que permiten insertar las referencias a las expresiones o variables 4D o efectuar diferentes tipos de procesos al interior de un texto fuente, llamado "template". Estas etiquetas  son interpretadas durante la ejecución del texto fuente y generan un texto de salida.

Este principio es utilizado por lo general por el servidor web 4D para crear Páginas semidinamicas.

Las etiquetas son insertadas generalmente como comentarios tipo HTML (<!--#Tag Contents--> ). Sin embargo, otros comentarios tales como <!--Beginning of list--> también son posibles. Es posible mezclar varios tipos de etiquetas. Por ejemplo, la siguiente estructura HTML es totalmente factible:

<HTML>
...
<BODY>
<!--#4DSCRIPT/PRE_PROCESS-->         (Method call)
<!--#4DIF (myvar=1)-->               (If condition)
   <!--#4DINCLUDE banner1.html-->   (Subpage insertion)
<!--#4DENDIF-->                     (End if)
<!--#4DIF (mtvar=2)-->
   <!--#4DINCLUDE banner2.html-->
<!--#4DENDIF-->

<!--#4DLOOP [TABLE]-->               (Loop on the current selection)
<!--#4DIF ([TABLE]ValNum>10)-->         (If [TABLE]ValNum>10)
   <!--#4DINCLUDE subpage.html-->   (Subpage insertion)
<!--#4DELSE-->                     (Else)
   <B>Value: <!--#4DTEXT [TABLE]ValNum--></B><BR>
                              (Field display)
<!--#4DENDIF-->
<!--#4DENDLOOP-->                  (End for)
</BODY>
</HTML>

El análisis del contenido de las páginas "templates" se efectúa en dos contextos:

  • Utilizando el comando PROCESS 4D TAGS; este comando acepta un 'template' como entrada, así como también parámetros (opcionales) y devuelve un texto resultante del procesamiento.
  • Utilizando el servidor HTTP integrado de 4D: Páginas semidinamicas enviado por medio de los comandos WEB SEND FILE (.htm, .html, .shtm, .shtml), WEB SEND BLOB (BLOB de tipo text/html), WEB SEND TEXT , o  llamados utilizando URLs. En este último caso, por razones de optimización, las páginas que tienen sufijos “.htm” and “.html” y NO son analizadas. Para forzar el análisis de las páginas HTML en este caso, debe añadir el sufijo “.shtm” o “.shtml” (por ejemplo, http://www.server.com/dir/page.shtm). Para obtener más información sobre este punto, consulte la sección Páginas semidinamicas en el capítulo Servidor Web.

La siguiente tabla lista las etiquetas de transformación 4D disponibles. Para más detalles, vea la descripción de las etiquetas a continuación.

EtiquetaAcciónEjemploSintaxis $(*)Comentarios
4DTEXTInserta variables y expresiones 4D como texto<!--#4DTEXT [Customer]Name-->XRecomendado si los datos se procesan externamente para evitar inyecciones de código malicioso
4DHTMLInserta código HTML<!--#4DHTML <br/>-->XNo se recomienda si los datos se procesan externamente
4DEVALEvalúa toda expresión 4D<!--#4DEVAL a:=20-->XNo se recomienda si los datos se procesan externamente
4DSCRIPT/Ejecuta un método 4D con un parámetro<!--#4DSCRIPT/MyMethod/MyParam-->
4DINCLUDEIncluye una página HTML dentro de otra<!--#4DINCLUDE subpage.html-->
4DBASEDesigna el archivo utilizado por 4DINCLUDE<!--#4DBASE ../file/-->
4DCODEInserta código 4D<!--#4DCODE ALERT(myVar)-->Soporta CR, LF (bloques de código 4D)
4DIF, 4DELSE, 4DELSEIF, 4DENDIFInserta las condiciones en el código dentro de las etiquetas<!--#4DIF (myVar=1)-->
4DLOOP, 4DENDLOOPInserta bucles en el código dentro de las etiquetas<!--#4DLOOP [table]-->Se puede usar con tablas, arrays, métodos, expresiones, punteroArray

(*) Las etiquetas generalmente deben insertarse como comentarios HTML (<!--#Tag Content-->) en el texto fuente. Una sintaxis alternativa utilizando $ es posible bajo ciertas condiciones para que las etiquetas devuelvan valores, para que se ajusten a XML. Para más información, consulte Nueva sintaxis con $ para 4DTEXT, 4DHTML, 4DEVAL.

La ejecución de un método 4D con 4DTEXT, 4DHTML, 4DEVAL, 4DSCRIPT, 4DIF, 4DELSEIF o 4DLOOP desde una petición web está sujeta al valor del atributo “Available via tags and 4D URLs (4DACTION ...)” "Disponible a través de las etiquetas y URLs 4D (4DACTION ...)" definido en las propiedades del método. Si el atributo no está marcado para el método, no se puede llamar desde una petición web. Para más información sobre este punto, consulte la sección Seguridad de las conexiones.

Las etiquetas 4D se interpretan de forma recursiva: 4D siempre intenta reinterpretar el resultado de una transformación y, en caso de que una nueva transformación haya tenido lugar, se realiza una interpretación adicional, y así sucesivamente hasta que el producto obtenido ya no requiera de ninguna transformación adicional. Por ejemplo, dada la siguiente instrucción:

<!--#4DHTML [Mail]Letter_type--> 

Si el campo texto [Mail]Letter_type en sí contiene una etiqueta, por ejemplo <!--#4DSCRIPT/m_Gender-->, esta etiqueta se evaluará de forma recursiva después de la interpretación de la etiqueta 4DHTML.

Este principio poderoso cumple la mayoría de las necesidades relacionadas con la transformación de textos. Tenga en cuenta, sin embargo, que en algunos casos esto también puede permitir la inserción de código malicioso. Para más información acerca de este punto, consulte la siguiente sección.

Las etiquetas de transformación 4D aceptan diferentes tipos de datos como parámetros: texto, variables, métodos, nombres de comandos, etc. Cuando estos datos son ofrecidos por su propio código, no hay riesgo de inserción de código malicioso ya que usted controla las entradas. Sin embargo, el código de su base a menudo trabaja con datos que eran, en un momento u otro, introducidos a través de una fuente externa (entrada del usuario, importación, etc.).
En este caso, es aconsejable no utilizar etiquetas de transformación tales como 4DEVAL o 4DSCRIPT, que evalúan los parámetros, directamente con este tipo de datos.
Además, de acuerdo con el principio de la recursividad (ver sección anterior), el código malicioso puede incluir etiquetas de transformación en sí. En este caso, es imprescindible utilizar la etiqueta 4DTEXT.

Imagine, por ejemplo, un campo de formulario web denominado "Name", donde los usuarios deben introducir su nombre. Este nombre se muestra a continuación, utilizando una etiqueta <!--#4DHTML vName--> en la página. Si el texto del tipo "<!--#4DEVAL QUIT 4D-->" se inserta en lugar del nombre, la interpretación de esta etiqueta hará que la aplicación se cierre.

Para evitar este riesgo, sólo puede utilizar la etiqueta 4DTEXT sistemáticamente en este caso. Como esta etiqueta escapa los caracteres HTML especiales, no se reinterpretará cualquier código malicioso recursivo que pueda haber sido insertado. Para hacer referencia al ejemplo anterior, el campo "Nombre" contendrá, en este caso, "&lt;!--#4DEVAL QUIT 4D--&gt;" que no será transformado.

Para garantizar la evaluación correcta de las expresiones procesadas a través de etiquetas, independientemente del idioma o la versión en 4D, se recomienda utilizar la sintaxis tokenizada para los elementos cuyo nombre puede variar en versiones (comandos, tablas, campos, constantes). Por ejemplo, para insertar el comando Current time, introduzca 'Current time:C178'. Para más información sobre este punto, consulte la sección Utilizar tokens en fórmulas.

A partir de v15 R4, 4D utiliza siempre el carácter punto (.) como separador decimal durante la evaluación de una expresión numérica utilizando una etiqueta 4DTEXT, 4DHTML, 4DEVAL o 4DSCRIPT (así como las anteriores etiquetas 4DVAR y 4DHTMLVAR). La configuración regional ahora se ignora en este contexto.

Esta nueva funcionalidad facilitará el mantenimiento y la compatibilidad del código entre las diferentes versiones y lenguajes de 4D.

Por ejemplo, cualquiera que sea la configuración regional:

 value:=10/4
 input:="<!--#4DTEXT value-->"
 PROCESS 4D TAGS(input;output)
  // Siempre devuelve 2.5 aunque los ajustes regionales utilizan la ',' como separador

Nota de compatibilidad: si su código, convertido desde una versión anterior, evalúa las expresiones numéricas usando las etiquetas 4D con respecto a la configuración regional, es necesario adaptarlo usando el comando String:

  • Para obtener valor con un punto como separador decimal: <!--#4DTEXT value-->
  • Para obtener el valor con un punto decimal definido en la configuración regional: <!--#4DTEXT String(value)-->

4DTEXT  

Sintaxis: <!--#4DTEXT VarName--> o <!--#4DTEXT 4DExpression-->
Sintaxis alternativa: $4DTEXT(VarName) o $4DTEXT(4DExpression) (ver )

La etiqueta <!--#4DTEXT NombreVar--> le permite insertar una referencia a una variable o a una expresión 4D que devuelve un valor. Por ejemplo, si escribe (en una página HTML):

<P>Bienvenido a <!--#4DTEXT vtNomSitio-->!</P>

El valor de la variable 4D vtNomSitio se insertará en la página HTML en el momento de su envío. Este valor se inserta en forma de texto simple, los caracteres HTML especiales tales como  ">" se escapan automáticamente. 

También puede insertar las expresiones 4D utilizando la etiqueta 4DTEXT. Y puede por ejemplo insertar directamente el contenido de un campo (<!--#4DTEXT [nomTabla]nomCampo-->), un elemento de array (<!--#4DTEXT tabarr{1}-->) o un método que devuelve un valor (<!--#4DTEXT mimetodo-->). La conversión de la expresión sigue las mismas reglas que la conversión de una variable. Además, la expresión debe cumplir con las reglas de sintaxis de 4D.

En caso de error de evaluación, el texto insertado será de la forma “<!--#4DTEXT myvar--> : ## error # error code”.

Notas:

  • Debe utilizar las variables proceso.
  • Es posible mostrar el contenido de un campo imagen. Por el contrario no es posible mostrar el contenido de un elemento de array imagen.
  • Es posible mostrar los contenidos de un campo objeto, por intermedio de una fórmula 4D. Por ejemplo, puede escribir <!--#4DTEXT OB Get:C1224([Rect]Desc;\"color\")-->.
  • Por razones de seguridad, se recomienda utilizar esta etiqueta para procesar datos introducidos desde el exterior de la aplicación, para evitar la inserción de código malicioso (ver la sección [#title id="2850" anchor="2626211"/] abajo).
  • Por lo general usted trabajará con variables Texto. Sin embargo, puede utilizar variables BLOB. Debe generar el BLOB en modo Texto sin longitud.

4DHTML  

Sintaxis: <!--#4DHTML VarName--> o <!--#4DHTML 4DExpression-->
Sintaxis alternativa
: $4DHTML(VarName) o $4DHTML(4DExpression) (ver )

Como la etiqueta 4DTEXT, esta etiqueta permite evaluar una variable o una expresión 4D que devuelve un valor, e insertarla como una expresión HTML.  A diferencia de la etiqueta 4DTEXT,  esta etiqueta no convierte los caracteres especiales HTML tales como ">").

Por ejemplo, estos son los resultados del procesamiento de la variable texto 4D mivar con las etiquetas disponibles:

Valor de mivarEtiquetasResultado
mivar:="<B>"<!--#4DTEXT mivar-->&lt;B&gt;
mivar:="<B>"<!--#4DHTML mivar--><B>

En caso de un error de evaluación, el texto insertado será de la forma “<!--#4DHTML mivar--> : ## error # error code”.

Nota: por razones de seguridad, se recomienda utilizar la etiqueta 4DTEXT cuando procese datos introducidos desde fuera de la aplicación para evitar la inserción de código malicioso (ver la sección [#title id="9043" anchor="2626229"/] a continuación).

Sintaxis: <!--#4DEVAL VarName--> o <!--#4DEVAL 4DExpression-->
Sintaxis alternativa: $4DEVAL(VarName) or $4DEVAL(4DExpression) (ver )

La etiqueta 4DEVAL permite evaluar una variable o una expresión 4D.  Al igual que la etiqueta 4DHTML existente, 4DEVAL no escapa los caracteres HTML al regresar del  texto. Sin embargo, a diferencia de 4DHTML o 4DTEXT, 4DEVAL le permite ejecutar cualquier instrucción 4D válida, incluyendo asignaciones y expresiones que no devuelven ningún valor.

Por ejemplo, puede ejecutar:

 $input:="<!--#4DEVAL a:=42-->" //asignación
 $input:=$input+"<!--#4DEVAL a+1-->" //cálculo
 PROCESS 4D TAGS($input;$output)
  //$output = "43"

En caso de error durante la interpretación, el texto insertado será de la forma: “<!--#4DEVAL expr-->: ## error # código de error”.

Nota: por razones de seguridad, se recomienda utilizar la etiqueta 4DTEXT cuando se procesan datos introducidos desde fuera de la aplicación, para evitar la inserción de código malicioso (ver la sección [#title id="9043" anchor="2626229"/] a continuación).

Sintaxis: <!--#4DSCRIPT/NombreMetodo/Param-->

La etiqueta 4DSCRIPT le permite ejecutar métodos 4D en el momento del procesamiento del template. La presencia del comentario HTML <!--#4DSCRIPT/MiMetodo/MiParam--> provoca la ejecución del método MiMetodo con el parámetro MiParam como cadena en $1.

Nota: si la etiqueta se llama en el contexto de un proceso web, cuando se carga la página, 4D llama al Método de base On Web Authentication (si existe). Si devuelve True, 4D ejecuta el método.

El método devuelve texto en $0. Si la cadena comienza con el carácter de código 1, se considera como HTML (el mismo principio que para la etiqueta 4DHTML).

El análisis de los contenidos de la página se realiza con WEB SEND FILE (.htm, .html, .shtm, .shtml) o se llama WEB SEND BLOB (blob de tipo texto/html).
Recuerde que en modo no contextual, el análisis también se hace cuando un URL apunta a un archivo que tiene una extensión “.shtm” o “.shtml” (por ejemplo http://www.server.com/dir/page.shtm).

Por ejemplo, inserte en una página web semi dinámica el comentario “Hoy es<!--#4DSCRIPT/MIMETH/MIPARAM-->”. Cuando se carga la página, 4D llama al Método de base On Web Authentication (si existe), luego llama al método MIMET y pasa la cadena “/MIPARAM” como parámetro $1.

El método devuelve texto en $0 (por ejemplo “12/31/03”); la expresión “Hoy es <!--#4DSCRIPT/MIMETH/MIPARAM––>” se convierte en “Hoy es 12/31/03”.

El código del método MIMET es:

  //MYMETH
 C_TEXT($0;$1//Estos parámetros debe ser declararse siempre
 $0:=String(Current date)

Nota: un método llamado por 4DSCRIPT no debe llamar elementos de interfaz (DIALOG, ALERT...).

Como 4D ejecuta los métodos en su orden de aparición, es muy posible llamar a un método que define el valor de muchas variables que están referenciadas más adelante en el documento, cualquiera que sea el modo que esté utilizando.

Nota: puede insertar tantos comentarios <!--#4DSCRIPT...--> como quiera en un template.

Sintaxis: <!--#4DINCLUDE Ruta-->

Esta etiqueta permite incluir, en una página HTML, otra página HTML (designada por el parámetro ruta). Por defecto sólo se incluye el cuerpo de la página HTML especificada, es decir el contenido entre las etiquetas <body> y </body> (las etiquetas mismas no se incluyen). Esto le permite evitar conflictos relacionados con las etiquetas presentes en los encabezados. Sin embargo si la página HTML especificada no contiene etiquetas <body></body>, se incluye la página completa. Usted debe verificar la consistencia de las etiquetas.

El comentario <!--#4DINCLUDE --> es muy útil en combinación con las pruebas (<!--#4DIF-->) o los bucles (<!--#4DLOOP-->). Es muy conveniente incluir etiquetas en función de un criterio o de manera aleatoria.
Al momento de la inclusión, sin importar la extensión del nombre del archivo, 4D analiza la página llamada y luego inserta los contenidos (modificados o no) en la página que origina la llamada 4DINCLUDE.

La ubicación en la caché web de una página incluida con el comentario <!--#4DINCLUDE --> responde a las mismas reglas que las páginas llamadas vía un URL o enviadas con el comando WEB SEND FILE.

Pase en ruta, la ruta de acceso al documento a incluir. Advertencia: en el caso de la etiqueta 4DINCLUDE, la ruta de acceso es relativa al documento en curso de análisis, es decir el documento “padre”. Utilice el carácter barra oblicua (/) como separador de carpetas y los dos puntos (..) para subir un nivel (sintaxis HTML).

Notas:

  • cuando utiliza la etiqueta 4DINCLUDE con el comando PROCESS 4D TAGS,  la carpeta por defecto es la carpeta que contiene el archivo de estructura de la base.
  • Puede modificar la carpeta por defecto utilizada por la etiqueta 4DINCLUDE en la página actual, utilizando la etiqueta <!--#4DBASE --> (ver a continuación).
El número de <!--#4DINCLUDE ruta--> dentro de una página es ilimitado. Sin embargo, las llamadas a <!--#4DINCLUDE ruta--> sólo pueden realizarse a un nivel. Esto significa que, por ejemplo, no puede insertar el comentario <!--#4DINCLUDE midoc3.html--> en el cuerpo de la página midoc2.html, llamada por <!--#4DINCLUDE midoc2--> insertado en midoc1.html.

Además, 4D verifica que las inclusiones no sean recursivas.

En caso de error, el texto insertado es de la forma "<!--#4DINCLUDE ruta--> :No se puede abrir el documento".

Ejemplos

<<!--#4DINCLUDE subpagina.html--> 
<!--#4DINCLUDE carpeta/subpagina.html--> 
<!--#4DINCLUDE ../carpeta/subpagina.html-->

4DBASE  

Sintaxis: <!--#4DBASE folderPath-->

La etiqueta <!--#4DBASE --> designa un directorio de trabajo que será utilizado por la etiqueta <!--#4DINCLUDE-->.
Cuando se llama en una página web, la etiqueta <!--#4DBASE --> modifica todas las llamadas <!--#4DINCLUDE--> posteriores en esta página, hasta la próxima <!--#4DBASE -->, si la hay. Si la carpeta <!--#4DBASE --> se modifica desde un archivo incluido, recupera su valor original desde el archivo padre. 

El parámetro rutaCarpeta debe contener una ruta de acceso relativa a la página actual y debe terminar con una barra oblicua (/). La carpeta designada debe ubicarse al interior de la carpeta web.
Pase la palabra clave WEBFOLDER para restablecer la ruta por defecto (relativa a la página). 

Por lo tanto el siguiente código, debe especificar una ruta relativa a cada llamada:

<!--#4DINCLUDE subpage.html--> 
<!--#4DINCLUDE folder/subpage1.html-->
<!--#4DINCLUDE folder/subpage2.html-->
<!--#4DINCLUDE folder/subpage3.html-->
<!--#4DINCLUDE ../folder/subpage.html-->

... puede escribirse utilizando la etiqueta <!--#4DBASE -->:

<!--#4DINCLUDE subpage.html--> 
<!--#4DBASE folder/-->
<!--#4DINCLUDE subpage1.html-->
<!--#4DINCLUDE subpage2.html-->
<!--#4DINCLUDE subpage3.html-->
<!--#4DBASE ../folder/-->
<!--#4DINCLUDE subpage.html-->
<!--#4DBASE WEBFOLDER-->

Ejemplo  

Definición de un directorio para la página de inicio utilizando la etiqueta <!--#4DBASE -->:

/* Index.html */
<!--#4DIF LangFR=True-->
    <!--#4DBASE FR/-->
<!--#4DELSE-->
    <!--#4DBASE US/-->
<!--#4DENDIF-->
<!--#4DINCLUDE head.html-->
<!--#4DINCLUDE body.html-->
<!--#4DINCLUDE footer.html-->

En el archivo head.html, la carpeta actual se modifica vía <!--#4DBASE -->, sin que cambie su valor en Index.html:

/* Head.htm */
/* el directorio de trabajo aquí es relativo al archivo incluido (FR/ o US/) */
<!--#4DBASE Styles/-->
<!--#4DINCLUDE main.css-->
<!--#4DINCLUDE product.css-->
<!--#4DBASE Scripts/-->
<!--#4DINCLUDE main.js-->
<!--#4DINCLUDE product.js-->

4DCODE  

La etiqueta 4DCODE le permite insertar un bloque de código multilínea 4D en una plantilla.

Cuando se detecta que una  secuencia "<!--#4DCODE" está seguida por un espacio, un carácter CR o un LF, 4D interpreta todas las líneas de código hasta la próxima secuencia "-->". El bloque de código en sí mismo puede contener retornos de carro, saltos de línea, o ambos; será interpretado secuencialmente por 4D.

Por ejemplo, utilizando la etiqueta 4DCODE, puede escribir en una plantilla:

<!--#4DCODE
//Inicialización de los parámetros
C_OBJECT:C1216($graphParameters)
OB SET:C1220($graphParameters;"graphType";1)
$graphType:=1
//...votre code ici
If(OB Is defined:C1231($graphParameters;"graphType")) //lenguaje US únicammente
    $graphType:=OB GET:C1224($graphParameters;"graphType")
    If($graphType=7)
        $nbSeries:=1
        If($nbValues>8)
            DELETE FROM ARRAY:C228 ($yValuesArrPtr{1}->;9;100000)
            $nbValues:=8
        End if
    End if
End if
-->

Nota: en una etiqueta 4DCODE, el código 4D siempre debe ser escrito utilizando el lenguaje Inglés - Estados Unidos. Por lo tanto, 4DCODE ignora las  preferencias de usuario "Utilizar configuración del sistema regional" para el lenguaje 4D (ver Lenguaje para los comandos y constantes).

Estas son la funcionalidades de la etiqueta 4DCODE:

  • El comando TRACE es soportado y activa el depurador 4D, lo que le permite depurar el código de su plantilla.
  • Cualquier error se mostrará el diálogo de error estándar que permite al usuario detener la ejecución del código o introducir el modo de depuración.
  • El texto entre <!--#4DCODE y --> se divide en líneas que aceptan cualquier convención de final de línea (cr, lf, o crlf).
  • El texto se tokeniza dentro del contexto de la base que llamó PROCESS 4D TAGS. Esto es importante para el reconocimiento de los métodos de proyecto, por ejemplo.
    Nota: la propiedad del método "Disponible por etiquetas 4D tags y URLs 4DACTION"  no se tiene en cuenta (ver también la Nota de seguridad más abajo).
  • Incluso si el texto siempre utiliza Inglés - Estados Unidos, se recomienda utilizar la sintaxis de token (:Cxxx) para nombres de comandos y de constantes para proteger contra potenciales problemas  por  comandos o constantes renombrados de una versión de 4D a otra.
    Nota: para más información sobre: sintaxis Cxxx, consulte la sección Utilizar tokens en fórmulas.

Nota de seguridad: el hecho de que las etiquetas 4DCODE puedan llamar a cualquiera de los comandos del lenguaje 4D o a los métodos de proyecto podría ser visto como un problema de seguridad, especialmente cuando la base de datos está disponible a través de HTTP. Sin embargo, ya que ejecuta el código del lado del servidor llamado desde sus propios archivos de plantilla, la etiqueta en sí no representa un problema de seguridad. En este contexto, como para cualquier servidor Web, la seguridad se maneja principalmente a nivel de accesos remotos a los archivos del servidor.

Sintaxis: <!--#4DIF expresion--> {<!--#4DELSEIF expression2-->...<!--#4DELSEIF expresionN-->} {<!--#4DELSE-->} <!--#4DENDIF-->

Utilizado con los comentarios <!--#4DELSEIF--> (opcional), <!--#4DELSE--> (opcional) y <!--#4DENDIF-->, el comentario <!--#4DIF expresion--> ofrece la posibilidad de ejecutar partes de código de manera condicional.

El parámetro expresion puede contener toda expresión 4D válida devolviendo un valor booleano. Debe estar entre paréntesis y cumplir con las reglas de sintaxis de 4D.

Los bloques <!--#4DIF expression--> ... <!--#4DENDIF--> pueden estar anidados en varios niveles. Como en 4D, cada <!--#4DIF expresion--> debe tener un <!--#4DENDIF--> correspondiente.

En caso de un error de interpretación, el texto “<!--#4DIF expresion-->: se esperaba una expresión booleana” se inserta en lugar del contenido situado entre <!--#4DIF --> y <!--#4DENDIF-->.

De la misma forma, si no hay tantos <!--#4DENDIF--> como <!--#4DIF -->, el texto “<!--#4DIF expresion-->: 4DENDIF esperado” se inserta en lugar de los contenidos ubicados entre <!--#4DIF --> y <!--#4DENDIF-->.

Utilizando la etiqueta <!--#4DELSEIF-->, puede probar un número ilimitado de condiciones. Sólo se ejecuta el contenido que sigue la primera condición evaluada como True. Si ninguna condición es verdadera, no se ejecuta ninguna instrucción (si no hay <!--#4DELSE--> final).
Puede utilizar una etiqueta <!--#4DELSE--> después de la última <!--#4DELSEIF-->. Si todas las condiciones son falsas, las instrucciones siguientes a <!--#4DELSE--> se ejecutan.

Los siguientes dos códigos son equivalentes.

  • Código utilizando únicamente 4DELSE:
    <!--#4DIF Condition1-->
      /* Condition1 es true*/
    <!--#4DELSE-->
        <!--#4DIF Condition2-->
            /* Condition2 es true*/
        <!--#4DELSE-->
            <!--#4DIF Condition3-->
                /* Condition3 es true */
            <!--#4DELSE-->
                /*Ninguna de las condiciones es verdadera*/
            <!--#4DENDIF-->
        <!--#4DENDIF-->
    <!--#4DENDIF-->
  • Código similar utilizando la etiqueta 4DELSEIF:
    <!--#4DIF Condition1-->
         /* Condition1 es true*/
    <!--#4DELSEIF Condition2-->
         /* Condition2 es true*/
    <!--#4DELSEIF Condition3-->
        /* Condition3 es true */
    <!--#4DELSE-->
        /* Ninguna de las condiciones es verdadera*/
    <!--#4DENDIF-->

Este ejemplo de código insertado en una página HTML estática muestra una etiqueta diferente de acuerdo al resultado de la expresión vnom#"":

<BODY>
...
<!--#4DIF (vnom#"")-->
Nombres que comienzan por <!--#4DTEXT vnom-->.
<!--#4DELSE-->
No se ha encontrado ningún nombre.
<!--#4DENDIF-->
...
</BODY>

Este ejemplo inserta páginas diferentes en función del usuario conectado:

<!--#4DIF LoggedIn=False-->
    <!--#4DINCLUDE Login.htm -->
<!--#4DELSEIF User="Admin" -->
    <!--#4DINCLUDE AdminPanel.htm -->
<!--#4DELSEIF User="Manager" -->
    <!--#4DINCLUDE SalesDashboard.htm -->
<!--#4DELSE-->
    <!--#4DINCLUDE ItemList.htm -->
<!--#4DENDIF-->

Sintaxis: <!--#4DLOOP condicion--> <!--#4DENDLOOP-->

Este comentario permite la repetición de una parte de código siempre y cuando se cumpla la condición. La porción está delimitada por <!--#4DLOOP--> y <!--#4DENDLOOP-->.

Los bloques <!--#4DLOOP condicion--> ... <!--#4DENDLOOP--> pueden estar imbricados. Como en 4D, cada <!--#4DLOOP condicion--> debe tener un <!--#4DENDLOOP--> correspondiente.

Hay cinco tipos de condiciones:

  • <!--#4DLOOP [tabla]-->

    Esta sintaxis realiza un bucle para cada registro desde la selección actual de la tabla en el proceso en actual. La porción de código ubicada entre los dos comentarios se repite para cada registro de la selección actual.

Nota: cuando la etiqueta 4DLOOP se utiliza con una tabla, los registros se cargan en modo sólo lectura.

El ejemplo de código siguiente:

<!--#4DLOOP [Personas]-->
<!--#4DTEXT [Personas]Nombre--> <!--#4DVAR [Personas]Apellido-><BR>
<!--#4DENDLOOP-->

... puede traducirse en lenguaje 4D como:

 FIRST RECORD([Personas])
 While(Not(End selection([Personas])))
    ...
    NEXT RECORD([Personas])
 End while
  • <!--#4DLOOP array-->

Esta sintaxis efectúa in bucle para cada elemento del array. El índice actual del array se incrementa cuando se repite la porción de código.

Nota: esta sintaxis no puede utilizarse con arrays de dos dimensiones. En este caso, es mejor combinar un método con bucles anidados.

El siguiente ejemplo de código siguiente:

<!--#4DLOOP arr_nombres-->
<!--#4DTEXT arr_nombres{arr_nombres}--><BR>
<!--#4DENDLOOP-->

... puede traducirse en lenguaje 4D como:

 For($Elem;1;Size of array(arr_nombres))
    arr_nombres:=$Elem
    ...
 End for
  • <!--#4DLOOP metodo-->

Esta sintaxis efectúa un bucle mientras el método devuelva True. El método admite un parámetro de tipo Entero largo. Primero se llama con el valor 0 para permitir una fase de inicialización (si es necesaria); luego se llama con los valores 1, 2, 3, ... mientras devuelva True.

Por razones de seguridad, en el contexto de un proceso web Método base On Web Authentication puede llamarse, sólo una sola vez, antes de la fase de inicialización (ejecución del método con 0 como parámetro). Si se confirma la autenticación, se lleva a cabo la fase de inicialización.

Advertencia: C_BOOLEAN($0) y C_LONGINT($1) DEBEN declararse dentro del método por motivos de compilación.

El ejemplo de código siguiente:

<!--#4DLOOP mi_metodo-->
<!--#4DTEXT var--> <BR>
<!--#4DENDLOOP-->

... puede traducirse en código 4D como:

 If(AuthenticationWebOK)
    If(mi_metodo(0))
       $contador:=1
       While(mi_metodo($contador))
          ...
          $contador:=$contador+1
       End while
    End if
 End if

El método mi_metodo puede ser de esta forma:

 C_LONGINT($1)
 C_BOOLEAN($0)
 If($1=0)
  `Inicialización
    $0:=True
 Else
    If($1<50)
       ...
       var:=...
       $0:=True
    Else
       $0:=False `Detiene el bucle
    End if
 End if
  • <!--#4DLOOP 4DExpression-->
    Con esta sintaxis, la etiqueta 4DLOOP efectúa un bucle siempre que la expresión 4D devuelva True. La expresión puede ser toda expresión booleana válida y debe contener una parte variable a evaluar en cada bucle para evitar bucles infinitos.
    Por ejemplo, el siguiente código:

<!--#4DEVAL $i:=0-->
<!--#4DLOOP ($i<4)-->
<!--#4DEVAL $i-->
<!--#4DEVAL $i:=$i+1-->
<!--#4DENDLOOP-->

produce el siguiente resultado:

0
1
2
3

  • <!--#4DLOOP pointerArray-->
    En este caso, la etiqueta 4DLOOP funciona como lo hace con un array: hace un bucle para cada elemento del array referenciado por el puntero. El elemento del array actual se incrementa cada vez que la porción de código se repite.
    Esta sintaxis es útil cuando se pasa un puntero array como parámetro al comando PROCESS 4D TAGS.
    Ejemplo:

 ARRAY TEXT($array;2)
 $array{1}:="hello"
 $array{2}:="world"
 $input:="<!--#4DEVAL $1-->"
 $input:=$input+"<!--#4DLOOP $2-->"
 $input:=$input+"<!--#4DEVAL $2->{$2->}--> "
 $input:=$input+"<!--#4DENDLOOP-->"
 PROCESS 4D TAGS($input;$output;"elements = ";->$array)
  // $output = "elements = hello world "

En caso de error de evaluación, el texto “<!--#4DLOOP expression-->: descripción” se inserta en lugar del contenido ubicado entre <!--#4DLOOP --> y <!--#4DENDLOOP-->.

Los siguientes mensajes se pueden mostrar:

  • Una expresión de tipo no esperado (error estándar);
  • Nombre de tabla invalido (error en el nombre de la tabla);
  • Se esperaba un array (la variable no es un array o es un array de dos dimensiones);
  • El método no existe;
  • Error de sintaxis (durante la ejecución del método);
  • Error de acceso (usted no tienen los privilegios de acceso apropiados para acceder a la tabla o al método).
  • 4DENDLOOP esperado (el número de <!--#4DENDLOOP--> no corresponde al de <!--#4DLOOP -->).

Varias etiquetas de transformación 4D existentes ahora pueden expresarse utilizando una nueva sintaxis utilizando el signo dólar $:
$4dtag (expression) se puede utilizar en lugar de <!--#4dtag expression-->

Condiciones requeridas
La sintaxis $ sólo se utiliza con ciertas etiquetas y en ciertos contextos de evaluación:

  • Etiquetas
    Sólo las etiquetas utilizadas para devolver los valores procesados aceptan esta sintaxis:
    • 4DTEXT
    • 4DHTML
    • 4DEVAL
  • Evaluación
    La sintaxis $ dispara la evaluación de etiquetas por 4D sólo en casos donde la evaluación es explícita:
    • comando PROCESS 4D TAGS 
    • páginas estáticas .shtml servidas directamente por el servidor web por medio de URLs
    • páginas insertadas por medio de la etiqueta 4DINCLUDE

Para las otras etiquetas (4DIF, 4DSCRIPT, etc.) y en otros contextos de evaluación (comandos WEB SEND FILE, WEB SEND BLOB y WEB SEND TEXT), la sintaxis $ no es soportada y es necesario utilizar la sintaxis regular).

Uso

Por ejemplo, puede escribir:

$4DEVAL(UserName)

en lugar de:

<!--#4DEVAL(UserName)-->

La principal ventaja de esta nueva sintaxis es que le permite escribir plantillas conformes a la norma XML. Algunos desarrolladores 4D necesitan crear y validar las plantillas basadas en XML usando herramientas de XML estándar. Dado que el carácter "<" no es válido en un valor de atributo XML, no fue posible usar la sintaxis "<!-- -->" para las etiquetas 4D sin romper la sintaxis documento. Por otra parte, evadir el carácter "<" impedirá que 4D interprete las las etiquetas correctamente. 

Por ejemplo, el siguiente código podría causar un error de análisis XML debido al primer carácter "<" en el valor del atributo:

<line x1="<!--#4DEVAL $x-->" y1="<!--#4DEVAL $graphY1-->"/>

Utilizando la sintaxis $, el siguiente código es validado por el analizador:

<line x1="$4DEVAL($x)" y1="$4DEVAL($graphY1)"/>

Note que $4dtag y <--#4dtag --> no son estrictamente equivalentes: a diferencia de <--#4dtag -->, el procesamiento de $4dtag no interpreta etiquetas 4D recursivamente. Las etiquetas $ siempre se evalúan una sola vez y el resultado es considerado como texto plano.

Nota: para más información sobre el procesamiento recursivo, por favor consulte el párrafo .

La razón de esta diferencia es evitar que la inyección de código malicioso. Como se explica en el manual de referencia Lenguaje, se recomienda especialmente el uso de las etiquetas 4DTEXT en lugar de las etiquetas 4DHTML al manipular texto de usuario para proteger contra la reinterpretación no deseada de las etiquetas: con 4DTEXT, los caracteres especiales como "<" se "escapan", por lo tanto, ninguna etiqueta 4D el uso de la etiqueta <!--#4dtag expression --> sintaxis perderá su significado particular. Sin embargo, como 4DTEXT no "escapa" el símbolo $, decidimos romper el soporte a la recursividad con el fin de evitar la inyección de código malicioso usando la sintaxis $4dtag (expression).

Los siguientes ejemplos muestran el resultado del procesamiento en función de la sintaxis y la etiqueta utilizada:

  // ejemplo 1
 myName:="<!--#4DHTML QUIT 4D-->" //inyección maliciosa
 input:="My name is: <!--#4DHTML myName-->"
 PROCESS 4D TAGS(input;output)
  //4D se cerrará

  // ejemplo 2
 myName:="<!--#4DHTML QUIT 4D-->" //inyección maliciosa
 input:="My name is: <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //la salida es "My name is: &lt;!--#4DHTML QUIT 4D--&gt;"

  // ejemplo 3
 myName:="$4DEVAL(QUIT 4D)" //inyección maliciosa
 input:="My name is: <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //la salida es "My name is: $4DEVAL(QUIT 4D)"

Tenga en cuenta que la sintaxis $4dtag soporta los pares correspondientes de comillas o paréntesis incluidos. Por ejemplo, supongamos que necesita para evaluar la siguiente cadena compleja (ejemplo teórico):

String(1) + "\"(hello)\""

Puede escribir:

 input:="$4DEVAL( String(1)+\"\\\"(hello)\\\"\")"
 PROCESS 4D TAGS(input;output)
 -->la salida es 1"(hello)"