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:

PHP:
  1. class Twitter_post_ext {
  2.     var $name      = 'Twitter Post';
  3.     var $version       = '1.0';
  4.     var $description    = 'Twitta o título e a url do post.';
  5.     var $settings_exist = 'y';
  6.     var $docs_url      = '';
  7.     var $settings     = array();
  8.    
  9.     function __construct($settings='')
  10.     {
  11.         $this->EE =& get_instance();
  12.  
  13.         $this->settings = $settings;
  14.     }
  15. }

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():

PHP:
  1. function activate_extension()
  2. {
  3.     // Configurações para adicionarmos o usuário e a senha do twitter
  4.     $this->settings = array(
  5.         'consumer_key'      => '',
  6.         'consumer_secret'      => '',
  7.         'acess_token'         => '',
  8.         'acess_token_secret'    => ''
  9.     );
  10.  
  11.     // Configurações obrigatórias da extensão
  12.     $data = array(
  13.         'class'  => __CLASS__,
  14.         'method'    => 'twitter_update',
  15.         'hook'    => 'entry_submission_end',
  16.         'settings'  => serialize($this->settings),
  17.         'priority'  => 1,
  18.         'version'   => $this->version,
  19.         'enabled'   => 'y'
  20.     );
  21.        
  22.     // Adiciona as configurações na tabela extensions
  23.     $this->EE->db->insert('extensions', $data);
  24. }

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():

PHP:
  1. function disable_extension()
  2. {
  3.     $this->EE->db->where('class', __CLASS__);
  4.     $this->EE->db->delete('extensions');
  5. }

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).

PHP:
  1. <?php
  2. $lang = array(
  3.     'consumer_key'      => 'Consumer Key',
  4.     'consumer_secret'      => 'Consumer Secret',
  5.     'acess_token'         => 'Acess Token',
  6.     'acess_token_secret'    => 'Acess Token Secret'
  7. );
  8. ?>

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():

PHP:
  1. function settings()
  2. {
  3.     $settings = array(
  4.         'consumer_key'      => '',
  5.         'consumer_secret'      => '',
  6.         'acess_token'         => '',
  7.         'acess_token_secret'    => ''
  8.     );
  9.     return $settings;
  10. }

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.

Leia Também:

  1. Tag Cloud Para ExpressionEngine
  2. O Que é ExpressionEngine?
  3. Extensões Para o Safari 5
  4. Como Instalar ExpressionEngine
  5. Como Desenvolver Extensões para ExpressionEngine 2 – Parte 2

Leave a Reply


Faça uma pesquisa

Galeria Flickr

  • Bandeira
  • Bote
  • Igreja Ilhabela
  • Navio
  • Flor
  • Golf
  • Trem
  • Tico