4D v16.3Etiquetas HTML 4D |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v16.3
Etiquetas HTML 4D
|
Tag | Ação | Exemplo | $ Sintaxe(*) | Comentários |
4DTEXT | Insere variáveis 4D e expressões como texto | <!--#4DTEXT [Customer]Name--> | X | Recomendado se dados processados externamente de modo a evitar inserção de código malicioso |
4DHTML | Insere código HTML | <!--#4DHTML <br/>--> | X | Não é recomendado se dados são processados externamente |
4DEVAL | Avalia expressões 4D | <!--#4DEVAL a:=20--> | X | Não é recomendado se dados são processados externamente |
4DSCRIPT/ | Executa um método 4D com um parâmetro | <!--#4DSCRIPT/MyMethod/MyParam--> | ||
4DINCLUDE | Inclui uma página HTML dentro de outra | <!--#4DINCLUDE subpage.html--> | ||
4DBASE | Designa o arquivo usado por 4DINCLUDE | <!--#4DBASE ../file/--> | ||
4DCODE | Insere código 4D | <!--#4DCODE ALERT(myVar)--> | Suporta CR, LF (blocos de código 4D) | |
4DIF, 4DELSE, 4DELSEIF, 4DENDIF | Insere condições no código com etiquetas | <!--#4DIF (myVar=1)--> | ||
4DLOOP, 4DENDLOOP | Inserr 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, "<!--#4DEVAL QUIT 4D-->" 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:
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.
Em caso de erro de interpretação, o texto inserido será da forma “<!--#4DTEXT myvar--> : ## erro # erro code”.
Notas: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 minhavar | Etiquetas | Inserção na página web |
minhavar:="<B>" | <!--#4DTEXT minhavar--> | <B> |
minhavar:="<B>" | <!--#4DHTML minhavar--> | <B> |
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.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)
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 .
Notas:
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-->
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-->
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-->
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:
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.
<!--#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-->
<!--#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-->
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:
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-->
FIRST RECORD([Pessoas])
While(Not(End selection([Pessoas])))
...
NEXT RECORD([Pessoas])
End while
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 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
<!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP-->
produz o seguinte resultado:
0
1
2
3
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:
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)-->
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)"
Ações URL e Formulário
Binding 4D objects with HTML objects
Páginas semi dinâmicas
PROCESS 4D TAGS
Produto: 4D
Tema: String
Modificado: 4D v15 R4
4DHTML, 4DVAR, 4DTEXT, 4DHTMLVAR, 4DIF, 4DSCRIPT, 4DLOOP, 4DELSEIF, 4DINCLUDE
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)