LOGIN:

iMasters | Por uma internet mais criativa e dinâmica

Feeds

Segunda-feira, 13/11/2006 - 11:56 - Por Felipe Magalhães
Seções relacionadas:

Sistema de Blog em ColdFusion - Parte 04

Olá gente! Vamos falar um pouco do uso de cfc’s no sistema e como eles podem ser úteis para um desenvolvimento com um “código limpo”.

Existem muitos recursos que nos proporcionam trabalhar com o código separado (em nosso exemplo, separaremos o código responsável pela interação com o banco de dados do código responsável pela saída HTML) e os cfc’s são grandes colaboradores no que diz respeito a este quesito.

Ouvindo: Melhor pra mim - Leoni
Versão do Servidor: CFMX7 Dev. Edition

Nesta quarta (e penúltima) matéria sobre nosso Sistema de Blog em ColdFusion, iremos trabalhar com o as partes de seleção e exclusão de conteúdo. Para isso, antes de começarmos a falar sobre o código, faça aqui o download  do sistema até o ponto desta matéria.

Para iniciar, deixarei a explicação sobre CFC’s a cargo de uma matéria publicada aqui mesmo no iMasters, por Marcos Placoná: www.imasters.com.br/artigo/1252

A matéria explica de forma muito compreensiva e interessante o que são os CFC’s, então é indicada a leitura da matéria para que possamos seguir com um entendimento melhor do conteúdo que será apresentado a seguir.

Os ColdFusion Components possuem a extensão .cfc e sua tag inicial é a cfcomponent. Usaremos nosso cfc para fazer a interação com o banco de dados do nosso blog e para isto estruturamos o componente da seguinte forma:

. cfcomponent: Tag responsável por definir que o documento que estamos tratando é um componente (cfc).

. cffunction: Todas as chamadas que faremos ao nosso componente, serão realizadas através de métodos (ou funções), os quais podem retornar ou não algum resultado para ser exibido na página. Nesta tag definimos:

name: nome da cffunction.

access: tipo de acesso à cffunction. Pode ser public (acessível por qualquer página ou método do componente), private (disponível somente no componente em que o método foi declarado e em todos os componentes que estenderem o componente em que é definido), package (disponível somente ao componente que declara o método, os componentes que estendem o componente, ou qualquer outro componentes do pacote) ou remote (disponível em páginas ou métodos executados localmente ou remotamente, ou em um cliente remoto através de URL, Flash, ou web service. Para publicar a função como um web service, esta opção é obrigatória).

returnType: tipo de informação que a cffunction retorna. Os retornos mais comuns são array, boolean, date, numeric, query, string, struct, void (quando não queremos retornar nada) e xml.

output: especifica sob quais condições a cffunction irá gerar a saída HTML. Se esta opção for configurada como “yes”, o corpo da função é executado como se estivesse dentro de uma tag cfoutput. Os nomes de variáveis cercados por # são substituídos automaticamente por seus valores. Se estiver configurada como “no” a cffunction é processada como se estivesse entre as tags <cfsilent></cfsilent>.

. cfargument: Não é obrigatório. Define um parâmetro que será usado na cffunction à qual o argumento estiver submisso. É equivalente à passagem de parâmetros entre parênteses existente em outras linguagens.

Exemplo em Java: public soma(int x, int y) -> neste caso temos “x” e “y” como parâmetros do tipo inteiro

Exemplo em ASP: function raiz(x) -> neste caso temos “x” como um parâmetro da função.

É importante lembrar que ao se invocar uma cffunction que possua argumentos, devemos informar o valor de cada parâmetro existente para que o método seja executado corretamente.

name: nome do argumento a ser criado.

type: tipo de dados aceito pelo argumento. Os tipos mais comuns são array, boolean, date, numeric, query, string, struct, void (quando não queremos retornar nada) e xml.

required: Se estiver configurado com “yes”, significa que este argumento é obrigatório para a execução do método.

