Como criar um módulo (parte 1) - Drupal 7

Olá pessoas! Vou iniciar agora um estudo completo de como criar um módulo para Drupal 7.

Módulo é o que compõem a base para a construção de funções e configurações da base do Drupal. Também são os meios que temos para extender as funcionalidades que a versão padrão do Drupal, também conhecida como núcleo, nos oferece. Podemos dizer que módulos são como peças de Lego, nos possibilitando juntar várias peças para montar uma estrutura maior. Eles encaixam perfeitamente um no outro, seguindo uma série de direções predefinidas. Com uma combinação de módulos, é possível dar soluções ricas e complexas.

Existem duas categorias gerais para os módulos do Drupal: núcleo e contribuídos. Os do núcleo são aqueles que já vêem inseridos no Drupal e abrangem módulos para enquetes, menus, taxonomias, busca, agregador de notícias, fóruns, entre outros. Os módulos contribuídos são todos aqueles criados e mantidos pela comunidade, que extendem e melhoram a base funcional do núcleo do Drupal. Existem milhares (realmente, são milhares) de módulos contribuídos disponíveis para download em http://drupal.org/project/modules, que abordam as mais diversas situações, desde tarefas simples como exibir a data atual até soluções complexas, como uma loja virtual.

Sabendo disso, vou seguir com a criação do meu módulo personalizado. Para ter melhor aproveitamento e não valer somente como rascunho, vou pegar uma situação que tenho do mundo real. Assim posso usar esse módulo em projetos futuros. Meu módulo será voltado ao processo de aplicação das funcionalidades e conteúdo desenvolvido em uma instalação Drupal para outra, também conhecido como Deploy. O módulo não vai resolver todas as questões de Deploy, mas será muito útil para manter o sistema atualizado de acordo as versões das coisas que desenvolvo, além de definir conteúdos estáticos para minhas instalações.

Criação dos arquivos

Para dar início, é bom saber como escolher um nome para o módulo. E como estou falando de programação, abordando também a contribuição, vou usar muitas expressões em inglês, para que o trabalho seja entendível universalmente e outras pessoas possam melhorar ou adaptar para sua situação. Como na música, onde a partitura é lida por qualquer músico do mundo. Dessa forma, o nome "custom_deploy" é bom, pois é curto e descritivo. Agora preciso de um lugar para colocar o módulo.

Os módulos do núcleo do Drupal ficam armazenados no diretório /modules, protegendo os módulos contribuídos e os módulos personalizados de serem sobrescritos ou apagados durante o qualquer processo de atualização. Sabendo disso, ainda vou fazer mais uma separação, entre módulos contribuídos e personalizados. Os módulos contribuídos, que são baixados diretamente do Drupal.org, vou armazenar em /sites/all/modules/contrib e os módulos personalizados, em /sites/all/modules/custom. Essa prática vai facilitar a manutenção futura do núcleo do Drupal, dos módulos contribuídos e também dos módulos personalizados. Assim, vou criar um diretório /sites/all/modules/custom/custom_deploy que conterá os arquivos do módulo.

O primeiro arquivo que preciso criar para o novo módulo será o "custom_deploy.info". Para cada módulo compatível com o Drupal 7 é preciso de um aquivo *.info, que deve ter o mesmo nome do módulo. Para o módulo custom_deploy, as informações básicas para que o Drupal reconheça o módulo são:

name = "Custom Deploy" description = "Assists developers in the deployment process." package = "Drupal de Elite" core = "7.x" version = "7.x-1.0" files[] = custom_deploy.module files[] = custom_deploy.install files[] = custom_deploy.admin.inc configure=admin/config/system/custom_deploy/settings

A estrutura do arquivo é padrão de todos os módulos para Drupal 7. O elemento name é usado para exibir o nome do módulo na página de administração dos módulos. O elemento description é a descrição do módulo, também exibida na página de administração dos módulos. O elemento package define um grupo (ou categoria) para que o módulo seja associado. Na página de administração dos módulos, cada módulo é exibido agrupado pelo package. O elemento core define a versão do Drupal para qual o módulo é compatível. O elemento version define a versão do módulo e o elemento php, qual a versão do PHP é requerida para o funcionamento do módulo. O elemento files é um array dos nomes de arquivos que são vinculados ao módulo. No caso do custom_deploy os arquivos vinculados são custom_deploy.module, custom_deploy.install e custom_deploy.admin.inc.

Nós também podemos definir valores opcionais adicionais aos que listamos anteriormente. Segue um exemplo de um módulo que requer PHP 5.3 e tem como dependência os módulos comment e taxonomy instalados para que possa funcionar:

name = "Random Comments" description = "Display random comments." package = "Drupal de Elite" core = "7.x" version = "7.x-1.0" dependencies[] = comment dependencies[] = taxonomy files[] = custom_deploy.module files[] = custom_deploy.install php = 5.3

Com isso, tenho o módulo custom_deploy pronto para uso. Agora vou criar o arquivo custom_deploy.module no mesmo lugar onde se encontra o custom_deploy.info, ou seja, no diretório /sites/all/modules/custom/custom_deploy. A primeira coisa que o arquivo deve conter é a abertura da tag PHP:

<?php /** * @file * Assists developers in the deployment process. * * Adds some funcions and configurations * to help developers in some process. */

Antes de continuar, existe já um padrão no estilo do comentário. Comecei com /** e em cada linha seguinte, usei um asterisco simples identado com um único espaço ( *). Também usei */ em uma linha final para fechar o comentário. O token @file define o que vem na linha seguinte, que é a descrição em uma linha do que o arquivo faz. Essa descrição em uma linha é usada pelo módulo api.module, que é um extrator e formatador de documentação automatizada do Drupal (Para você leitor, é bom reservar depois um tempo para visitar o http://api.drupal.org e ler detalhadamente na documentação, sobre cada API que o Drupal provê). Após uma linha em branco, adicionei uma descrição longa para outros programadores que estão examinando o código. Note que intencionalmente não fechei a tag "?>", que é opcional no PHP e ainda, quando incluídas, podem causar problemas com espaços em branco nos arquivos - veja http://drupal.org/coding-standards#phptags.

A próxima coisa que farei é definir algumas configurações que vou usar via interface web para escolher como o custom_deploy vai se comportar. Farei isso em dois passos: Primeiro, definir um caminho na URL (path) para que as configurações sejam acessíveis e depois, crio o formulário de configurações. Para definir o path, preciso de um hook e esse hook é o hook_menu.

Por enquanto é isso. No próximo post sobre esse assunto, a parte 2, falarei sobre a implementação do hook_menu. Se você gostou ou teve proveito deste post, pode retribuir com comentários, curtindo e compartilhando. Quando sair a continuação, aqui terá um link para a sequência. Até breve!