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.
Em: Drupal
18 jan 2009Uma região em um tema do Drupal representa uma área dentro da qual poderemos inserir os blocos. Geralmente, existem cinco pré-definidas, são elas: Left Sidebar (Barra lateral esquerda), Right Sidebar (Barra lateral direita), Content (Conteúdo), Header (Cabeçalho) e Footer (Rodapé).
Porém em alguns casos, se faz necessária a criação de novos espaços para blocos. Para tal, iremos incluí-las no arquivo nomedotema.info da seguinte forma:
regions[nomedaregiao] = Rótulo da região
Onde nomedaregiao deverá seguir as mesmas regras da criação de variáveis do PHP.
Definir as regiões no arquivo nomedotema.info fará com que as padrões do tema sejam ignoradas. Portanto, se você pretende continuar utilizando-as, deve definí-las novamente:
regions[left] = Left sidebar regions[right] = Right sidebar regions[content] = Content regions[header] = Header regions[footer] = Footer
Depois, é só incluir no arquivo page.tpl.php, onde você quer que seja inserida a nova região, a linha:
<?php print $nomedaregiao ?>
Para facilitar a estilização via CSS, poderá fazer assim:
<div id="nomedaregiao" class="nome-da-regiao"> <?php print $nomedaregiao ?> </div>
Se desejar que a região só apareça se contiver blocos:
<?php if ($nomedaregiao): ?> <div id="nomedaregiao" class="nome-da-regiao"> <?php print $nomedaregiao ?> </div> <?php endif; ?>
Por exemplo, se quisermos adicionar no tema framework uma região chamada banners, mantendo as regiões padrão, deveremos abrir o arquivo framework.info e incluir as seguintes linhas:
regions[left] = Left sidebar regions[right] = Right sidebar regions[content] = Content regions[header] = Header regions[footer] = Footer regions[banner] = Banner
Depois, incluímos no page.tpl.php:
<?php if ($banners): ?> <div id="banners" class="banners"> <?php print $banners ?> </div> <?php endif; ?>
IMPORTANTE: O conteúdo do do arquivo .info é armazenado no cache do Drupal. Por isso, após a inserção no arquivo .info você deverá ir a página admin/settings/performance e pressionar o botão de limpeza de cache, para que suas alterações tenham efeito imediato.
Em: Drupal
17 jan 2009Os hooks (ganchos em inglês) são funções PHP pré-definidas, criadas para promover a integração dos módulos com o núcleo do sistema.
O programador, ao criar um novo módulo, extenderá essas funções, respeitando apenas os parâmetros a serem recebidos e o valor retornado, ficando a implementação propriamente dita totalmente adequável às suas necessidades.Outras funções poderão ser definidas no módulo para ajudá-lo na implementação dos hooks ou executar as suas ações específicas.
Na api do drupal você encontra uma lista completa de todos os hooks disponíveis com suas respectivas descrições.
A implementação dos hooks inicia-se no uso correto da nomenclatura, que se dá substituindo a palavra hook no nome da função pelo nome do módulo.
Por exemplo, para implementar o hook_menu() em um módulo chamado notícias, vá até a pasta deste módulo, abra o arquivo noticias.module e crie uma função chamada noticias_menu(), esse hook é responsável por criar ítens de menu e chamadas de página através de url (não detalharemos o hook_menu() para não fugirmos do escopo desta matéria).
O código desse exemplo ficaria assim:
<?php /** * Implementação do hook_menu */ function noticias_menu() { $items = array(); // Cria um ítem de menu $items['noticias'] = array( 'title' => 'Noticias', 'page callback' => 'noticias_page', 'access arguments' => array('access content'), 'type' => MENU_NORMAL_ITEM, ); // Cria uma url para uma página $items['noticias/lista'] = array( 'title' => t('Notícias'), 'page callback' => 'noticias_list', 'access arguments' => array('access content'), 'type' => MENU_CALLBACK, ); return $items; } ?>
Com o uso do hook_menu(), o drupal irá incluir os links do módulos de notícias na geração do menu do sistema.
Qualquer dúvida ou sugestão, é só comentar!!
Rubens Gadelha é formado em Webdesign & Webmaster (hoje Desenvolvimento de Web e Comércio Eletrônico) pela Universidade Estadual Vale do Acaraú - UVA e dedica algumas horas do dia à boa leitura e autodidática.
Atualmente trabalha como Programador Web, focado na linguagem PHP e no Zend Framework, bibliotecas de javascript como JQuery e o uso de CMS’s como Drupal. Os bancos de dados MySQL e PostGres também fazem parte do seu dia-a-dia.
Dedica suas horas vagas ao aprofundamento na linguagem Java