cffaq.com


Hospedado e mantido por Ben Forta. Design por Trilemetry.
Idioma:
    © 2002-2007 Ben Forta. All Rights Reserved  
<Principal> <FAQ: CFML (ColdFusion Markup Language)> <Sobre>

Perguntas

1: Quando exatamente as variáveis ou expressões devem estar envolvidas pelo caractere #?  
2: Quando eu uso # para definir cores (por exemplo #FF00FF) o ColdFusion me retorna um erro. Como corrigir isso?  
3: Por que eu vejo algo como #var# no meu código gerado ao invés do valor da variável que defini?  
4: Para quê é usado o Verity?  
5: As tags condicionais do CFML podem ser aninhadas?  
6: Existe alguma maneira de se saber o nome do arquivo que está sendo executado?  
7: Eu quero disponibilizar um formulário de envio de mensagens no meu site para que o visitante possa contatar o webmaster. Uma vez que o visitante esteja navegando pelo site o link para envio da mensagem vai estar sempre presente. Uma vez que o usuário preencha o formulário e envie a mensagem eu gostaria de redirecioná-lo de volta para a página onde ele estava antes disso. Como eu posso saber qual a página que o visitante estava e redirecioná-lo de volta?  
8: Por que quando eu estou usando listas do ColdFusion delimitadas por vírgulas os elementos vazios são ignorados?  
9: Quando e porquê aspas simples são necessárias em comandos SQL dentro de uma tag <CFQUERY>?  
10: Eu devo usar as tags <CFINSERT> e <CFUPDATE>?  
11: O meu servidor de e-mail requer que eu faça autenticação para enviar e-mail. Como eu posso mandar e-mail a partir do ColdFusion usando autenticação de e-mail?  
12: É possível gerar um e-mail usando tanto o formato texto puro quanto o HTML na mesma mensagem?  
13: É possível gerar um e-mail usando tanto o formato texto puro quanto o HTML na mesma mensagem?  
14: Como eu posso obter a data, hora ou tamanho de um arquivo?  
15: O ColdFusion pode ler ou acessar arquivos no computador cliente?  
16: O ColdFusion pode determinar o usuário o qual um cliente está logado?  
17: Como eu posso transferir arquivos entre o browser cliente e o servidor ColdFusion?  
18: Como eu crio um formulário para poder fazer upload de arquivos via HTTP file upload?  
19: Como eu acesso e processo os arquivos uploadados?  
20: O que é o escopo REQUEST?  
21: Como eu devo fazer para encerrar sessões quando o browser é fechado?  
22: Quando eu devo usar <CFLOCK>?  
23: Qual é a diferença entre locks do tipo EXCLUSIVE e do tipo READONLY?  
24: Como eu posso criar uma variável usando como nome uma outra variável?  
25: Como eu posso obter o valor de uma variável com o nome criado a partir de uma outra variável?  
26: Como eu posso obter uma lista das colunas retornadas numa query?  
27: Como eu posso obter uma listagem dos campos de formulário existentes (escopo FORM) ou parametros especificados na URL (escopo URL)?  
28: Como eu posso ter acesso a um dado específico da minha query?  
29: Como eu posso gerar arquivos PDF para impressão usando o ColdFusion?  


FAQ

