Em: Java
22 fev 2010Neste tutorial irei apresentar um exemplo de como alimentar uma listagem (componente Table) do Vaadin simplesmente configurando seu DataSource como sendo uma classe-entidade do Hibernate.
Utilizaremos uma classe bastante interessante chamada HbnContainer, que está na incubadora, portanto, ainda não faz parte do core do Vaadin. Baixe-a neste link e junte ao código-fonte do seu projeto.
Primeiro adicione o seguite código ao método init() da sua classe Application (AlunosApplication, no meu caso), ele irá gerenciar as sessões do Hibernate, fechando-as no final de cada transação:
public class AlunosApplication extends Application implements SessionManager { @Override public void init() { getContext().addTransactionListener(new TransactionListener() { @Override public void transactionEnd(Application application, Object transactionData) { if (application == BiometriaApplication.this) { closeSession(); } } @Override public void transactionStart(Application application, Object transactionData) { } }); }
Faça com que a sua classe Application implemente a interface SessionManager, que pertence a HbnContainer. Em seguida, adicione a ela os seguintes métodos:
/** * Retorna a sessão atual do Hibernate. * Também assegura uma transação aberta do Hibernate. */ public Session getSession() { Session currentSession = HibernateUtil.getSessionFactory().getCurrentSession(); if(!currentSession.getTransaction().isActive()) { currentSession.beginTransaction(); } return currentSession; } private void closeSession() { Session sess = HibernateUtil.getSessionFactory().getCurrentSession(); if(sess.getTransaction().isActive()) { sess.getTransaction().commit(); } if (sess.isOpen()) sess.close(); }
A classe HibernateUtil, citada no código acima, irá nos fornecer as sessões do Hibernate:
package net.rubensgadelha.alunos.util; import org.hibernate.SessionFactory; import org.hibernate.cfg.AnnotationConfiguration; public class HibernateUtil { private static final SessionFactory sessionFactory; static { try { // Cria o SessionFactory com base no arquivo hibernate.cfg.xml sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory(); } catch (Throwable ex) { System.err.println("Falha na inicialização da SessionFactory: " + ex); throw new ExceptionInInitializerError(ex); } } public static SessionFactory getSessionFactory() { return sessionFactory; } }
Agora que já concluímos o ambiente Vaadin + Hibernate, criemos a classe mapeada pelo Hibernate:
package net.rubensgadelha.alunos.bean; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.validator.Length; import org.hibernate.validator.NotNull; @SuppressWarnings("serial") @Entity @Table(name="alunos") public class Aluno implements Serializable { @Id private Long oid; @Column(name="matricula", nullable=false, length=5) @NotNull private Integer matricula; @Column(name="nome") @NotNull @Length(min=5, max=50) private String nome; @Column(name="email") private String email; public void setOid(Long oid) { this.oid = oid; } public Long getOid() { return oid; } public void setMatricula(Integer matricula) { this.matricula = matricula; } public Integer getMatricula() { return matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
Finalmente, informamos que a classe acima, que representa uma tabela no banco de dados, irá popular a tabela do Vaadin representada na classe abaixo:
package net.rubensgadelha.alunos.ui; import net.rubensgadelha.alunos.AlunosApplication; import net.rubensgadelha.alunos.bean.Aluno; import net.rubensgadelha.alunos.util.HbnContainer; import com.vaadin.ui.Table; @SuppressWarnings("serial") public class TabelaAlunos extends Table { public ListaAlunos(AlunosApplication app) { HbnContainer hbn = new HbnContainer(Aluno.class, app); setContainerDataSource(hbn); } }
Pronto! Agora basta que você adicione o componente acima na sua aplicação e você verá que ele será automaticamente populado com os dados do banco.
Em: Java
19 fev 2010Se você gosta de desenvolver RIA’s (Rich Internet Applications), não poderá deixar de conhecer o framework Java Vaadin. Com ele você produzirá interfaces bastante interessantes e semelhantes às de uma aplicação desktop, porém, sem preocupar-se com código HTML, CSS ou Javascript, ou seja, você desenvolve 100% em Java como se fosse uma aplicação com Swing, pois tanto o processo de desenvolvimento quanto os componentes disponibilizados são bem parecidos, e o framework irá gerar todas as janelas, botões, popups, menus em HTML com temas CSS atraentes e personalizáveis e toda integração entre os componentes já implementada via ajax utilizando o famoso GWT – Google Web Toolkit – de onde provêm também seus widgets.
Para aprender mais sobre esse framework, o site oficial disponibiliza (em inglês), três tutorais: Uma versão que pode ser concluída em 5 minutos para uma breve iniciação, outra que durará em média 1 hora e, para quem desejar se aprofundar mais no assunto, eles disponibilizam o Book of Vaadin, cuja leitura e análise duram em média 1 dia.

Exemplo de aplicação com Vaadin
Em: Zend
26 mai 2009Olá pessoal,
Após um bom tempo sem artigos, estou de volta!
A tarefa de criar documentos PDF sempre foi uma “pedra no sapato” de qualquer programador PHP, haja vista que era um processo trabalhoso, que exige testes e mais testes de posicionamento e ainda sim não se chegava a um resultado satisfatório.
Para sanar esse problema, foi criada uma classe chamada fpdf, que por si só já nos era muito útil com seus métodos para estilização de texto e alguns outros recursos. Mas ainda não era o suficiente, pois a formatação e quebra de linhas ainda eram difíceis.
Surgiu então a classe html2fpdf que, na minha opinião, resolveu o problema, pois agora poderíamos estilizar um código html (com algumas limitações, é claro) e gerar o PDF com base nele.
Como atualmente utilizo Zend Framework, resolvi reunir as vantagens das classes acima em um Action Helper:
<?php /** * Action Helper para gerar PDF a partir de HTML usando HTML2PDF * * @uses Zend_Controller_Action_Helper_Abstract * @uses HTML2FPDF (http://html2fpdf.sourceforge.net) * @uses FPDF (www.fpdf.org) * * @author Rubens Gadelha * * @param string $html * @param 'I'|'D'|'F'|'S' $dest * * Saidas: * I: Envia para a saída padrão * D: Download do arquivo * F: Salva em um arquivo local * S: Retorna como string */ class Zend_Controller_Action_Helper_Html2Pdf extends Zend_Controller_Action_Helper_Abstract { public function direct($html, $output, $dest = 'D') { $pdf = new HTML2FPDF(); $pdf->AddPage(); $pdf->WriteHTML(utf8_decode($html)); $pdf->Output($output, $dest); } } ?>
Para utilizá-lo, é muito fácil:
1. Salve o código acima em um arquivo chamado Html2Pdf.php na pasta helpers do seu projeto;
2. Faça o download do html2fpdf aqui;
3. Descompacte-o dentro da pasta library do seu projeto;
4. Inclua essa pasta no include_path que, geralmente está configurado no arquivo de bootstrap:
<?php set_include_path('.' . PATH_SEPARATOR . '../library/' . PATH_SEPARATOR . '../application/default/models/' . PATH_SEPARATOR . get_include_path() // inclua a linha abaixo . PATH_SEPARATOR . '../library/html2fpdf/'); ?>
5. No Controller, insira a linha abaixo na ação onde você deseja gerar o PDF:
<?php // Desabilita o layout $this->_helper->layout->disableLayout(); // Gera o PDF $this->_helper->html2Pdf($html, $file, 'D'); // Evita que o arquivo busque a respectiva view exit; ?>
Onde:
$html é o código base para geração do arquivo
$file é o nome do arquivo
‘D’ é um parâmetro que força o download do arquivo.Os parâmetros possíveis são:
I: Envia para a saída padrão
D: Download do arquivo
F: Salva em um arquivo local
S: Retorna como string
Para mais detalhes sobre código html compatível, acesse a página do html2fpdf.
Executa uma consulta básica no banco de dados ativo
Exemplo
$result = db_query("SELECT node.nid, node.title FROM {node} WHERE node.type LIKE '%s' ORDER BY node.created DESC","noticia");
Repare no uso do marcador ‘%s’, que teve seu valor indicado como argumento logo após a consulta SQL. O uso desses marcadores é altamente recomendado pelo Drupal e funciona de forma semelhante à função sprintf() do PHP.
Outro detalhe importante é que o nome da tabela está entre chaves { }, para que o Drupal detecte a tabela e adicione o prefixo definido no ato da instalação, caso ele exista.
Executa uma função básica no banco de dados ativo, recebendo como parâmetros adicionais os índices do primeiro e do último registro a ser exibido.
Exemplo
$result = db_query_range("SELECT node.nid, node.title FROM {node} WHERE node.type LIKE '%s' ORDER BY node.created DESC","noticia",3,10);
Essa função retornará do terceiro ao décimo registros (últimos parâmetros) da consulta.
Essa retorna um número inteiro correspondente ao total de registros obtidos na última consulta realizada.
Exemplo
print db_affected_rows(); // imprime 7
Traz cada linha do resultado de uma consulta como um objeto.
Exemplo
while ($node = db_fetch_object($result)) { print $node->title; }
Traz cada linha do resultado de uma consulta como um array.
Exemplo
while ($node = db_fetch_object($result)) { print $node['title']; }
Em: Drupal
29 jan 2009Se você possui o ID de um node do Drupal (nid) e deseja carregar o seu conteúdo em um bloco ou página, basta seguir os seguintes passos:
/* * Retorna um objeto com todas as informações do registro */ $node = node_load($nid); /* * Recebe como argumento o objeto do registro * Retorna um array estruturado relativo ao seu conteúdo */ $dados = node_build_content($node); /* * Renderiza o conteúdo */ print drupal_render($dados->content);
Muito simples, não!?
Quando você faz uma nova requisição ao mesmo controller, a instância atual é perdida, juntamente com as mensagens que houvera configurado.
Para enviar mensagens ao usuário em uma nova requisição, você deverá fazer uso de um helper chamado FlashMessenger, que, por sua vez, utiliza a classe Zend_Session para passar a mensagem à diante, removendo-a logo em seguida.
Segue um exemplo de uso desse helper:
class ExemploController extends Zend_Controller_Action { protected $_flashMessenger = null; public function init() { // Coloca o helper na variável de instância _flashMessenger $this->_flashMessenger = $this->_helper->getHelper('FlashMessenger'); $this->initView(); } public function atualAction() { // O método addMessage() adiciona uma mensagem $this->_flashMessenger->addMessage('Dados salvos com sucesso!'); } public function proximaAction() { // O método getMessages() retorna um Array com as mensagens $this->view->mensagens = $this->_flashMessenger->getMessages(); } }
Na view, você terá todas as mensagens em $this->mensagens
Em: Drupal
26 jan 2009Neste artigo vou listar alguns módulos que, na minha opinião, são essenciais para o desenvolvimento de um bom portal, apesar de não fazerem parte do core do Drupal.
Todo tipo de conteúdo no Drupal, por padrão, é composto de um título e um texto. Com o módulo CCK você poderá adicionar campos personalizados sob a forma de campos texto, comboboxes, checkboxes, entre outros.
As views constróem consultas de modo que você possa montar listas, blocos e tabelas apenas informando o tipo de conteúdo, campos, ordenação, quantidade de itens por página, etc.
Cria um template para exibição de cada tipo de conteúdo. Na página de criação do template serão disponibilizadas todas as variáveis disponíveis e com exemplos de valores, de modo que você só precisará “encaixá-las” no código HTML.
O editor de textos mais famoso e completo da web irá substituir as textareas convencionais, facilitando a formatação de blocos de texto e tornando a sua edição bem mais prática, uma vez que as tags HTML são geradas automaticamente.
Permite a geração de imagens com base nas enviadas por campos de upload. Essas cópias poderão ser redimensionadas, cortadas, convertidas em preto e branco, etc. A configuração é muito simples e intuitiva, você cria padrões pré-configurados e a partir daí todas as imagens estarão disponíveis sob estes formatos, mesmo as que foram enviadas antes da criação desses padrões.
É um widget para o CCK que possibilita validação de dimensões e upload de imagens via AJAX no formulário de criação de conteúdo, com visualização em miniatura logo após processado o envio.
Funciona de forma bem semelhante ao Imagefield, porém é indicado para o envio de outros tipos de arquivos.
Gera url’s automaticamente baseando-se na data, título, usuário de criação entre outros. A forma como as url’s são geradas é totalmente configurável. Dica: renomeie o arquivo i18n-ascii.example.txt para i18n-ascii.txt, depois, visite a página http://www.seusite.com/admin/build/path/pathauto, clique em “Configurações Gerais”, e marque a opção “Converter strings em letras e números da ASCII-96″. Isso irá assegurar que as url’s geradas não possuam caracteres não-ASCII.
A solução para a incompatibilidade do nosso “querido” Internet Explorer 6 com imagens PNG de 24 bits.
Corrige os nomes dos arquivos enviados, retirando caracteres inválidos. Sem este módulo, você não poderá visualizar os arquivos cujos nomes possuam acentos, espaços…
Criação de formulários personalizados com envio via email, gravação em Banco de Dados e download de relatórios.
Em: Drupal
23 jan 2009Alguns cuidados devem ser observados para que o módulo de upload do Drupal funcione de forma esperada:
Quando fizer o upload do site para um servidor Linux, não esquecer de dar permissão de escrita (777) na pasta que receberá os arquivos do upload (por padrão, sites/default/files). Faça o mesmo para a pasta de arquivos temporários (que você configura em Administrar->Configurações do Site->Sistema de Arquivos);
O Core do Drupal por si só não trata nomes de arquivos que contenham caracteres inválidos e não-ASCII (de acordo com a RFC 2396). Esses arquivos, ao serem enviados ao servidor, perdem seus nomes originais (pela perda dos caracteres inaceitáveis) ficando assim inacessíveis.
Para solucionar esse problema e não ter que renomear esses arquivos manualmente, a Unleashed Mind mantém um módulo chamado Transliteration, que checa os nomes dos arquivos no ato do upload e os renomea automaticamente. Considero este módulo essencial e está presente em todos os meus projetos feitos em Drupal. Recomendo!
Em: Zend
22 jan 2009Inúmeros fatores e ideais em comum levaram a equipe de desenvolvimento do Zend Framework a firmarem uma parceria com o Dojo Toolkit, como forma de garantir ótimos recursos para aplicações web como funções para Ajax e widgets para criação de interfaces com o usuário.
Para iniciar o uso do Dojo com em sua aplicação com Zend, baixe o pacote do Dojo Toolkit e descompacte-o na sua pasta public, no diretório de javascripts. Se você estiver utilizando a estrutura de diretórios do Zend Studio, ficará assim:

Repare que o pacote é composto por três pastas: dijit, dojo e dojox.
Dojo: É o core do framework, possui todas as funções de Ajax, seleção de elementos por CSS, utilitários de linguagem, JSON entre várias outras.
Dijit: Conjunto de widgets com os quais poderão ser criadas interfaces web 2.0 bastante interessantes. Se você não quiser utilizar os estilos prontos (skins), poderá criar o seu facilmente. Exemplos de widgets: paleta de cores, barras de status, janelas e alertas personalizados, campos de formulários personalizados e muito mais!
Dojox: Pacote de extensões para o Dojo, como gráficos e ferramentas de desenho.
Feito isso, iremos habilitá-lo no header do nosso layout (no meu caso, main.phtml):
<?php // Checa se o Dojo está ativo no Zend Framework if ($this->dojo()->isEnabled()) { // Configura o caminho para o arquivo do core do dojo $this->dojo()->setLocalPath($this->baseUrl().'/scripts/dojo/dojo.js') // Configura alguns parâmetros opcionais do Dojo // como parse após o carregamento da página // e configuração dos idiomas padrão ->setDjConfig(array( 'parseOnLoad' => true, 'extraLocale' => array('pt-br', 'en-us') )) // Seleciona o tema 'tundra' ->addStyleSheetModule('dijit.themes.tundra'); } ?> <?php dojo()->javascriptCaptureStart() ?> // Se você desejar criar funções javascript extras, // deverá colocá-las aqui <?php dojo()->javascriptCaptureEnd() ?> <?php // Insere as configurações acima no html echo $this->dojo(); ?>
Agora, na tag header, insira a classe relacionada à skin que você selecionou:
<body class="tundra">
Pronto! Agora você poderá utilizar as funções do Dojo normalmente, mas fique atento: alguns recursos requerem configurações adicionais.
Em: Drupal
20 jan 2009Ao gravar os dados de um formulário que contenha código PHP, você poderá se deparar com o seguinte erro:
A requisição não pode ser processada!
O servidor não suporta a ação requisitada pelo seu “browser”.
Se você acredita ter encontrado um problema no servidor, por favor entre em contato com o webmaster.
Erro 501
Isso acontece por que o mod_security do Apache não está permitindo a postagem do conteúdo em PHP via formulário.
A solução para este problema é a desativação deste módulo ou a criação de uma regra para o chamado “PHP INJECTION”.
Se você tiver acesso a essa configuração, poderá desabilitar esse filtro colocando as seguintes linhas no seu arquivo .htaccess:
# Desabilita o filtro do mod_security
SecFilterEngine Off
SecFilterScanPOST OffSe o erro persistir, é por que somente o pessoal da empresa de hospedagem tem permissões para fazer esse tipo de ajuste.
Rubens Gadelha é formado em Webdesign & Webmaster pela Universidade Estadual Vale do Acaraú - UVA e cursa atualmente o curso de bacharelado em Sistemas de Informação na Faculdade 7 de setembro (Fa7). Dedica algumas horas do dia à boa leitura e autodidática.
Atualmente trabalha como Desenvolvedor Web, focado na linguagem Java com bancos de dados Oracle e Postgres. Possui experiências anteriores na linguagem PHP e no Zend Framework, bibliotecas de javascript como JQuery, bancos de dados MySQL e no uso de CMS’s como Drupal.