Utilizando o sistema de suporte a imagens e thumbnails no AMADIS 1.x

Da AMADIS

Revisão das 06h21min de 4 de Julho de 2006 por Juliano (discussão | contribs)
(dif) ← Revisão anterior | Revisão actual (dif) | Revisão seguinte → (dif)

Índice

Introdução

O AMADIS utiliza imagens dinâmicas intensamente como forma de dar uma representação icônica para pessoas, projetos e comunidades. Ele aplica algumas da idéias do Orkut de como utilizar imagens e fotos como elementos de interface poderosos para a navegação e a localização. Nesse caso, não estamos nos referindo a todas as imagens que são visíveis na interface, mas sim naquelas que pode ser manipuladas pelo usuário, como fotos pessoais, de projetos ou de comunidades. Também é importante frisar que não se refere as imagens disponíveis em páginas HTML enviada pelo usuário pelo sistema, as quais são lidadas de forma distinta.

Essa forma de utilizas as imagens, gerou a necessidade de desenvolver-se um suporte na plataforma de maneira que os programadores não tivessem que a cada momento lidar com os problemas envolvidos na codificação dessas funcionalidades. Lidar com o envio, armazenamento e manipulação de imagens pode ser uma tarefa difícil e com vários problemas que devem ser observados. Além disso, desejava-se criar um sistema que gerenciasse as imagens de forma eficiêncente, seja em relação ao espaço armazenamento no servidor, bem como, no tráfego que gera na rede. Portanto, decidiu implementar no Core do AMADIS uma API para gerenciamento de imagens.

Neste artigo, será examinado os aspectos gerais da arquitetura desse sistema, bem como seu uso e boas práticas de programação para lidar com as exceções e erros.


Histórico

O sistema de de suporte ao envio, armazenamento e exibição de imagens do AMADIS tem uma história longa. Sua primeira implementação foi realizada por Juliano Bittencourt enquanto trabalhava no Projeto Rooda. Em 2002 quando veio trabalhar no Projeto AMADIS, ele utilizou algumas partes desse código no desenvolvimento de uma nova ferramenta de gerenciamento que fosse orientada a objetos, seguindo os principios de design do AMADIS. Naquela época a tecnologia corrente era o PHP4, que possuía um suporte limitado à OO, fato que limitava o desenvolvimento de uma ferramenta eficiente. Entretanto, naquela época o sistema era apenas utilizado no fórum do AMADIS 1.0, o que não gerava a demanda de um sistema crítico.

A partir da versão 1.2, em 2004, o AMADIS sofreu uma profunda alteração no seu layout, o que intensificou o uso do sistema de suporte a imagens. Ele foi sendo extendido para incorporar novas funcionalidades, o que tornava-se cada vez mais difícil. Em 2006 decidiu-se reimplementar parte significativa do sistema para utilizar melhor as funcionalidades do PHP5 e criar um sistema mais simples de compreender e utilizar. Este documento descreve essa implementação.

Banco de Dados ou Sistema de Arquivos?

Existe uma grande discussão sobre utilizar um Sistema Gerende de Banco de Dados - SGBD ou o sitema de arquivos para o armazenamento de arquivos para aplicações Web. Existem programadores que advogam em ambos os lados com bons argumentos. Por exemplo, o uso do sistema de arquivo é muito mais rápido e deixa para o próprio servidor web identificar o processo de envio do mesmo. Entretanto, cabe ao desenvolvedor lidar com o problema de arquivos com mesmo nome. Já em um SGBD não existe o problema da duplicação dos nomes, mas existe um problema sério de eficiência que deve ser gerênciado. Além disso, o sistema deve criar um wrapper que carregue um arquivo requisitado da base de dados e envie ela para o cliente (browser) que o requisitou.

Atualmente o AMADIS utiliza um sistema misto para armazenar nas imagens. As imagens, propriamente ditas, são armazenadas no SGBD. No sistema de arquivos são armazenados apenas as miniaturas (thumbnails) gerados. Em termos práticos, o programador não precisa se preocupar com esses detalhes no momento de utilizar a API. Como utiliza-se técnicas de Orientação a Objetos - OO, essas informações são encapsuladas por métodos os quais são evocados pelo desenvolvedor. Isso cria uma grande liberdade para o desenvolvedores da API pra, em um futuro, poder optar por uma mudança na tecnologia de armazenamento das imagens sem ter que alterar o sistema como um todo.


