Ontem após a apresentação do Ben Forta no Rio, perguntei sobre um bug que encontrei ao utilizar bind de CFCs com as novas tags baseadas em Ajax do ColdFusion 8 e ele disse que, se não foi resolvido no último hot-fix, este será resolvido no próximo updater, com previsão de lançamento para o começo de abril.
Archive for March, 2008
ColdFusion 8.1 em breve
Friday, March 28th, 2008Flex 1.5? O que ele está fazendo aqui?
Monday, March 24th, 2008Hoje ao conferir um log via console do JRun vi que o ColdFusion 8 ainda traz embutido o Flex 1.5! Não sei porque, mas ele ainda está lá:
24/03 20:31:21 INFO License Service: Flex 1.5 CF Edition enabled
24/03 20:31:21 INFO Starting Flex 1.5 CF Edition
Adobe Developer Week
Friday, March 21st, 2008Na próxima semana a Adobe realizará uma série de eventos on-line para desenvolvedores, a Adobe Developer Week. São mais de 20 sessões cobrindo diversas tecnologias como AIR, Flex, ColdFusion etc. Estou interessado na apresentações sobre o Blaze DS, se tiver tempo assistirei.
JavaScript e CFDIV
Wednesday, March 19th, 2008Atualizando… a solução para este problema pode ser encontrada aqui.
Ao portar código HTML para uma nova abordagem utilizando a tag CFDIV, um dos novos componentes baseados em AJAX do ColdFusion 8, encontrei problemas com código javascript a ser executado na página “incluída”. No exemplo abaixo, a função “teste” na página action.cfm não é executada (apresentando erro javascript):
<cfdiv id=”meuDiv” bind=”url:/action.cfm”/>
Página action.cfm:
<script>
function teste(){
alert(”Testando…”)
}
</script>
<a href=”javascript: teste()”>Testar</a>
Para que a função seja executada, esta precisa ser movida para a página principal, conforme o código abaixo:
<script>
function teste(){
alert(”Testando…”)
}
</script>
<cfdiv id=”meuDiv” bind=”url:/action.cfm”/>
E a página action.cfm:
<a href=”javascript: teste()”>Testar</a>
O problema é que funciona, mas é uma solução MUITO ruim.
Envio assíncrono de formulários com JavaScript e ColdFusion8
Tuesday, March 18th, 2008O exemplo abaixo demonstra como submeter um formulário de forma assíncrona utilizando JavaScript através das bibliotecas AJAX:
<cfajaximport>
<script>
function enviar() {
ColdFusion.Ajax.submitForm(’myform’, ‘action.cfm’, callback, errorHandler);
}
function callback(text)
{
alert(”Callback: ” + text);
}
function errorHandler(code, msg)
{
alert(”Error! ” + code + “: ” + msg);
}
</script>
</head>
<body>
<cfform name=”myform”>
<cfinput name=”nome”>
</cfform>
<a href=”javascript: enviar()”>Enviar</a>
</body>
</html>
O código a seguir corresponde à página action.cfm:
<cfoutput>#form.nome#</cfoutput>
Invocando métodos de componentes ColdFusion com Ajax
Friday, March 14th, 2008O exemplo a seguir mostra como invocar um método de um CFC utilizando a tag CFAJAXPROXY. Esta tag cria um proxy no cliente para um componente, ou seja, podemos invocar métodos deste componente sem fazer refresh na página, a requisição é feita “por baixo dos panos”.
<cfajaxproxy cfc=”meuComp”>
<script type=”text/javascript”>
var getName = function(){
var m = new meuComp();
m.setHTTPMethod(”POST”);
m.setCallbackHandler(myCallbackHandler);
m.setErrorHandler(myErrorHandler);
m.echo(’Testenildo da Silva’);
}
var myCallbackHandler = function(res)
{
alert(res)
}
var myErrorHandler = function(statusCode, statusMsg)
{
alert(’Status: ‘ + statusCode + ‘, ‘ + statusMsg);
}
</script>
<a href=”javascript: getName()”>Teste</a>
Código do componente meuComp.cfc:
<cfcomponent>
<cffunction name=”echo” access=”remote” output=”false”>
<cfargument name=”nome” type=”String” required=”true” />
<cfreturn “created ” & arguments.nome>
</cffunction>
</cfcomponent>
Para provocar um erro e testar a função myErrorHandler experimente não passar o parâmetro para o método “echo”.
Um modificação que acho muito importante em relação ao exemplo da documentação é a inclusão do método “setHTTPMethod” para passar invocar o método do componente através de POST e não de GET evitando erros com o tamanho da URL gerada.
Envio assíncrono de formulários com ColdFusion 8 e Ajax.
Thursday, March 13th, 2008Segue um exemplo para submeter formulários de forma assíncrona com ColdFusion e Ajax que não funciona em porque um dos campos do formulário usa o nome “action”:
<cfoutput>#now()#</cfoutput><br>
<cfdiv>
<h3>Teste 1</h3>
<cfform name=”myform” format=”html” action=”result.cfm”>
teste 1 <cfinput type=”Text” name=”name”>
<cfinput type=”submit” name=”submit” value=”Enter name”>
</cfform>
</cfdiv>
<br>
<br>
<cfdiv>
<h3>Teste 2</h3>
<cfform name=”myform” format=”html” action=”result.cfm”>
teste 2 <cfinput type=”Text” name=”action”>
<cfinput type=”submit” name=”submit” value=”Enter name”>
</cfform>
</cfdiv>
E a página result.cfm:
<cfoutput>#Form.fieldNames#</cfoutput>
Se alguém tiver explicação para isso, por favor, avise, eu não achei nada na documentação.
ColdFusion Ajax Features
Wednesday, March 12th, 2008Após migrar da versão 7.02 do ColdFusion 7.02 para a versão 8, comecei a testar as novas features para componentes baseados em Ajax e estou um pouco decepcionado.
O comportamento do atributo “bind” em algumas tags é completamente inesperado, principalmente ao comparar “binds de urls” e “binds de cfcs”.
Também tenho tido problemas com um bug (70775) que pode ter sido solucionado no Hot Fix 3 mas aqui, mesmo após a instalação do update, continuo com o erro. Escrevi para o Ben Forta, já que isso foi alvo de discussão em um post no blog dele.
Também tive problemas ao incluir um campo em um formulário com nome “action” (um erro 404 é retornado após o formulário ser submetido), a princípio achei que o erro tinha sido meu, em não ler a documentação, mas após consultar o capítulo “Reserved Words and Variables” não achei nada que me apontasse o problema.
Sou cabeça dura e não pretendo abrir mão das funcionalidades que os componentes prometem, mas a vantagem do ColdFusion em relação ao Flex é a rapidez na codificação, se essa produtividade for para o ralo em função de problemas como esses, vou optar pelo Flex mesmo.
Vale lembrar que não houve necessidade de alteração de código para a migração, apenas aplicações Flex 1.5 foram migradas para Flex 2.0.