IntroduçãoQuando iniciamos os estudos sobre uma linguagem, ferramenta ou servidor devemos nos aprofundar, para que possamos maximizar a utilização, minimizando a quantidade de código, para criar uma aplicação otimizada. Então demonstrarei aqui como melhorar o código da aplicação de exemplo, passada no final no artigo anterior, de forma que a inclusão de ActionScript no código CFML, seja miníma, e para isto o desenvolvedor deve ter um conhecimento mínimo sobre construção de classes ActionScript 2.0 , e também informado onde essas classes devem ser armazenadas. Pré-requisito- ColdFusion MX 7.0.2, com um repositório de classes configurado. ConceitosNão vou conceituar, apenas falarei das peculiaridades, ok? ok! E segurem o folego! ConteúdoPara o conteúdo vamos utilizar o componente do artigo anterior, que já deve estar configurado e respondendo pela url http://localhost/labs/remoting/Usuario.cfc, como também estar com o banco de dados implementado, se você não fez ou não tem isso leia o artigo anterior , e implemente como orientado. Basicamente o que faremos é implementar o ActionScript (faça um outro diagrama) em cima do diagrama de classe desenvolvido para componente, o sugere que devemos ter na classe ActionScript ao menos seis métodos, relembrando, eles são: validate, append, update, remove, get e search. hUsuario.as import mx.remoting.NetServices; class hUsuario extends Object{ private static var currentService:NetServiceProxy; public static var userid:String; private function hUsuario(); public static function append():Void; } Os atributos userid, username, nome e email, são uma abstração das colunas da tabela lá do banco de dados, e o elemento mais importante nesta classe é o atributo currentService, por default sempre apontará para o mesmo conjunto de serviços, porém receberá ações diferentes, para que sejam executadas no retorno dos serviços, em cada serviço que estiver sendo executado, aqui resolvi coloca-lo como privado. Os atributos. private static var currentService:NetServiceProxy;
private function hUsuario(){ O próximo método é o mais importante e o motivo da criação desta classe, pois é nele que será construída a comunicador, que fará a ponte com o servidor. /* /* aqui uma firula ao cliente */ /* endereço do gateway */ /* endereço do conjunto de serviços */ /* conexão com servidor */ /* prepara parâmetro obrigatório da conexão com serviço*/ /* ação será executada em um retorno ok do servidor, com um leve complexidade, pois é uma execução padrão, e em seu conteúdo o parâmetro do método communication será executado */ /* executa ação de fato */ } Para um entendimento da lógica da código comentarei agora a operação mais simples desta classe. /* método invoca todos os registros da base de dados*/ /* executa método passando a função como parâmetro, função esta que será inserida e invocada dentro de outra função, repare no método anterior (communication)*/ } Os métodos seguintes são simplesmente os códigos do artigo anterior, contudo dispostos de forma mais organizada e vistosa, não vou comentar, apenas exibirei a classe completa e passarei ao formulário CFML. hUsuario.as import mx.remoting.NetServices; class hUsuario extends Object{ private static var currentService:NetServiceProxy; public static var userid:String; private function hUsuario(){ private static function communication(onresult:Function):Void { CursorManager.setBusyCursor(); var defaultGateway:String = “http://localhost/cfusion/flashservices/gateway/”; var conn:Connection = NetServices.createGatewayConnection(defaultGateway); var eventReturn:Object = new Object(); } private static function validate():Object{ var r:Object = new Object(); if(username != undefined && username.length > 0){ if(nome != undefined && nome.length > 0){ if(email != undefined && email.length > 0){ } public static function append():Void{ var user = validate(); if(user != null){ var onResult:Function = function(result):Void{ var arg:Object = new Object(); }else{ clear(); } public static function update(user:String):Void{ var u = validate(); if(u != null){ var onResult:Function = function(result):Void{ var arg:Object = new Object(); }else{ clear(); } public static function remove(user:String):Void{ var onResult:Function = function(result):Void{ } public static function get():Void{ var onResult:Function = function(result):Void{ } public static function search(query:String):Void{ var onResult:Function = function(result):Void{ } public static function clear():Void{ username = nome = email = “”; } } Vou executar um método por arquivo, iniciando pelo get, muito complicado como pode ver. 1.cfm <cfform name=”basic” format=”flash” onload=”hUsuario.get();”>
O método a seguir realizará a inclusão de um novo registro, caso a inclusão termine com sucesso retornará o ID do novo individuo, vou comentar, porque ele é muito mais complicado que o anterior. 2.cfm <cfform name=”basic” format=”flash” onload=”initRemoting();”>
Vou aproveitar o ID que foi retornado no append, para nas demais execuções. 3.cfm <cfform name=”basic” format=”flash” onload=”initRemoting();”>
As próximas execuções apresentam a mesma complexidade que a primeira, ou seja nenhuma. 4.cfm <cfform name=”basic” format=”flash” onload=”hUsuario.remove(‘20′);”>
E para finalizar a sequencia, vamos pesquisar um caracter comum a todos os registro. 5.cfm <cfform name=”basic” format=”flash” onload=”hUsuario.search(‘@’);”>
Para que entendam, mais claramente, de que ser este tipo de implementação, façam uma comparação do código da aplicação do artigo anterior para o código da aplicação a seguir. index.cfm
<cfform name="form1" format="flash" onload="initApp()">
<cfformitem type="script"> function initApp(){ Usuario.formName = 'form1'; } </cfformitem>
<cfformgroup type="panel" width="420"> <cfformgroup type="horizontal" > <cfinput type="text" name="qry" id="qry" /> <cfinput type="button" name="search" id="search" value="Pesquisar" onclick="Usuario.search(_root.qry.text);" /> </cfformgroup> </cfformgroup>
<cfformgroup type="panel" width="420" visible="false" id="pGrid"> <cfgrid name="listUsuarios" width="400" rowheaders="false" onchange="_root.pUser.visible = true;"> <cfgridcolumn name="nome" /> <cfgridcolumn name="username" /> <cfgridcolumn name="email" /> </cfgrid> <cfformgroup type="horizontal"> <cfinput name="RefreshUsuarios" id="RefreshUsuarios" type="button" value="Refresh" onclick="Usuario.get();" /> <cfinput name="addUsuarios" id="addUsuarios" type="button" value="Novo" onclick="Usuario.clear(); _root.pUser.visible = true;" /> <cfinput name="RemoveUsuarios" id="RemoveUsuarios" type="button" value="Remove" onclick="Usuario.remove(_root.listUsuarios.selectedItem.userid);" /> </cfformgroup> </cfformgroup>
<cfformgroup type="panel" width="420" id="pUser" visible="false"> <cfinput type="text" id="id" name="id" label="ID" validate="integer" enabled="false" bind="{listUsuarios.selectedItem.userid}" /> <cfinput type="text" id="username" name="username" label="username" validate="noblanks" required="true" bind="{listUsuarios.selectedItem.username}" /> <cfinput type="text" id="nome" name="nome" label="nome" validate="noblanks" required="false" bind="{(listUsuarios.selectedItem.nome != null)?listUsuarios.selectedItem.nome:''}" /> <cfinput type="text" id="email" name="email" label="email" validate="email" required="true" bind="{listUsuarios.selectedItem.email}" /> <cfinput type="button" id="saveUsuarios" name="saveUsuarios" value="Salvar" onclick=" Usuario.nome = _root.nome.text ; Usuario.email = _root.email.text; Usuario.username = _root.username.text; if(_root.id.text == ''){ Usuario.append(); }else{ Usuario.update(_root.id.text); }" > </cfformgroup>
</cfform>
Obs.: São três imagens, mas não houve reload, basta testar o cfml e verá. Conclusão“Uma boa prática deixa seu código muito mais apresentável, otimizado, com uma produtividade alta e um tempo de implementação reduzido.” – |
FormatCF(new Array(\’1.cfm\’,\’2.cfm\’,\’3.cfm\’,\’4.cfm\’,\’5.cfm\’,\’index.cfm\’)); FormatAS(new Array(\’hUsuario.as\’,\’oget\’,\’communication\’,\’Construtor\’,\’atributos\’));












ShareThis