Como Desenvolver Extensões para ExpressionEngine 2 – Parte 1

No ExpressionEngine, você pode modificar algumas funcionalidades internas do sistema sem a necessidade de mexer em uma linha do core. Com isso, é possível atualizar a versão do CMS sem perder as modificações. Essas alterações são feitas com extensões, por meio de hooks (ganchos) localizadas em alguns pontos do sistema.

Por padrão, o EE não vem com nenhuma extensão pré-instalada. Para saber se na sua instalação existe alguma extensão, vá até o menu principal Add-Ons > Extensions, como na imagem abaixo.

Menu de Extensões do ExpressionEngine

Toda extensão instalada deve ficar no diretório /system/expressionengine/third_party/ e será mostrada nessa página de extensões.

Primeiros passos para o desenvolvimento de uma extensão

Toda extensão é escrita em um arquivo que deve ficar dentro de uma pasta que, por sua vez, fica dentro da pasta third_party citada anteriormente. O nome da pasta deve ser igual ao nome da classe, em minúsculo. O nome do arquivo deve ser o mesmo nome da classe, também em minúsculo, com o prefixo ext. e o sufixo .php. Para ficar mais claro, vamos criar uma extensão que irá twittar o nome e a url do post quando o mesmo for publicado. Essa extensão se chamará Twitter Post. =]

A primeira coisa é criar uma pasta chamada twitter_post em /system/expressionengine/third_party/. Depois, um arquivo php dentro dessa pasta com o nome de ext.twitter_post.php. O conteúdo do arquivo deve conter uma classe php chamada Twitter_post_ext, com um construtor e algumas variáveis de configurações. Veja:

As três primeiras variáveis são autoexplicativas. A variável $settings_exist, informa se a extensão terá ou não uma página de configurações. Os valores aceitos são y, para sim, ou n, para não. Vamos deixar como y porque temos que adicionar nome e senha do Twitter. A variável $settings é o array que guarda as configurações, se existir. Na variável $docs_url, você pode adicionar o link para a documentação da extensão.

O construtor recebe um parâmetro com as configurações e adiciona na variável settings. Como agora o EE é baseado no Framework CodeIgniter, Você deve chamar a função get_instance(), que retorna o super objeto do CodeIgniter, para usar as funções nativas do framework e do CMS.

Feito isso, você pode navegar até a página de extensões e ver a sua extensão. Se na coluna Status estiver escrito Disabled, sem link, será necessários habilitar o uso de extensões. Isso é fácil, é só clicar no botão “Enable Extensions?” que fica na mesma página. Quando habilitado, um link aparecerá ao lado do Disabled, o link Enable?. O link, nesse momento, não tem nenhuma ação, já que ainda precisamos criar alguns métodos na classe.

Página de Extensões do ExpressionEngine

Vamos criar mais dois métodos: activate_extension e disable_extension. Os nomes não podem ser diferentes porque o sistema irá procurar por eles para ativar e desativar a extensão.

Método activate_extension():

Como podem ver, usamos um array $settings com configurações que vamos usar para postar no Twitter. Essa configuração pode ou não existir. Já o array $data é obrigatório para o sistema ativar a extensão. O array é formado pelos campos da tabela extensions, são elas:

  • class – Nome da classe da extensão
  • method – Método que será chamado pelo hook (item abaixo)
  • hook – Nome do hook que chamará o método. Veja a lista de hooks disponíveis.
  • settings – Array de configurações serializadas
  • priority – Prioridade de chamada da extensão. Pode ser de 1 (primeiro a ser chamado) a 10 (último chamado)
  • version – Versão da extensnão
  • enabled – se a extensão é habilitada

Agora o método para desabilitar é bem mais simples. Basta deletar da tabela extensions.

Método disable_extension():

Um detalhe importante, é que quando a opção de ter uma página de configurações é ativada, o sistema procura um arquivo de idiomas em /system/expressionengine/language/english. Esse arquivo é simples e deve ser nomeado praticamente igual ao nome do arquivo de extensão, a diferença é o prefixo, que fica como lang. e não ext.. Ex.: /system/expressionengine/language/english/lang.twitter_post.php. O sistema só exige que o arquivo exista, se você não escrever nada no arquivo, ele vai funcionar do mesmo jeito. =] Mas caso queira fazer uso do arquivo (já que ele tem que existir…), crie um array $lang e adicione o termo (chave do array) e a tradução (valor do array).

consumer_key, consumer_secret, acess_token e acess_token_secret é o que será usado no método settings() que deve ser criado para a página de configuração.

Método settings():

Nessa extensão, a página de configuração é bem simples, só com quatro campos text. Assim sendo, o sistema cria automaticamente os campos só adicionando o array no método settings(). Se as configurações fossem mais complexas, com mais campos e/ou com textos, seria interessante fazer uso do método settings_form() e de uma view para montar a página customizada.

Depois de criar o arquivo da extensão com os métodos __construct(), activate_extension(), disable_extension(), settings(), e criar o arquivo de linguagem, já será possível habilitar e desabilitar a extensão, além de ver e editar a página de configurações.

Configurações da Extensão Twitter Post

Para não deixar este post muito longo, vou dividí-lo em duas partes. Nessa primeira parte, a extensão já está praticamente pronta, faltando apenas a função responsável em enviar as informações para o Twitter. Essa função ficará para a segunda parte.

Não deixe de ler a segunda parte deste tutorial.