1: Quando exatamente as variáveis ou expressões devem estar envolvidas pelo caractere #?
Em CFML, o # é usado para marcar o começo ou o fim de uma variável ou expressão, distinguindo-a dessa forma de strings. Assim, um bloco entre <CFOUTPUT> e </CFOUTPUT> (que na essência é uma string grande), todas as variáveis e expressões devem estar envolvidas pelo caractere #. Entretanto, dentro de tags, qualquer dado é interpretado como sendo uma variável ou uma expressão e não uma string, por isso <CFSET x=y+1> não precisa do # envolvendo x e y. A regra é simples: use o # quando o ColdFusion deve assumir que o dado é uma string.
2: Quando eu uso # para definir cores (por exemplo #FF00FF) o ColdFusion me retorna um erro. Como corrigir isso?
O caractere # tem um significado especial para o ColdFusion, ele é usado para delimitar uma variável ou expressão. Se o ColdFusion encontra o caractere # sozinho, ele espera encontrar um outro igual no final da variável ou expressão. Para usar o caractere # propriamente dito, você precisa detê-lo (escape) usando dois caracteres # ao invés de somente um. Dessa maneira o exemplo da questão ficaria como ##FF00FF.
3: Por que eu vejo algo como #var# no meu código gerado ao invés do valor da variável que defini?
Isso, na grande maioria das vezes, é causado pela ausência da tag <CFOUTPUT> e seu fechamento </CFOUTPUT> envolvendo a variável.
4: Para quê é usado o Verity?
O Verity é uma ferramenta de busca. O Verity é usado para realizar buscas flexíveis em textos específicos, e ele o faz com grande velocidade. O Verity (que vêm com o ColdFusion) é usado de duas maneiras: 1) Você pode usar o Verity para buscar arquivos no disco contendo um determinado conteúdo (arquivos de texto, Microsoft Word e muitos outros), 2) O Verity pode ser usado para buscar textos específicos em bancos de dados, especialmente em campos do tipo memo ou text, que são normalmente bem longos. Buscas usando o Verity são feitas usando a tag ColdFusion <CFSEARCH>.
5: As tags condicionais do CFML podem ser aninhadas?
Sim, tags condicionais e de fluxo do CFML (como <CFIF> e <CFLOOP>) podem ser aninhadas (usadas dentro de outras tags). Entretanto aninhamentos profundos (muitas vezes) podem impactar na perfomance, por isso não aninhe tags muitas vezes quando não for estritamente necessário.
6: Existe alguma maneira de se saber o nome do arquivo que está sendo executado?
Existem algumas maneiras: a variável cgi.script_name se refere tanto ao caminho quanto ao nome do arquivo, portanto se você estiver executando o arquivo "foo.cfm" dentro de uma pasta raiz chamada "stuff", o valor de cgi.script_name será /stuff/foo.cfm. Outra variável cgi, cgi.cf_template_path, se refere ao caminho completo desde a raiz do disco para o arquivo em questão. Você também pode utilizar a função getCurrentTemplatePath, que retornará o mesmo valor de cgi.cf_template_path. Se você quiser saber apenas o nome do arquivo de todas estas alternativas, basta fazer uso da função getFileFromPath. Como por exemplo: #getFileFromPath(getCurrentTemplatePath())#
7: Eu quero disponibilizar um formulário de envio de mensagens no meu site para que o visitante possa contatar o webmaster. Uma vez que o visitante esteja navegando pelo site o link para envio da mensagem vai estar sempre presente. Uma vez que o usuário preencha o formulário e envie a mensagem eu gostaria de redirecioná-lo de volta para a página onde ele estava antes disso. Como eu posso saber qual a página que o visitante estava e redirecioná-lo de volta? Comments
Quando você criar o link para o formulário de contato, simplesmente adicione como um atributo URL o nome da página/template que ele estava antes. Por exemplo: <cfset ref=cgi.script_name&"?"&cgi.query_string><a href="contato.cfm?ref=#urlEncodedFormat(ref)#">. Na página de formulário armazene a variável "url.ref" num campo hidden e no template de ação (cfmail) use esta informação para redirecioná-lo de volta a onde estava usando a tag CFLOCATION. Este procedimento pode ser adotado nos casos onde o login de um usuário expira e ele é forçado a se logar, retornando exatamente ao ponto onde estava antes de perder a sessão.
8: Por que quando eu estou usando listas do ColdFusion delimitadas por vírgulas os elementos vazios são ignorados? Comments
As listas do ColdFusion não são do tipo CSV (comma-delimited lists) e portanto não se comportam como listas CSV. O ColdFusion ignora elementos vazios numa lista, dessa forma a função ListLen("a,b,,d,e") irá retornar 4 e não 5. Da mesma maneira a função ListGetAt("a,b,,d,e", 5) irá retornar um erro. Para converter uma lista ColdFusion para uma do tipo CSV, você deve usar a função Replace() e substituir todos os ",," (vírgula e vírgula) por ", ," (vírgula, espaço e vírgula). Um espaço é um elemento válido numa lista para o ColdFusion que por isso mesmo não irá ignorá-lo.
9: Quando e porquê aspas simples são necessárias em comandos SQL dentro de uma tag <CFQUERY>?
Todo o conteúdo entre <CFQUERY> e </CFQUERY> é enviado para o banco de dados por meio do driver deste tal como especificado/escrito. Diferentemente da CFML, SQL não é uma linguagem "typeless" e por isso os comandos SQL devem estar validados de acordo com as especificação SQL do driver específico. Todas as strings (ou variáveis contendo valores no formato de strings) devem estar especificadas entre aspas simples. Já os valores numéricos não devem estar entre aspas simples, data e horários devem estar formatados como tal, etc.
10: Eu devo usar as tags <CFINSERT> e <CFUPDATE>?
Se você puder, absolutamente, não há razão para não usá-las. Entretanto fique ciente de que estas tags possuem algumas limitações significativas - elas só funcionam com formulários (FORM), estes campos FORM devem estar nomeados com exatamente como os respectivos campos nas tabelas, você não poderá manipular os valores destas e, quando estiver atualizando/alterando os valores, a chave primária (primary key) do banco de dados deve estar contida no FORM (provavelmente como um campo do tipo hidden).
11: O meu servidor de e-mail requer que eu faça autenticação para enviar e-mail. Como eu posso mandar e-mail a partir do ColdFusion usando autenticação de e-mail?
O suporte para autenticação SMTP foi adicionado ao ColdFusion MX 6.1. Você deve pode tanto informar o login na sua tag <CFMAIL> usando os atributos USERNAME e PASSWORD ou então especificá-los diretamente no ColdFusion Administrator usando a sintaxe: usuario:senha@pop.servidor.com
12: É possível gerar um e-mail usando tanto o formato texto puro quanto o HTML na mesma mensagem?
Isso é possível com o ColdFusion MX 6.1 usando a nova tag <CFMAILPART>. O seguinte código abaixo demonstra como fazer uso desta nova tag:
<CFMAIL TO="..." FROM="..." SUBJECT="...">
   <CFMAILPART TYPE="text">
   This is the text version.
   </CFMAILPART>
   <CFMAILPART TYPE="html">
   <B>This is the HTML version.</B>
   </CFMAILPART>
