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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 = ''; var $settings = array(); 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():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
function activate_extension() { // Configurações para adicionarmos o usuário e a senha do twitter $this->settings = array( 'consumer_key' => '', 'consumer_secret' => '', 'acess_token' => '', 'acess_token_secret' => '' ); // Configurações obrigatórias da extensão $data = array( 'class' => __CLASS__, 'method' => 'twitter_update', 'hook' => 'entry_submission_end', 'settings' => serialize($this->settings), '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():
1 2 3 4 5 |
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).
1 2 3 4 5 6 7 8 |
<?php $lang = array( '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():
1 2 3 4 5 6 7 8 9 10 |
function settings() { $settings = array( '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.