4D v15.4Etiquetas HTML 4D |
|||||||||||
|
4D v15.4
Etiquetas HTML 4D
|
Valor minhavar | Etiquetas | Inserção na página web |
minhavar:="<B>" | <!--#4DTEXT minhavar--> | <B> |
minhavar:="<B>" | <!--#4DHTML minhavar--> | <B> |
As expressões podem conter funções 4D, tais como por exemplo, Current date. Neste caso, recomendamos utilizar uma referência de tipo "<nom_comando>:C<num_comando>", para garantir que a expressão seja sempre interpretada corretamente (ver Referenciar os comandos 4D nas etiquetas).
No caso de um erro de interpretação, o texto inserido será da forma “<!--#4DHTML minhavar--> : ## erro # erro code”.Nota: A execução de um método 4D com 4DHTML desde uma petição web depende do valor do atributo “Disponível através as etiquetas e URLs 4D (4DATION...)” definido nas propriedades do método. Para maior informação consulte a seção Conexões de Segurança.
Nota de compatibilidade: Essa etiqueta substitui 4DHTMLVAR a partir da versão 12.2 de 4D. A etiqueta 4DHTMLVAR ainda é compatível, mas devido a legibilidade de código, é recomendado usar a etiqueta 4DHTML para inserir no código HTML
Sintaxe: <!--#4DEVAL Nom Var--> o <!--#4DEVAL Expresion4D-->
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"
As expressões podem conter funções de 4D, tais como, por exemplo, Current date. Neste caso, lhe recomendamos que utilize uma referência do tipo "<nom_comando>:C<num_comando>", com o propósito de garantir que a expressão sempre seja interpretada corretamente (ver Referenciar os comandos 4D nas etiquetas).
Em caso de erro durante a interpretação, o texto inserido será da forma: “<!--#4DEVAL expr-->: ## error # código de erro”.
Nota: a execução de um método 4D com 4DEVAL desde uma solicitação web requer que a opção "Disponível através das etiquetas e URLs 4D (4DACTION ...)" se encontre definida nas propriedades do método. Para obter mais informação, consulte a seção Conexões de Segurança.
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).
Nota: A execução de um método com 4DSCRIPT depende do valor do atributo “Disponível através das etiquetas e URLs 4D (4DATION...)” definido nas propriedades do método. Para maior informação, consulte a seção Conexões de Segurança.
As análises dos conteúdos da página é feita quando WEB SEND FILE (.htm, .html, .shtm, .shtml) ou WEB SEND BLOB (blob de tipo text/html) for chamada.
Lembre que em modo não contextual, a análise é também feita quando uma URL aponta para um arquivo que tenha a extensão “.shtm” ou “.shtml” (por exemplo http://www.server.com/dir/page.shtm).
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-->
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-->
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-->
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>
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 -->).
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.
Ações URL e Formulário
Binding 4D objects with HTML objects
Páginas semi dinâmicas
PROCESS 4D TAGS
Produto: 4D
Tema: String
4DVAR, 4DTEXT, 4DHTMLVAR, 4DHTML, 4DSCRIPT, 4DINCLUDE, 4DIF, 4DLOOP, 4DELSEIF
Manual de linguagem 4D ( 4D v15.4)
Manual de linguagem 4D ( 4D v15)
Manual de linguagem 4D ( 4D v15.3)