</CFMAIL>
13: É possível gerar um e-mail usando tanto o formato texto puro quanto o HTML na mesma mensagem?
Isso é possível com o ColdFusion MX 6.1 usando a nova tag <CFMAILPART>. O seguinte código abaixo demonstra como fazer uso desta nova tag:
<CFMAIL TO="..." FROM="..." SUBJECT="...">
   <CFMAILPART TYPE="text">
   Esse é a mensagem em formato texto puro.
   </CFMAILPART>
   <CFMAILPART TYPE="html">
   <B>Essa é a mensagem em formato HTML.</B>
   </CFMAILPART>
</CFMAIL>
14: Como eu posso obter a data, hora ou tamanho de um arquivo?
A tag <CFDIRECTORY> é usada para acesso e manipulação de pastas/diretórios. ACTION="list" retorna a data (date), hora (time), tamanho (size) bem como outros atributos de arquivos.
15: O ColdFusion pode ler ou acessar arquivos no computador cliente?
Não, o ColdFusion roda no servidor e não pode acessar nada no cliente. Na verdade as únicas informações que o ColdFusion pode acessar no cliente são aquelas enviadas pelo browser, nada mais. Dessa maneira o ColdFusion não tem acesso a, por exemplo, arquivos do tipo Access, Word, imagens, ou qualquer outro a não ser que estes sejam explicitamente "uploadados" para o servidor onde o ColdFusion está instalado.
16: O ColdFusion pode determinar o usuário o qual um cliente está logado?
Os desenvolvedores com toda certeza adorariam ter a possibilidade de determinar dinamicamente as informações de login usadas pelo cliente em seu destktop para controlar suas aplicações. Infelizmente essa informação não está disponível para tecnologias server-side como o ColdFusion (se estiverem, isso representa um grande risco de segurança). A única maneira de fazer isso e acessar essa informação é ter alguma aplicação rodando no cliente (talvez um applet Java ou um ActiveX, por exemplo) e retornar essa informação para você.
17: Como eu posso transferir arquivos entre o browser cliente e o servidor ColdFusion?
A maneira mais segura e simples de se transferir um arquivo do computador cliente para o servidor ColdFusion é por meio do upload do tipo "HTTP file upload". O ColdFusion tem a capacidade de acessar arquivos tanto via HTTP quanto via FTP, porém para que isso aconteça o computador cliente deve ter instalado um servidor do tipo HTTP ou FTP, o que obviamente não acontece com a grande maioria.
18: Como eu crio um formulário para poder fazer upload de arquivos via HTTP file upload?
Você deverá criar um formulário e setar, na definição de <FORM>, o valor ENCTYPE igual a "multiform/form-data", definindo em seguida um campo do tipo TYPE="file". Quando este formulário for mostrado no browser ele terá um botão para seleção de arquivo. Quando este formulário for submetido o arquivo será uploadado para o ColdFusion. Um exemplo é mostrado abaixo:
<FORM ACTION="process.cfm"
      ENCTYPE="multipart/form-data"
      METHOD="post">
