4D v16Etiquetas HTML 4D |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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>
A análise do conteúdo das páginas "templates" podem ser feitas de duas maneiras:
A tabela abaixo lista as tags (etiquetas) de transformação 4D disponíveis. Para mais detalhes, veja a descrição das tags abaixo.
(*)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 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> 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--> 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. ">").
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--> 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 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
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. 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. 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. Exemplos
Syntax: <!--#4DBASE folderPath--> A etiqueta <!--#4DBASE --> cria um diretório provisório que é usado pela etiqueta <!--#4DINCLUDE-->. 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. 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 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). Os seguintes dois códigos são equivalentes.
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.
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])
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))
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) O método meu_metodo pode ser realizado dessa forma: C_LONGINT($1)
<!--#4DEVAL $i:=0--> <!--#4DLOOP ($i<4)--> <!--#4DEVAL $i--> <!--#4DEVAL $i:=$i+1--> <!--#4DENDLOOP-->
0
ARRAY TEXT($array;2) 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-->. Varias etiquetas de transformação 4D existentes podem ser expressas utilizando uma sintaxe baseada em $: Condições requeridas
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 // exemplo 2 // exemplo 3 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)\\\"\")"
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||