Tag Cloud
E agora, José? Como fazer blocos com código PHP

No começo da semana, o Joel Wallis publicou um post com meu nome: Programei dentro de um bloco Drupal com o filtro PHP Code e agora o site quebrou. E agora, José?.
Já que ele pediu ajuda, não podia deixá-lo na mão[1]. A situação que o Joel discute no post é o seguinte:
- Um desenvolvedor criou um bloco com PHP no site.
- Um errinho de digitação e o desenvolvedor inseriu um erro de sintaxe no PHP.
- BUM! O site não funciona mais por causa desse erro de PHP e o desenvolvedor não consegue mais desativar o bloco.
A correção que o Joel propõe é simples: abrir o banco de dados na tabela "boxes" e corrigir o PHP incorreto. É realmente a solução mais rápida. No entanto, já que perguntaram para mim, eu proponho uma solução alternativa: pegar uma máquina do tempo e gerar o bloco em módulo, sem inserir código PHP dentro de um bloco pela interface.
A solução completa pode ser lida após o "leia mais".

Qual o problema em usar o formato de entrada por código PHP?
Muitos. Ter o formato de entrada Código PHP é uma péssima ideia. Sempre. Por que?
- Instabilidade. A chance de fazer um erro de sintaxe e quebrar o site, como no caso apresentado pelo Joel, é bem alta.
- Dificuldade de versionar. Se você usa um sistema de controle de versão como Git ou SVN… o código PHP que estiver em banco de dados não entra nesse versionamento. Se você tiver um ambiente de testes e outro de produção, passar o código de um lugar para outro é uma dificuldade.
- Segurança. Suponha que, por acidente, você libera o formato de entrada para usuários comuns. Ou pior: para anônimos. Imagine se na caixa de comentários o visitante pode inserir código PHP. O que isso significa? Acesso root, no seu servidor. Para todo mundo. Simpático, não? (sobre esse assunto, leia mais o post do Heine, da equipe de segurança do Drupal).
- Outras coisas como organização, higiene do código, desempenho… Muitos motivos!
Como proceder então? Se você precisa de um bloco que gera PHP, o certo é criar um módulo simples que faça o que você precisa.
Como criar blocos por módulo
Passo 1: Criar um módulo
Para criar um módulo, você precisa de dois arquivos: um .info e um .module. Suponha que você queria criar um módulo chamado "bloquinhos". Crie então dois arquivos:
- sites/all/modules/custom/bloquinhos/bloquinhos.info
- sites/all/modules/custom/bloquinhos/bloquinhos.module
No .info, você coloca o seguinte:
name = Bloquinhos
description = Gera bloquinhos para meu site.
core = 7.x
package = Meu projetoSobre arquivos .info, leia mais em: http://drupal.org/node/542202.
Passo 2: Criar o bloco
Agora você coloca o código no .module (o código abaixo é válido para o Drupal 7). Em primeiro lugar, você deve declarar uma "hook_block_info", que declara os blocos que seu módulo "bloquinhos" gera.
<?php
/**
* Implements hook_block_info()
*/
function bloquinhos_block_info() {
// um primeiro bloco
$blocks['umbloco'] = array(
'info' => 'Descrição do bloco, como aparece em admin/structure/block',
'cache' => DRUPAL_NO_CACHE, // esse bloco não pode ser cacheado. Ele vai rodar SEMPRE
);
$blocks['blocodousuario'] = array(
'info' => 'A descrição do outro bloco',
'cache' => DRUPAL_CACHE_PER_USER, // o cache é por usuário. Cada usuário tem um bloquinho diferente
);
return $blocks;
}
?>(onde está "bloquinhos" no código acima, coloque o nome do seu módulo)
Agora você declara o código que gera os blocos.
<?php
/**
* Implements hook_block_view()
*/
function bloquinhos_block_view($delta = '') {
$block = array();
switch ($delta) {
case 'umbloco':
$block['subject'] = 'Título do bloco';
$block['content'] = bloquinhos_umbloco();
break;
case 'blocodousuario':
$block['subject'] = 'Título do outro bloco';
$block['content'] = bloquinhos_blocodousuario();
break;
}
return $block;
}
function bloquinhos_umbloco() {
// o código PHP do bloco vai aqui …
}
function bloquinhos_blocodousuario() {
// o código PHP do bloco vai aqui …
}
?>Mais documentação sobre a geração de blocos em http://api.drupal.org/api/drupal/modules--block--block.api.php/function/hook_block_info/7 e http://api.drupal.org/api/drupal/modules--block--block.api.php/function/hook_block_view/7.
Pronto?
Pronto! Agora é só ativar o módulo e seus bloquinhos estão prontos para serem ativados em admin/structure/block. Você tem um site mais arrumado e qualquer problema que der no código PHP, basta alterar o arquivo.
Mais dúvidas? "E agora, José?" parece um bom nome para uma coluna aqui no blog. Se quiserem algum outro assunto, mandem comentários neste post, ou na página da Chuva Inc. no Facebook.
[1]: Ok, a piada foi infame, eu confesso.

Comentários
Boa dica!!!! Isso vai evitar
Boa dica!!!! Isso vai evitar entrar no BD sempre que der uma tela branca.
Comentar