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.

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:
-
class Twitter_post_ext {
-
var $name = 'Twitter Post';
-
var $version = '1.0';
-
var $description = 'Twitta o título e a url do post.';
-
var $settings_exist = 'y';
-
var $docs_url = '';
-
-
function __construct($settings='')
-
{
-
$this->EE =& get_instance();
-
-
$this->settings = $settings;
-
}
-
}
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.
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():
-
function activate_extension()
-
{
-
// Configurações para adicionarmos o usuário e a senha do twitter
-
'consumer_key' => '',
-
'consumer_secret' => '',
-
'acess_token' => '',
-
'acess_token_secret' => ''
-
);
-
-
// Configurações obrigatórias da extensão
-
'class' => __CLASS__,
-
'method' => 'twitter_update',
-
'hook' => 'entry_submission_end',
-
'priority' => 1,
-
'version' => $this->version,
-
'enabled' => 'y'
-
);
-
-
// Adiciona as configurações na tabela extensions
-
$this->EE->db->insert('extensions', $data);
-
}
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():
-
function disable_extension()
-
{
-
$this->EE->db->where('class', __CLASS__);
-
$this->EE->db->delete('extensions');
-
}
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
-
'consumer_key' => 'Consumer Key',
-
'consumer_secret' => 'Consumer Secret',
-
'acess_token' => 'Acess Token',
-
'acess_token_secret' => 'Acess Token Secret'
-
);
-
?>
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():
-
function settings()
-
{
-
'consumer_key' => '',
-
'consumer_secret' => '',
-
'acess_token' => '',
-
'acess_token_secret' => ''
-
);
-
return $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.
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.