default: é o valor padrão para o argumento. Caso na hora de invocar a cffunction você esqueça de fornecer um valor para o argumento, ele utilizará o valor informado no atributo “default”, evitando assim o erro pela falta de envio do mesmo.

. cfreturn: Se sua cffunction estiver com o atributo returnType configurado para qualquer opção diferente de void,obrigatóriamente terá de retornar um valor para o código que a invocou, e este retorno é feito através do cfreturn.

No exemplo deste sistema, todas as cffunctions existentes que retornam valor, o retorna como uma query, ou seja, quando invocada a cffunction recebe, se necessário, os argumentos, executa um comando SQL e, novamente se necessário, retorna uma query com os registros atingidos.

Vejamos três trechos de código do arquivo admin.cfc (existente no arquivo disponível para download parágrafos acima).

1º Caso: cffunction que não possui argumentos e retorna valor

Linhas 3 à 14:

            <cffunction name="usuariosMaster" access="public" returnType="query" output="true">
                        <cfquery name="usuMaster" datasource="bd_blog">
                                   SELECT
                                               cod, usuario, nome
                                   FROM
                                               Acesso
                                   ORDER BY
                                               nome
                                   ASC
                        </cfquery>
                        <cfreturn usuMaster>
            </cffunction>

Nosso primeiro exemplo é de uma cffunction chamada usuariosMaster, que pode ser acessada por qualquer página ou qualquer outro método deste cfc e retorna uma query. Como desejamos retornar uma query, devemos criar a mesma através da já conhecida cfquery, onde informamos o comando SQL a ser executado.

Logo após o fechamento da cfquery, utilizamos a tag cfreturn para retornarmos a variável usuMaster, que armazena uma query com os resultados obtidos através da execução daquela SQL. Daqui a pouco falaremos sobre como tratar o dado retornado pela cffunction, mas por enquanto o interessante é focar no entedimento de como funciona esse mecanismo cfc.

2º Caso: cffunction que possui argumentos e retorna valor

Linhas 16 à 27

            <cffunction name="usuariosDetail" access="public" returnType="query" output="true">        
                        <cfargument name="codUsuario" type="numeric" required="true" default="0">
                        <cfquery name="usuDetail" datasource="bd_blog">
                                   SELECT
                                               cod, usuario, nome, senha
                                   FROM
                                               Acesso
                                   WHERE
                                               cod = #arguments.codUsuario#
                        </cfquery>
                        <cfreturn usuDetail>
            </cffunction>

Assim como no caso anterior, esta cffunction também retornará uma query, porém, neste método existe uma query que retornará um registro com todos os campos relativos ao usuário com o cod igual a um valor que será informado a esta cffunction. Este “valor informado a esta cffunction” é tratado pela mesma em forma de argumento (com a tag cfargument). Neste exemplo, o argumento tem o nome de codUsuario, tem obrigatoriedade de possui um valor (nem que seja o default, que é 0) e aceita valores somente do tipo numérico.

