Feliz ano novo, pessoas!

O primeiro artigo do ano é da coluna SNIPPET, e vai explicar como criar uma página que executa um código PHP qualquer, sem a necessidade de usar o módulo PHP Filter.

Tudo começou com um post do Joel Wallis sugerindo uma solução para quando um bloco customizado com código PHP incorreto quebra o seu projeto.

O José da Chuva-inc, a publicou um texto sugerindo que o ideal é não utilizar o filtro PHP pois o mesmo pode acarretar problemas de segurança. Em vez disso, ele ensinou a criar os blocos diretamente com PHP, através de um módulo customizado.

O próximo passo natural é evitar usar o filtro PHP na criação de páginas, pelos mesmos motivos apresentados pelo post do Zé.

Começando

Primeiro, crie uma pasta dentro da pasta /sites/all/modules com o nome do módulo que desejamos criar. Eu chamei-o criativamente de "páginas" (mas não use acentos no nome da pasta).

Dentro desta pasta, crie dois arquivos de texto vazios e renomeie-os para paginas.info e paginas.php.

Dentro de paginas.info vamos escrever o seguinte código:

  1. name = Páginas com código PHP
  2. description = Páginas customizadas para o meu projeto.
  3. core = 7.x
  4. package = Marcus VBP

Eu chamei o package de "Marcus VBP" porque é este o grupo em que o módulo irá aparecer na página de listagem de módulos. Você pode chamar do que quiser, obviamente.

E dentro do arquivos paginas.module vai o seguinte código:

  1. <?php
  2.  
  3. function paginas_menu() {
  4.   $items['custom/bazinga'] = array(
  5.     'title' => 'Bazinga!',
  6.     'page callback' => 'paginas_bazinga',
  7.     'access callback' => TRUE,
  8.     'type' => MENU_SUGGESTED_ITEM
  9.   );
  10.   return $items;
  11. }

O primeiro passo é usar o hook_menu para criar o link para a página que iremos criar (o link em questão é custom/bazinga). As chaves utilizadas em cada array (onde cada array é o link que estamos criando) são os seguintes:

  • title: o título da página.
  • page callback: a função que irá construir o conteúdo da página (no nosso caso, é "paginas_bazinga").
  • access callback: o valor TRUE significa que esta página não tem restrições de acesso.
  • type: optei por usar a constante MENU_SUGGESTED_ITEM pois a mesma irá criar um item de menu, mas ele aparecerá desativado, dentro do menu "Navegação". Eu poderia omitir esta chave. O sistema utilizaria MENU_NORMAL_ITEM se for este o caso.

Eu poderia ainda especificar o menu onde o link apareceria, usando a chave menu_name. Como eu omiti, o Drupal utilizar o menu Navegação (Navigation) como padrão. Para mais detalhes sobre a função hook_menu, consulte a documentação.

O segundo e principal passo é criar a função paginas_bazinga, que conterá o conteúdo da página propriamente dito.

  1. function paginas_bazinga() {
  2.   $conteudo = '';
  3.   $conteudo .= '<p>Esta é uma página com conteúdo customizado</p>';
  4.   $conteudo .= '<p>'. format_date(time(),'short') .'</p>';
  5.   $conteudo .= '<p>Proactively empower customer directed supply chains vis-a-vis enabled intellectual capital. Seamlessly supply strategic quality vectors rather than resource maximizing quality vectors. Distinctively extend web-enabled process improvements through user-centric markets. Synergistically integrate out-of-the-box portals after leading-edge opportunities. Objectively monetize professional leadership after proactive intellectual capital.</p>';
  6.   return $conteudo;
  7. }

Utilize "return" para que o conteúdo da página seja exibido dentro da área de conteúdo do seu site. Caso você utilize "print $conteudo" no lugar de "return $conteudo" o conteúdo será exibido diretamente, sem ser incluído no tema ou em qualquer tipo de estrutura. Eu preparei exemplos:

  1. Página usando return $conteudo.
  2. Página usando print $conteudo.

Como podem ver, o processo é bem simples, e ainda deixa seu projeto mais seguro.

Use sem moderação. Até a próxima!

Tópicos: 
DrupalPHPsnippet

Comentários

Capi Etheriel

Quem quiser usar com moderação, basta colocar no 'access callback' uma função que checa se o usuário tem direito a ver o conteúdo ou não. Pra checar, por exemplo, se o usuário tem a permissão 'pode ver pornografia', basta colocar 'access callback' => 'user_access', 'access arguments' => array('pode ver pornografia').

Detecção da idade do usuário, no entanto, é só do lado do cliente.

Comentar