4D v16

Etiquetas HTML 4D

Página Inicial

 
4D v16
Etiquetas HTML 4D

Etiquetas HTML 4D  


 

 

O servidor web 4D lhe oferece um conjunto de etiquetas de transformação que permitem inserir as referencias as expressões ou variáveis 4D ou realizar diferentes tipos de processos ao interior de um texto fonte, chamado "template". Estas etiquetas são interpretadas durante a execução do texto fonte e geram um texto de saída.

Este princípio é utilizado geralmente pelo servidor web 4D para criar Páginas semi dinâmicas.

Estas etiquetas se inserem como comentários HTML (<!--#Tag Contents--> ) no texto fonte. No entanto, outros comentários tais como <!--Beginning of list--> são possíveis.

<HTML>

... <BODY> <!--#4DSCRIPT/PRE_PROCESS-->         (Chamada de método) <!--#4DIF (myvar=1)-->               (condição If)    <!--#4DINCLUDE banner1.html-->   (inserção de uma sub página) <!--#4DENDIF-->                     (Fim de if) <!--#4DIF (mtvar=2)-->    <!--#4DINCLUDE banner2.html--> <!--#4DENDIF--> <!--#4DLOOP [TABLE]-->               (Loop na seleção atual) <!--#4DIF ([TABLE]ValNum>10)-->         (If [TABLE]ValNum>10)    <!--#4DINCLUDE subpage.html-->   (Inserção Sub página) <!--#4DELSE-->                     (Else)    <B>Value: <!--#4DTEXT [TABLE]ValNum--></B><BR>                               (Visualização de um campo) <!--#4DENDIF--> <!--#4DENDLOOP-->                  (Fim do loop) </BODY> </HTML>

A análise do conteúdo das páginas "templates" podem ser feitas de duas maneiras:

  • Utilizando o comando PROCESS 4D TAGS; este comando aceita um 'template' como entrada, assim como parâmetros (opcionais) e devolve um texto resultante do processamento.
  • Utilizando o servidor HTTP integrado de 4D: Páginas semi dinâmicas enviado por meio dos comandos WEB SEND FILE (.htm, .html, .shtm, .shtml), WEB SEND BLOB (BLOB de tipo text/html), [#cmd id="677"/] , ou  chamados utilizando URLs. Neste último caso, por razões de otimização, as páginas que têm sufixos “.htm” and “.html” e NÃO são analisadas. Para forçar a análise das páginas HTML neste caso, deve adicionar o sufixo “.shtm” ou “.shtml” (por exemplo, http://www.server.com/dir/page.shtm). Para obter mais informação sobre este ponto, consulte a seção Páginas semi dinâmicas no capítulo Web Server.

A tabela abaixo lista as tags (etiquetas) de transformação 4D disponíveis. Para mais detalhes, veja a descrição das tags abaixo.

TagAçãoExemplo$ Sintaxe(*)Comentários
4DTEXTInsere variáveis 4D e expressões como texto<!--#4DTEXT [Customer]Name-->XRecomendado se dados processados externamente de modo a evitar inserção de código malicioso
4DHTMLInsere código HTML<!--#4DHTML <br/>-->XNão é recomendado se dados são processados externamente
4DEVALAvalia expressões 4D<!--#4DEVAL a:=20-->XNão é recomendado se dados são processados externamente
4DSCRIPT/Executa um método 4D com um parâmetro<!--#4DSCRIPT/MyMethod/MyParam-->
4DINCLUDEInclui uma página HTML dentro de outra<!--#4DINCLUDE subpage.html-->
4DBASEDesigna o arquivo usado por 4DINCLUDE<!--#4DBASE ../file/-->
4DCODEInsere código 4D<!--#4DCODE ALERT(myVar)-->Suporta CR, LF (blocos de código 4D)
4DIF, 4DELSE, 4DELSEIF, 4DENDIFInsere condições no código com etiquetas<!--#4DIF (myVar=1)-->
4DLOOP, 4DENDLOOPInserr loops no código dentro das tags<!--#4DLOOP [table]-->Pode ser usado com tabelas, arrays, métodos, expressões, pointerArrays

(*)As tags devem geralmente ser inseridas como comentários HTML (<!--#Tag Content-->) no texto código. Uma sintaxe alternativa usando $ é possível dentro de certas condições para valores retornados pelas tags, para fazer com que se conformem a  XML. Para saber mais, veja Sintaxe alternativa para 4DTEXT, 4DHTML, 4DEVAL abaixo.

Executar um método 4D com 4DTEXT, 4DHTML, 4DEVAL, 4DSCRIPT, 4DIF, 4DELSEIF ou 4DLOOP de uma requisição web é sujeitao ao valor de atributo “Available via tags and 4D URLs (4DACTION ...)”  definido nas propriedades do método. Se o atributo não for marcado para o método, não pode ser chamado para uma requisição web. Para saber mais, veja seção Conexões de Segurança.

Etiquetas 4D são interpretadas recursivamente: 4D sempre tente reinterpretar o resultado da transformação e, se uma nova transformação for executada, uma interpretação adicional é realizada, e assim em diante até que o produto obtido não necessite de mais transformações. Por exemplo, dada a seguinte ordem:

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

Se o campo texto [Mail]Letter_type contiver uma etiqueta, por exemplo <!--#4DSCRIPT/m_Gender-->, esta etiqueta será avaliada recursivamente depois da interpretação da etiqueta 4DHTML.

Este princípio poderoso atende a maioria das necessidades relativas à transformação de texto. Note, entretanto, que em alguns casos isto pode permitir a inserção de código malicioso, para saber mais, veja a próxima seção.

As etiquetas de transformação 4D aceita diferentes tipos de dados como parâmetros: texto, variáveis, métodos, nomes de comandos, etc. Quando esses dados forem oferecidos por seu prórpio código, não há risco de inserção de código malicioso, já que você controla o input. Entretanto, seu código de banco de dados funciona com dados que fora, em um momento ou outro, introduzidos por uma fonte externa (input de usuário, importação, etc.)

Neste caso, é recomendável não usar etiquetas de transformação como 4DEVAL ou 4DSCRIPT, que avaliam parâmetros, diretamente com este tipo de dados.

Além disso, de acordo com o princípio de recursão (ver seção anterior), código malicioso pode dentro de si mesmo incluir etiquetas de transformação. Neste caso, é imperativo usar a etiqueta 4DTEXT.

Imaginar, por exemplo, um campo de formulário Web chamado "Nome", no qual usuários devem colocar seu nome. Este nome é então exibido usando uma etiqueta <!--#4DHTML vName--> na página. Se texto do tipo  "<!--#4DEVAL QUIT 4D-->" for inserido ao invés do nome, interpretar essa etiqueta vai fazer com que saia da aplicação.

Para evitar esse risco, pode usar a etiqueta 4DTEXT sistematicamente nesse caso. Já que essa etiqueta escapa os caracteres especiais HTML, qualquer código recursivo malicioso que possa ter sido inserido não será reinterpretado. No exemplo acima, o campo "Nome" vai conter, nesse caso, "&lt;!--#4DEVAL QUIT 4D--&gt;" que não será transformado.

Para assegurar a avaliação correta das expressões processadas via tags (etiquetas) independente da linguagem da versão 4D, é recomendado usar a sintaxe tokenizada para elementos cujo nome pode variar entre versões (comandos, tabelas, campos, constantes). Por exemplo, para inserir o comando Current time entre 'Current time:C178'. Para saber mais sobre esse ponto, veja a seção Usar tokens em fórmulas.

A partir de v15 R4, 4D sempre usa o caractere ponto (.) como separador decimal quando avaliar uma expressão númerica com uma 4D tag 4DTEXT, 4DVAR, 4DHTML, 4DHTMLVAR, e 4DEVAL (assim como as antigas tags 4DVAR e 4DHTMLVAR). Configurações locais são ignoradas.

Esta nova propriedade facilita a manutenção do código e a compatibilidade entre linguages e versões 4D

Por exemplo, sempre que na configuração regional:

 value:=10/4
 input:="<!--#4DTEXT value-->"
 PROCESS 4D TAGS(input;output)
  // sempre dá outputs 2.5 mesmo que a configuração regional usar ',' como separador

Nota de compatibilidade: Se seu código avaliar expressões númericas através de 4D tags com respeito a suas configurações regionais, precisa adaptá-las usando o comando  String:

  • Para conseguir value com um ponto como separador decimal : <!--#4DTEXT value-->
  • Para conseguir value com o ponto decimal de acordo com as configurações regionais<!--#4DTEXT String(value)-->

4DTEXT  

Sintaxe: <!--#4DTEXT NomeVar--> ou <!--#4DTEXT 4DExpression-->

Sintaxe alternativa: $4DTEXT(VarName) o $4DTEXT(4DExpression) (ver )

A etiqueta <!--#4DTEXT NomeVar--> : Undefined <!--#4DTEXT NomeVar--> lhe permite inserir uma referência a uma variável ou a uma expressão 4D que devolve um valor. Por exemplo, se escreve (em uma página HTML):

<P>Bem-vindo a <!--#4DTEXT vtNomSite--><!--#4DTEXT vtNomeSite--> : Undefined!</P>

O valor da variável 4D vtNomSite se inserirá na página HTML no momento de seu envio. Pode inserir uma variável de texto 4D no código HTML. Este valor é inserido em forma de texto simples, os caracteres HTML especiais tais como  ">" se escapam automaticamente. 

Também pode inserir as expressões 4D utilizando la etiqueta 4DTEXT. Pode inserir diretamente o conteúdo de um campo(<!--#4DTEXT [nomTabela]nomCampo-->), um elemento de array (<!--#4DTEXT tabarr{1}-->) ou um método que retorna um valor (<!--#4DTEXT meuMetodo-->). A conversão da expressão segue as mesmas regras que a conversão de uma variável. Além disso, a expressão deve cumprir com as regras de sintaxe de 4D.

Em caso de erro de interpretação, o texto inserido será da forma “<!--#4DTEXT myvar--> : ## erro # erro code”.

Notas:
  • Deve utilizar as variáveis processo.
  • Por razões de segurança é recomendado usar esta tag quando processando dados introduzidos de fora do aplicativo. Para prevenir a inserção de código malicioso, ver  
  • É possível mostrar o conteúdo de um campo imagem. Entretanto não é possível mostrar o conteúdo de um elemento de array imagem.
  • É possível exibir os conteúdos de um cmapo imagem usando uma fórmula 4D. Por exemplo, escrevendo <!--#4DTEXT OB Get([Rect]Desc;\"color\")-->.
  • Por razões de segurança, é recomendado usar essa tag quando processando dados introduzidos de fora da aplicação, para prevenir a inserção de código malicioso (ver a seção [#title id="2850" anchor="2626211"/]).
  • Geralmente vai trabalhar com variáveis Texto. Entretanto, pode usar variáveis BLOB. Precisa gerar o BLOB em modo texto sem comprimento

4DHTML  

Sintaxe: <!--#4DHTML NomVar--> ou <!--#4DHTML 4DExpression-->
Sintaxe Alternativa: $4DHTML(VarName) ou $4DHTML(4DExpression) (ver )

Como a etiqueta 4DTEXT, esta etiqueta permite avaliar uma variável ou uma expressão 4D e inseri-la em uma página como uma expressão HTML. Diferente de 4DTEXT, essa tag não escapa caracteres especiais  HTML  (por exemplo. ">").

Por exemplo, esses são os resultados da inserção da variável texto 4D minhavar com as etiquetas disponíveis:

Valor minhavarEtiquetasInserção na página web
minhavar:="<B>"<!--#4DTEXT minhavar-->&lt;B&gt;
minhavar:="<B>"<!--#4DHTML minhavar--><B>
No caso de um erro de interpretação, o texto inserido será da forma “<!--#4DHTML minhavar--> : ## erro # erro code”.

Nota: por razões de segurança, é recomndado usar a tag [#title id="9043" anchor="2880116"/] quando dados processados forem introduzidos de fora da aplicação para prevenir a inserção de código malicioso (Ver a seção [id="9043" anchor="2626229"/]).

Sintaxe: <!--#4DEVAL Nom Var--> o <!--#4DEVAL Expresion4D-->
Sintaxe Alternativa: $4DEVAL(VarName) ou $4DEVAL(4DExpression) (ver )

A etiqueta 4DEVAL permite avaliar uma variável ou uma expressão 4D. Igual que a etiqueta 4DHTML existente, 4DEVAL não escapa os caracteres HTML ao retornar do texto. No entanto, a diferença de 4DHTML ou 4DTEXT, 4DEVAL lhe permite executar qualquer instrução 4D válida, incluindo atribuições e expressões que não devolvem nenhum valor.

Por exemplo, pode executar:

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

Em caso de erro durante a interpretação, o texto inserido será da forma: “<!--#4DEVAL expr-->: ## error # código de erro”.

Nota:F Por razões de segurança, é recomendado usar a tag 4DTEXT quando processando dados introduzidos de fora da aplicação para prevenir a inserção de código malicioso (ver [#title id="9043" anchor="2626229"/].

Sintaxe: <!--#4DSCRIPT/NomeMetodo/MeuParam-->

A etiqueta 4DSCRIPT lhe permite executar métodos 4D no momento do processamento do template. A presença do comentário HTML <!--#4DSCRIPT/MeuMetodo/MeuParam--> provoca a execução do método MeuMétodo com o parâmetro MeuParam como string em $1.

Nota: Se a etiqueta for chamada no contexto de um proceso web, quando carrega a página, 4D chama ao On Web Authentication Database Method (caso exista). Se devolver True, 4D executa o método

O método retorna texto em $0. Se a string começa com o caráter de código 1, se considera como HTML (o mesmo princípio que para a etiqueta 4DHTML).

Por exemplo, insira em uma página web semi dinâmica o comentário “Hoje é<!--#4DSCRIPT/MIMETH/MIPARAM-->”. Quando se carregar a página, 4D chama ao On Web Authentication Database Method (se existir), depois chama ao método MEUMET e passa a string “/MEUPARAM” como parâmetro $1.

O método retorna texto em $0 (por exemplo “12/31/03”); a expressão “Hoje é <!--#4DSCRIPT/MEUMET/MEUPARAM––>  se converte em “Hoje é 12/31/03”.

O código do método MIMET é:

 #Tab/]C_TEXT($0`Este parâmetro sempre deve ser declarado
 C_TEXT($1`Este parâmetro sempre deve ser declarado
 $0:=String(Current date)



Nota
: Um método chamado por 4DSCRIPT não deve chamar elementos de interface (DIALOG, ALERT...).

Como 4D executa os métodos em sua ordem de aparição, é muito possível chamar a um método que define o valor de muitas variáveis que estão referenciadas mais adiante no documento, qualquer que seja o modo que esteja utilizando.

Nota: Pode inserir tantos comentários <!--#4DSCRIPT...--> quantos queira em uma página estática.

Sintaxe: <!--#4DINCLUDE Path-->

Este comentário permite incluir, em uma página HTML, outra página HTML (indicado pelo parâmetro rota). Por padrão só se inclui o corpo da página HTML especificada, ou seja o conteúdo entre as etiquetas <body> e </body> (as etiquetas mesmas não são incluídas). Isso lhe permite evitar conflitos relacionados com as etiquetas presentes nos cabeçalhos. Entretanto se a página HTML especificada não contiver etiquetas <body></body>,  a página completa é incluída. Você deve verificar a consistência das meta etiquetas.

O comentário <!--#4DINCLUDE --> é muito útil para testes (<!--#4DIF-->) ou os loops (<!--#4DLOOP-->). É muito conveniente incluir etiquetas em função de um critério ou de maneira aleatória.
Ao momento da inclusão, sem importar a extensão do nome do arquivo, 4D analiza a página chamada e depois insere os conteúdos (modificados ou não) na página que origina a chamada 4DINCLUDE.

A localização na cachê web de uma página incluída com o comentário <!--#4DINCLUDE --> responde às mesmas regras que as páginas chamadas através um URL ou enviadas com o comando WEB SEND FILE .

Passe em rota, a rota de acesso ao documento a incluir. Advertência: no caso da etiqueta 4DINCLUDE, a rota de acesso é relativa ao documento em curso de análise, ou seja o documento “pai”. Utilize o caractere barra oblíqua (/) como separador de pastas e os dois pontos (..) para subir um nível (sintaxe HTML).

Notas:

  • quando utilizar a etiqueta 4DINCLUDE com o comando PROCESS 4D TAGS, a pasta por padrão é a pasta que contém o arquivo de estrutura do banco.
  • Pode modificar a pasta por padrão utilizada pela etiqueta 4DINCLUDE na página atual, utilizando a etiqueta <!--#4DBASE --> (ver a continuação).

O número de <!--#4DINCLUDE rota--> dentro de uma página é ilimitado. Entretanto, as chamadas a <!--#4DINCLUDE rota--> só podem ser realizadas a um nível. Isso significa que, por exemplo, não pode inserir o comentário <!--#4DINCLUDE meudoc3.html--> no corpo da página meudoc2.html, chamada por <!--#4DINCLUDE meudoc2.html--> inserido em meudoc1.html.

Além disso, 4D verifica que as inclusões não sejam recursivas.

Em caso de erro, o texto inserido é da forma "<!--#4DINCLUDE rota--> :Não se pode abrir o documento".

Exemplos

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

4DBASE  

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

A etiqueta <!--#4DBASE --> cria um diretório provisório que é usado pela etiqueta <!--#4DINCLUDE-->.
Quando for chamada em uma página Web, a etiqueta <!--#4DBASE --> modifica todas as subsequentes chamadas <!--#4DINCLUDE--> nesta página, até a próxima  <!--#4DBASE -->, se exitir. Se a pasta <!--#4DBASE --> for modificada de dentro do arquivo incluido, recupera o valor original do arquivo pai. 

O parâmetro folderPath deve conter um nome de caminho relativo à página atual e deve terminar com uma barra (/). A pasta designada deve estar localizada dentro da pasta Web.
Passe a palavra chave WEBFOLDER para restaurar o caminho padrão (relativo à página). 

Assim o seguinte código (4D v12), que deve especificar um caminho relativo para cada chamada:

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

... pode ser reescrito usando a etiqueta <!--#4DBASE -->:

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

Example  

Definição de um escritório para a página de início utilizando a etiqueta <!--#4DBASE -->:

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

No arquivo head.html, a pasta atual se modifica via <!--#4DBASE -->, sem que mude seu valor em Index.html:

/* Head.htm */
/* o escritório de trabalho aqui é relativo ao arquivo incluído (FR/ ou US/) */
<!--#4DBASE Styles/-->
<!--#4DINCLUDE main.css-->
<!--#4DINCLUDE product.css-->
<!--#4DBASE Scripts/-->
<!--#4DINCLUDE main.js-->
<!--#4DINCLUDE product.js-->

4DCODE  

A etiqueta 4DCODE lhe permite inseri um bloco de código multilinha 4D em uma planilha.

Quando for detectado que uma  sequência "<!--#4DCODE" está seguida por um espaço, um caractere CR ou um LF, 4D interpreta todas as linhas de código até a próxima sequência "-->". O bloco de código em sí mesmo pode conter retornos de carro, saltos de linha, ou ambos; será interpretado sequencialmente por 4D.

Por exemplo, utilizando a etiqueta 4DCODE, pode escrever em uma planilha:

<!--#4DCODE
//PARAMETERS initialization

$graphType:=1
If(OB Is defined:C1231($graphParameters;"graphType")) //Idioma US apenas
    $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: em uma etiqueta 4DCODE, o código 4D sempre deve ser escrito utilizando a linguagem Inglês - Estados Unidos. Portanto, 4DCODE ignora as  preferências de usuário "Utilizar configuração do sistema regional" para a linguagem 4D (ver Linguagem para comandos e constantes).

Estas são as funcionalidades da etiqueta 4DCODE:

  • O comando TRACE é suportado e ativa o depurador 4D, o que lhe permite depurar o código de sua planilha.
  • Qualquer erro será mostrado o diálogo de erro padrão que permite ao usuário deter a execução do código ou introduzir o modo de depuração.
  • O texto entre <!--#4DCODE y --> se divide em linhas que aceitam qualquer convenção de final de linha (cr, lf, o crlf).
  • O texto se tokeniza dentro do contexto do banco de dados que o chamou PROCESS 4D TAGS. Isto é importante para o reconheciminto dos métodos de projeto, por exemplo.
    Nota: a propriedade do método "Disponível por etiquetas 4D tags e URLs 4DACTION"  não é levada em conta (ver também a Nota de segurança mais abaixo).
  • Mesmo se o texto sempre utiliza Inglês - Estados Unidos, se recomenda utilizar a sintaxe de token (:Cxxx) para nomes de comandos e de constantes para proteger contra potenciais problemas  por  comandos ou constantes renomeados de uma versão de 4D a outra.
    Nota: para mais informação  sobre: sintaxis Cxxx, consulte Usar tokens em fórmulas.

Nota de segurança: o fato de que as etiquetas 4DCODE possam chamar a qualquer um dos comandos da linguagem 4D ou aos métodos de projeto poderiam ser vistos como um problema de segurança, especialmente quando o banco de dados estiver disponível através de HTTP. Entretanto, já que executa o código do lado do servidor chamado desde seus próprios arquivos de planilha, a etiqueta em si não representa um problema de segurança. Neste contexto, como para qualquer servidor Web, a segurança é manejada principalmente ao nível de acessos remotos aos arquivos do servidor.

Sintaxe: <!--#4DIF expression--> {<!--#4DELSEIF expression2-->...<!--#4DELSEIF expressionN-->} {<!--#4DELSE-->} <!--#4DENDIF-->

Utilizado com os comentários <!--#4DELSEIF--> (opcional), <!--#4DELSE--> (opcional) e <!--#4DENDIF-->, o comentário <!--#4DIF expression--> oferece a possibilidade de executar partes de código de maneira condicional.

O parâmetro expressao pode conter toda expressão 4D válida devolvendo um valor booleano. Deve estar entre parêntese e cumprir com as regras de sintaxe de 4D.

Os bloqueios <!--#4DIF expression--> ... <!--#4DENDIF--> podem estar aninhados em vários níveis. Como em 4D, cada <!--#4DIF expression--> deve ter um <!--#4DENDIF--> correspondente.

Em caso de um erro de interpretação, o texto “<!--#4DIF expresion-->: se esperava uma expressão booleana” se insere em lugar do conteúdo situado entre <!--#4DIF --> e <!--#4DENDIF-->.

Da mesma forma, se não há tantos <!--#4DENDIF--> como <!--#4DIF -->, o texto “<!--#4DIF expresion-->: 4DENDIF esperado” se insere em lugar dos conteúdos localizados entre <!--#4DIF --> e <!--#4DENDIF-->.

Utilizando a etiqueta <!--#4DELSEIF-->, pode provar um número ilimitado de condições. Só se executa o conteúdo que segue a primeira condição avaliada como True. Se nenhuma condição é verdadeiro, não se executa nenhuma instrução (se não há <!--#4DELSE--> final).
Pode utilizar uma etiqueta <!--#4DELSE--> depois da última <!--#4DELSEIF-->. Se todas as condições são falsas, as instruções seguintes a <!--#4DELSE--> se executam.

Os seguintes dois códigos são equivalentes.

  • Código utilizando unicamente 4DELSE:
    <!--#4DIF Condition1-->
      /* Condition1 es true*/
    <!--#4DELSE-->
        <!--#4DIF Condition2-->
            /* Condition2 es true*/
        <!--#4DELSE-->
            <!--#4DIF Condition3-->
                /* Condition3 es true */
            <!--#4DELSE-->
                /*Nenhuma das condições é verdadeira*/
            <!--#4DENDIF-->
        <!--#4DENDIF-->
    <!--#4DENDIF-->
  • Código similar utilizando a etiqueta 4DELSEIF:
    <!--#4DIF Condition1-->
         /* Condition1 é true*/
    <!--#4DELSEIF Condition2-->
         /* Condition2 é true*/
    <!--#4DELSEIF Condition3-->
        /* Condition3 é true */
    <!--#4DELSE-->
        /* Nenhuma das condições é verdadeira*/
    <!--#4DENDIF-->

Esse exemplo de código inserido em uma página de HTML estática exibe uma etiqueta diferente de acordo com o resultado da expressão  vname#""

<BODY>
...
<!--#4DIF (vname#"")-->
Nomes que começam com <!--#4DTEXT vname-->.
<!--#4DELSE-->
Nenhum nome foi encontrado.
<!--#4DENDIF-->
...
</BODY>

Este exemplo insere páginas diferentes em função do usuário conectado:

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

Sintaxe: <!--#4DLOOP condition--> <!--#4DENDLOOP-->

Este comentário permite a repetição de uma parte de código HTML desde que se cumpra a condição. A porção está delimitada por <!--#4DLOOP--> e <!--#4DENDLOOP-->.

Os blocos <!--#4DLOOP condicion--> ... <!--#4DENDLOOP--> podem estar aninhados. Como em 4D, cada <!--#4DLOOP condicion--> deve ter um <!--#4DENDLOOP--> correspondente.

Há cinco tipos de condições:

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

    Esta sintaxe realiza um loop para cada registro desde a seleção atual da tabela no processo atual. A porção de código HTML localizada entre os dois comentários se repite para cada registro da seleção atual.

Nota: quando a etiqueta 4DLOOP se utiliza com uma tabela, os registros se carregam em modo só leitura.

O exemplo de código seguinte:

<!--#4DLOOP [Pessoas]-->
<!--#4DTEXT [Pessoas]Nome--> <!--#4DVAR [Pessoas]Sobrenome-><BR>
<!--#4DENDLOOP-->


... pode ser traduzido em linguagem 4D como:

 FIRST RECORD([Pessoas])
 While(Not(End selection([Pessoas])))
    ...
    NEXT RECORD([Pessoas])
 End while
  • <!--#4DLOOP array-->
Esta sintaxe realiza um loop para cada elemento do array. O elemento atual do array se incrementa quando se repete a porção de código HTML.

Nota: esta sintaxe não pode ser utilizada com arrays de duas dimensões. Neste caso, é melhor combinar um método com loops aninhados.

O seguinte exemplo de código:

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

... pode ser traduzida em linguagem 4D da seguinte maneira:

 For($Elem;1;Size of array(arr_names))
    arr_names:=$Elem
    ...
 End for
  • <!--#4DLOOP metodo-->
Esta sintaxe realiza um loop enquanto o método retorna True. O método admite um parâmetro de tipo Inteiro longo. Primeiro se chama com o valor 0 para permitir uma fase de inicialização (se for necessária); depois se chama com os valores 1, 2, 3, ... enquanto retorna True.

Por razões de segurança, no contexto de um processo web On Web Authentication database method pode ser chamada, só uma única vez, antes da fase de inicialização (execução do método com 0 como parâmetro). Se se confirma a autenticação, se se realiza a fase de inicialização.

Advertência
: C_BOOLEAN($0) e C_LONGINT($1) DEVEM ser declaradas dentro do método por motivos de compilação.

O exemplo de código seguinte:

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

... pode ser traduzida em linguagem 4D da seguinte maneira:

 If(AuthenticationWebOK)
    If(meu_metodo(0))
       $counter:=1
       While(meu_metodo($counter))
          ...
          $counter:=$counter+1
       End while
    End if
 End if

O método meu_metodo pode ser realizado dessa forma:

 C_LONGINT($1)
 C_BOOLEAN($0)
 If($1=0)
  `Initialisação
    $0:=True
 Else
    If($1<50)
       ...
       var:=...
       $0:=True
    Else
       $0:=False `Para o loop
    End if
 End if
  • <!--#4DLOOP 4DExpression-->
    Com esta sintaxe, a etiqueta 4DLOOP realiza um loop sempre que a expressão 4D devolva True. A expressão pode ser toda expressão booleana válida e deve conter uma parte variável a avaliar em cada loop para evitar loops infinitos.
    Por exemplo, o seguinte código:

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

produz o seguinte resultado:

0
1
2
3

  • <!--#4DLOOP pointerArray-->
    Neste caso, a etiqueta 4DLOOP funciona como é feito com um array: faz um loop para cada elemento do array referenciado pelo ponteiro. O elemento do array atual se incrementa cada vez que a porção de código se repete.
    Esta sintaxe é útil quando se passa um ponteiro array como parâmetro ao comando PROCESS 4D TAGS.
    Exemplo:

 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 "

Em caso de um erro de interpretação, o texto “<!--#4DLOOP expression-->: Descrição” é inserido em vez do conteúdo localizado entre <!--#4DLOOP --> e <!--#4DENDLOOP-->.

Pode aparecer uma das seguintes mensagens:
- Não se esperava uma expressão deste tipo (erro padrão)
- Nome de tabela incorreto (erro no nome da tabela)
- Um array era esperado (a variável não é um array ou é um array de duas dimensões)
- O método não existe
- Erro de sintaxe (quando o método for executado)
- Erro de acesso (não tem os privilégios de acesso apropriados para acessar a tabela ou ao método)
- 4DENDLOOP esperado (o número de <!--#4DENDLOOP--> não corresponde a <!--#4DLOOP -->).

Varias etiquetas de transformação 4D existentes podem ser expressas utilizando uma sintaxe baseada em $:
$4dtag (expression) se pode utilizar em lugar de <!--#4dtag expression-->

Condições requeridas
A sintaxe $ só pode ser utilizada com certas etiquetas e em certos contextos de avaliação:

  • Etiquetas
    Só as etiquetas utilizadas para devolver os valores processados aceitam esta sintaxe:
    • 4DTEXT
    • 4DHTML
    • 4DEVAL
  • Avaluação
    A sintaxe $ dispara a avaliação de etiquetas por 4D só em casos onde a avaliação é explícita:
    • comando PROCESS 4D TAGS 
    • páginas estáticas .shtml servidas diretamente pelo servidor web por meio de URLs
    • páginas inseridas por meio da etiqueta 4DINCLUDE

Para as outras etiquetas (4DIF, 4DSCRIPT, etc.) e em outros contextos de avaliação (comandos WEB SEND FILE, WEB SEND BLOB e WEB SEND TEXT), a sintaxe $ não é suportada e é necessário utilizar a sintaxe regular).

Uso

Por exemplo, pode escrever:

ERROR: missing ')'

Em lugar de:

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

A principal vantagem desta sintaxe é que lhe permite escrever planilhas de acordo com a norma XML. Alguns desenvolvedores 4D necessitam para criar e validar as planilhas baseadas em XML utilizando editores padrão. Dado que o caractere "<" não é válido em um valor de atributo XML, não é possível utilizar a sintaxe "<!-- -->" para as etiquetas 4D sem romper a sintaxe do documento. Por outra parte, evadir o caractere "<" impedirá que 4D de interpretar as etiquetas corretamente.

Por exemplo, o seguinte código poderia causar um erro de análise XML devido ao primeiro caractere "<" no valor do atributo:

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

Utilizando a sintaxe $, o seguinte código é validado pelo analizador:

<line x1="" y1=""/>

Note que as sintaxes $4dtag y <--#4dtag --> não são estritamente equivalentes: diferentea de <--#4dtag -->, o processamento de $4dtag não interpreta etiquetas 4D de manera recursiva. As etiquetas $ sempre são avaliadas uma unica vez e o resultado é considerado como texto plano.

Nota: para mais informação sobre o processamento recursivo, por favor consulte o parágrafo .

A razão desta diferença é evitar a injeção de código malicioso. Como se explica mais adiante, se recomenda encarecidamente o uso de etiquetas 4DTEXT ao invés de etiquetas 4DHTML ao manipular texto de usuário para proteger contra a reinterpretação não desejada de etiquetas: com 4DTEXT, os caracteres especiais como "<" são escapados, portanto, toda etiqueta 4D que utilize a sintaxe <!--#4dtag expression -->  perderá seu significado particular. Entretanto, como 4DTEXT não escapa o símbolo $, decidimos romper o suporte para a recursividade com o fim de evitar a injeção maliciosa utilizando a sintaxe $4dtag (expression).

Os seguintes exemplos mostram o resultado do processamento em função da sintaxe e a etiqueta utilizada:

  // exemplo 1
 myName:="<!--#4DHTML QUIT 4D-->" //injeção maliciosa
 input:="My name is: <!--#4DHTML myName-->"
 PROCESS 4D TAGS(input;output)
  //4D fechará!

  // exemplo 2
 myName:="<!--#4DHTML QUIT 4D-->" //injeção maliciosa
 input:="My name is: <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //a saida é "My name is:  & lt;!--#4DHTML QUIT 4D-->"

  // exemplo 3
 myName:="" ///injeção maliciosa
 input:="My name is: <!--#4DTEXT myName-->"
 PROCESS 4D TAGS(input;output)
  //a saida é "My name is: ERROR: missing ')'"

Note que a sintaxes $4dtag suporta pares complementares de aspas ou parênteses. Por exemplo, suponha que necessita avaliar a string complexa seguinte (exemplo teórico):

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

Poede escrever:

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

 
PROPRIEDADES 

Produto: 4D
Tema: String

 
HISTÓRIA 

Modificado: 4D v15 R4

 
PALAVRAS CHAVES 

4DHTML, 4DVAR, 4DTEXT, 4DHTMLVAR, 4DIF, 4DSCRIPT, 4DLOOP, 4DELSEIF, 4DINCLUDE

 
ARTICLE USAGE

Manual de linguagem 4D ( 4D v16)
Manual de linguagem 4D ( 4D v16.1)
Manual de linguagem 4D ( 4D v16.2)
Manual de linguagem 4D ( 4D v16.3)