Como nossa SQL depende do valor armazenado no argumento codUsuario, na hora de unirmos a SQL com o conteúdo em CF, basta colocar entre cerquilha (#) arguments.codUsuario, onde arguments indica que este valor é um argumento existente nesta cffunction e codUsuario é o nome do mesmo. Ao final, temos novamente a tag cfreturn que é responsável por retornar para o código que invocou este método, a query gerada em sua execução.

3º Caso: cffunction que possui argumentos e não retorna valor

Linhas 93 à 105

            <cffunction name="delUsuario" access="public" returntype="void">
                        <cfargument name="codUsuario" type="numeric" default="0">
                        <cfquery name="excluirUsu" datasource="bd_blog">
                        DELETE
                                   *
                        FROM
                                   Acesso
                        WHERE
                                   cod = #arguments.codUsuario#
                        </cfquery>
                        <cfcookie name="blog_cod" expires="now" value="">
                        <cflocation url="index.cfm">
            </cffunction>

A necessidade de retorno em uma cffunction é fácil de ser notada para casos em que se usa query. Se você vai fazer uma seleção de dados, muito provavelmente seu intuito é disponibilizá-los para uso na página. Mas caso sua intenção seja uma exclusão, inserção ou atualização de dados, não há inicialmente a necessidade de se retornar algo (lembrando que esta não é uma regra, pois há casos e casos).

Nesta cffunction temos algumas características que não existiam nas anteriores. Esta cffunction é responsável pelo encerramento da conta de um usuário com acesso à área administrativa do sistema. Após executarmos a exclusão no banco de dados através da query excluirUsu, fazendo uso do argumento codUsuario, o usuário deve ser remetido à página de login do administrativo, pois ele já não tem mais uma conta de acesso a esta área e não pode ficar transitando por ela livremente.

Antes do próprio redirecionamento do usuário à página de login (index.cfm), limpamos o valor existente no cookie blog_cod, para que caso o usuário tentasse acessar digitando diretamente através da barra de endereços a URL de uma página válida do administrativo, ele fosse submetido ao código da página _valida.cfm (existente na matéria anterior a esta), e o código detectaria que o cookie não possui valor, forçando assim que o usuário informe um login e senha válidos para acessar esta área.

Dúvidas até aqui? Vamos agora à parte da chamada a estas cffunctions!

As páginas posts.cfm, comentarios.cfm e usuários.cfm possuem das linhas 2 à 5 a chamada aos métodos relativos a estas páginas (exclusão de dados e seleção para exibição), então, para exemplificar, usarei somente a página comentarios.cfm como exemplo. Segue abaixo o código:

<cfif Cgi.REQUEST_METHOD IS "Post">
            <cfinvoke component="admin" method="delComentario" codComment="#Form.id#">
</cfif>
<cfinvoke component="admin" method="comentariosMaster" returnvariable="comentarios">

Vamos pensar em como funciona a página: Ao ser carregada, a página listará todos os nomes dos que postaram comentários, bem como a data na qual o comentário foi efetuado, o título do post relativo a este comentário e um botão para realizar a exclusão do comentário, caso queira removê-lo.

Quando o usuário clicar no botão “Excluir comentário”, será enviado via método POST para o servidor, o código relacionado àquele comentário, e logo após a página tornará a ser carregada exibindo novamente todos os dados citados acima.

Um tanto quanto cíclico, não? Bem, voltando a falar sério agora, notamos que a chamada ao método responsável pela exclusão da informação é condicional, ocorrendo somente quando o formulário é enviado (em método POST). Então foi criada uma condição que avalia se a página foi chamada através do método POST ou não. Por exemplo, caso você tenha acessado esta página através do link “Comentários” existente na principal.cfm, a página será chamada usando o método GET.

Caso a página tenha sido chamada em POST, iremos invocar o método usando a tag cfinvoke.
A cfinvoke tem como função invocar (chamar) um método (cffunction) existente em uma página cfm ou em um componente (CFC). Para efetuar a chamada necessária em nosso blog, foram usados os seguintes atributos:

. component: nome do arquivo CFC onde será encontrado o método informado no atributo method.

. method: Nome do método a ser invocado.

A passagem de valores para os argumentos do método pode ser feita através da tag cfinvokeargument ou adicionando o nome do argumento como um atributo da cfinvoke, como está sendo feito neste exemplo, onde foi acrescentado o atributo codComment.
Entendendo o que irá acontecer: a cffunction delComentario possui uma query que exclui do banco de dados o comentário com o código igual ao valor passado para o argumento codComment.

Então, quando o formulário é enviado para esta página, o servidor verifica se o método de envio utilizado foi POST, e sendo, ele executa o método delComentario, informando que o valor do argumento codComment será o valor armazenado no campo id do formulário. No outro cfinvoke, executamos o método comentariosMaster, responsável por buscar no banco de dados todos os comentários existentes. Este método retorna uma query comentMaster, que será tratada na página como o objeto comentarios. Como o método comentMaster tem returnType configurado como query, automaticamente podemos tratar o comentarios como uma query, para exibirmos todos os dados recuperados do banco.

Para a exibição de  todos os registros, utilizamos a cfoutput com o comentarios (retornado no cfinvoke) sendo a query de exibição. Daí em diante não há nenhuma novidade: os dados são escritos na página e o código do comentário referente a esta linha fica armazenado no campo id do formulário para quando houver necessidade de excluí-lo.

Todas as páginas são escritas seguindo este modelo, espero poder ter mostrado de forma compreensível a todos um pouco do funcionamento dos CFC’s. Gostaria de lembrar que, para que o entendimento seja maior, avalie todas as páginas existentes no arquivo disponível para download.

Mas não pare por aí, pois o recurso de CFC’s permite além da separação de código, a criação de webservices, então se aprofunde, e como diria meu mestre LeoDiass: “Se for saber, saiba a fundo”.

Grande abraço a  todos. Fiquem com Deus e até!

Todos os artigos de Felipe Magalhães

4 comentários publicados

  • 1. Parabéns!

    Segunda-feira, 13/11/2006, por Eduardo Pires

    ótimo tema abordado.

    Responder comentário
  • 2. Show.

    Terça-feira, 14/11/2006, por Renan Souza

    Show de bola mulek.
    Parebéns.
    Como dizia um de meus mestres.
    "Se é para saber, saiba a fundo!".
    Grande Abraço Felipão.

    Responder comentário
  • 3. Ótimo

    Terça-feira, 16/01/2007, por Ricardo Torres

    Muito boa está matéria, bem explicado.

    Obs.: O arquivo para download desta parte 04 está com o link errado.

    Responder comentário
  • 4. Link indisponível

    Quinta-feira, 28/06/2007, por Igor Bezerra

    A matéria é muito boa e útil. Entretanto, o link para download está com problemas, infelizmente

    Responder comentário

Poste um comentário


Os textos publicados neste espaço são de responsabilidade única de seus autores (colunistas e leitores) e podem não expressar necessariamente a opinião do iMasters.

Sobre o autor

Felipe Magalhães é programador da AM4 (www.am4.com.br), e desenvolve para a web voltado para ASP, ColdFusion, MySql e XML. Está cursando a faculdade de Ciências da Computação na UBM - Campus Barra Mansa.


Indique para um amigo

captcha

TI SHOP Produtos iMasters

  • Lançamento: CD-ROM Treinamento Aplicado de SQL - Lançamento! Treinamento Aplicado de SQL - Aprenda a trabalhar com SQL com bancos de dados Oracle e SQL Server. São mais de 100 tópicos explicados por Mauro Pichilliani, um articulistas mais lidos do iMasters. Aproveite! Apenas R$ 69,90 no TI SHOP.
  • Lançamento: Livro iMasters "O Encontro de 2 Mundos"- Este livro conta com 56 crônicas de profissionais mais admirados e influentes do mercado brasileiro de Internet. Aproveite o preço especial para leitores do iMasters. Apenas R$ 40,00 e envio imediato!
  • DVD Curso Completo de Photoshop - Do conceito à finalização Lançamento! Curso Completo de Photoshop, em DVD, com mais de 230 aulas dividas em 4 módulos: conceito, básico, avançado e finalização. Apenas R$ 69,50 no TI SHOP - Frete com 50% de desconto
  • DVD Javascript Starter - Curso Completo Com mais de 9 horas de vídeo-aulas, é um curso completo sobre Javascript. Ideal para quem deseja aprender a linguagem. Apenas R$ 64,90 no TI SHOP - Frete com 50% de desconto!

2001 - iMasters FFPA Informática Ltda - Todos os direitos reservados.