Arquivo: <INPUT TYPE="file" NAME="ArquivoParaUpload">
<BR>
<INPUT TYPE="submit" VALUE="Upload">
19: Como eu acesso e processo os arquivos uploadados?
Arquivos uploadados em HTML são acessados usando a tag <CFFILE ACTION="upload">. Esta tag possibilita a você salvar o arquivo uploadado, renomeá-lo, aceitar somente certos tipos de arquivos e muito mais.
20: O que é o escopo REQUEST?
O escopo REQUEST é similar ao escopo VARIABLES (local) na medida em que ele somente é válido durante o processamento do request em questão. A diferença entre o REQUEST e o VARIABLES é que qualquer variável definida sob o escopo REQUEST estará disponível para outros arquivos sendo processados, tal como uma Custom Tag.
21: Como eu devo fazer para encerrar sessões quando o browser é fechado?
No ColdFusion MX isso é feito de forma muito simples. Basta você ir no ColdFusion Administrator, selecionar "Memory Variables" e marcar a opção "Use J2EE session variables". Em versões anteriores, as variáveis de sessão do ColdFusion usam cookies (chamados CFIDE e CFTOKEN) para identificar os clientes. Por padrão, estes cookies são armazenados no disco e por isso as sessões perssistem mesmo após o fechamento do browser. Para previnir este comportamento, simplesmente reescreva os cookies para que eles se transformem em "browser cookies" (cookies que expiram quando fechamos o browser). O código abaixo exemplifica como você pode fazer isso:
<CFCOOKIE NAME="cfid" VALUE="#SESSION.cfid#">
<CFCOOKIE NAME="cftoken" VALUE="#SESSION.cftoken#">
22: Quando eu devo usar <CFLOCK>?
A função da tag <CLFLOCK> é a de controlar o acesso simultâneo de um pedaço de código ou mesmo de um escopo inteiro de variável. Versões anteriores do ColdFusion (pré CFMX) tinham uma limitação em que acessos simultâneos não protegidos à variáveis compartilhadas (como SESSION ou APPLICATION) podiam resultar em acessos indevidos à memória do servidor e, como consequência, falha do mesmo. Isso já não acontece com o ColdFusion MX, porém ainda existem casos onde devemos usar a tag <CFLOCK>. Primeiramente qualquer código que não é feito para acesso multi-usuário (tags de terceiros, acesso a arquivos de sistema, etc) deve ser protegido para garantir o acesso de forma sequenciada (em oposição ao acesso concorrente). Depois, mesmo que o acesso à variáveis compartilhadas não cause problemas no servidor, ele pode causar problemas de inconsistência na sua aplicação. Por exemplo, se uma aplicação atualiza um valor de uma variável do tipo APPLICATION e o código para esta atualização não está protegido com o lock, existe a possibilidade de usuários acessarem valores antigos (ainda não atualizados) e ao mesmo tempo valores novos (já atualizados). Talvez isso não seja um problema, dependendo da sua aplicação, porém se isso estiver afetando-a, é o caso de usar <CFLOCK>.
23: Qual é a diferença entre locks do tipo EXCLUSIVE e do tipo READONLY?
<CFLOCK> suporta dois tipos de locks, EXCLUSIVE e READONLY. Um lock do tipo EXCLUSIVE protege um bloco de código contra qualquer acesso simultâneo. Já um lock do tipo READONLY é, na verdade, muito mais uma "flag" que marca se determinado bloco pode ou não ser executado, dependendo da existência um lock do tipo EXCLUSIVE ativo no momento. É importante usar o READONLY no seu código porque sem ele o ColdFusion pode acessar este bloco de código mesmo quando existir um lock EXCLUSIVE ativo. Isso acontece obviamente porque o ColdFusion não terá como saber se o bloco pode ou não ser acessado naquele momento.
24: Como eu posso criar uma variável usando como nome uma outra variável?
A "manha" é definir o nome completo da variável entre aspas (duplas), colocando parte deste como um sendo uma variável existente (envolvida com o caractere #). Veja o exemplo abaixo:
<!--- Set i --->
<CFSET i=1>
<!--- Cria a variável product1 de forma dinâmica --->
<CFSET "produto#i#"="maça">
<!--- Mostra a variável produto1 --->
<CFOUTPUT>#produto1#</CFOUTPUT>
25: Como eu posso obter o valor de uma variável com o nome criado a partir de uma outra variável?
As variáveis podem ter nomes feitos dinâmicamente (a partir de outra variável) e o seu valor pode ser obtido usando a função Evaluate(). Veja o exemplo abaixo:
<!--- Define i --->
<CFSET i=1>
<!--- Mostra a variável produto1 --->
<CFOUTPUT>#Evaluate("produto#i#")#</CFOUTPUT>
26: Como eu posso obter uma lista das colunas retornadas numa query?
Toda query contém um membro chamado "columnlist" que pode ser acessado como query.columnlist.
27: Como eu posso obter uma listagem dos campos de formulário existentes (escopo FORM) ou parametros especificados na URL (escopo URL)?
URL e FORM são tratados como estruturas (structures) pelo ColdFusion e por isso mesmo podem ser utilizadas e manuseadas como tal. Como exemplo o conteúdo pode ser destrinchado (dumped), membros podem ser acessados diretamente ou por intermédio de um <CFLOOP>, todos sob as estruturas URL ou FORM.
28: Como eu posso ter acesso a um dado específico da minha query?
Para acessar diretamente linhas e colunas específicas de uma query, acesse-as como se estas fossem structures e arrays. Você pode acessar um dado de uma coluna e uma linha específica como #query.coluna[linha]#. Por exemplo, se você quer o valor "preco" da quinta linha de uma query chamada "produtos", você deve usar a expressão #produtos.preco[5]#. Essa técnica é especialmente útil quando você está fazendo um loop dos resultados da query para processar alguma coisa bem específica com eles.
29: Como eu posso gerar arquivos PDF para impressão usando o ColdFusion?
A geração de arquivos PDF é suportada pelo ColdFusion MX 7 usando a nova tag <cfdocument>.

<envie uma pergunta>