Overview do Design

Na imagem abaixo é possível visualizar o diagrama de classes do sistema de gerência de imagens.

Diagrama de Classes do sistema de Suporte a Images


Existem dois tipos de classes para o trabalho com imagens no AMADIS. O primeiro tipo(amarelo) representa as imagens armazenadas no banco de dados extendo a super-classe de persistência CMObj. O segundo (azul) implementa a visualização de uma imagem que pode ser adicionada à um objeto de página e, portanto, extende a super-classe CMHTMLObj.

O primeiro tipo de classes foi construído sobre a classe AMFile. Ela modela um arquivo armazenado no banco de dados. Seu uso não é exclusivo ao sistema de imagens, pois qualquer tipo de arquivo pode ser armazenado no SGBD utilizando-a. Além dos dados enviados, ela possuí várias propriedades que armazenam informações importantes sobre o arquivo.

Extendo AMFile, temos a classe AMImage, que modela uma imagem armazenada no banco de dados. Ela possuí algumas alterações em relação à AMFile para suportar operações sobre uma imagem. Também possuí métodos estáticos que informam sobre as capacidades da versão instalada do PHP em manipular imagens. Além de AMImage, existe a classe abstrata AMFixedSizeImage. A diferença entre as duas classes é que a segunda limita a altura e largura máximas que uma imagem pode possuir. Caso o arquivo esteja fora dos limites, a classe realizar uma operação de resize, alterando as dimensões da imagem, mas mantendo as proporções originais.

Já a classe AMThumb, implementa um thumbnail de uma imagem. Thumbnail é uma visualização de uma imagem em um tamanho menor que o original. Os thumnails são armazenado no sistema de arquivos por motivos de performace.

Na segunda categoria, encontramos a classe abstrata AMImageTemplate a super-classe. Ela modela uma visulização de uma imagem, trabalhando estreitamente com o arquivo 'imagewrapper.php. Assim ela lida com situações difícies de gerênciar como exibir uma imagem que ainda não está persistente no banco de dados. Para utilizar AMImageTemplate é necessário extendê-la, e fornecer um método que forneça o código HTML de visualização para a imagem. Para compreender a necessidade desse passo, basta observar que no AMADIS as imagens de projetos, usuários e comunidades tem bordas de cores diferentes. Essas bordas são classes CSS que cada uma das respectivas classes, AMTProjectImage, AMTUserImage e AMTCommunityImage, cria na hora de exibir a imagem.

Ainda nesa categoria existe as classes AMTThumb, que é a vizualização de um thumbnail e AMTFileDownload que fornece um método de download para uma imagem ou arquivo.

Utilizando o Sistema

Nesta seção iremos detalhar o uso do sistema de gerência de imagens no AMADIS, dando exemplos práticos de código.

Manipulando Arquivos

Para compreender como utilizar o sistema de gerência de imagens é necessário entender os príncipios do upload de arquivos no AMADIS. No banco de dados do AMADIS existe apenas uma tabela que armazena arquivos. Essa tabela é modelada pela classe AMFile, a qual é construída com base nas classes de persistência do CMDevel. Ao utilizar essa classe, a tarefa de armazenar arquivos no SGBD torna-se simples. Observe o código abaixo.

<codehighlight linenumbering=true language=php> <? $file = new AMFile; try {

 $file->loadFileFromRequest('file_form');

} catch(AMExceptionFile $e) {

 die("Problem loading file");

}

try {

 $file->save();

} catch(CMObjException $e) {

 //you can set especial errors for the
 //diferent exception throwed by CMObj
 die("Could not save file");

}

echo "File sucessfuly saved."; ?> </codehighlight>

Esse código carrega uma imagem enviada por um formulário chamado file_form e salva ele no SBGD.

Referênciando imagens

<codehighlight language=php> <? $foto = AMUserPicture::getImage($_SESSION['user']); $box->add(new AMTUserImage($foto),AMTwoColsLayout::LEFT); </codehighlight>

Extendendo o sistema

TODO

  • falar sobre a necessidade do GD
  • imagem default</codehighlight>
Ferramentas pessoais
Parceiros
















SourceForge.net Logo

Supported by Cenqua