| « B2evolution 2.4.6 - Finalmente, feedburner | Criando plugins para b2evolution - introdução » |
Criando plugins para b2evolution - um renderizador de texto
pluginsA maioria (se não todos) os CMS faz algum controle de quais tags podem entrar em um texto ou em um comentário. O b2evolution usa um validador de XHTML, para que seu plugin seja HTML válido, e não permite que vc use algumas tags, como por exemplo, object e embed. Você pode desabilitar a validação, mas isso não é a opção mais interessante. Você pode incluir objetos flash através de um plugin!
Digamos, por exemplo, que queiramos incluir alguma apresentação do slideshare. Ao lado de cada slide, em "Embed", o slideshare dispõe de um código para copiar e colar no seu site. Mas se o seu validador de xhtml do b2evolution estiver habilitado, a tag object será considerada ilegal (fora outros erros relacionados a style, vai depender da sua configuração).
No slideshare, ao lado do código para ser copiado no site, tem um link chamado 'customize', onde existe um código "for Wordpress", que podemos postar sem problemas no b2evolution, mas não fará com que os slides sejam exibidos:
[slideshare id=380143&doc=django-096-1209509342005285-9&w=425]
Usando um plugin, podemos fazer com que o b2evolution entenda esse código e o transforme numa apresentação. Para isso, vamos criar um plugin renderizador de texto.
Vamos chamar nosso plugin de presentation plugin (poderÃamos chamar de slideshare plugin, mas queremos que ele suporte outros sistemas de publicação de slides no futuro). Seguindo as indicações na primeira parte do tutorial, vamos criar na pasta plugins uma pasta chamada presentation_plugin, e dentro dela um arquivo chamado _presentation.plugin.php. Para ganhar tempo, podemos copiar o skeleton.plugin.php para presentation_plugin/_presentation_plugin.php (os nomes dos arquivos são padronizados para que o b2evolution encontre os plugins, por isso é importante seguir isso corretamente!)
Vamos começar a fazer nosso plugin. Primeiro precisamos mudar o nome da classe e preencher as variáveis que deverão ser sobrescritas:
PHP:
class presentation_plugin extends Plugin | |
{ | |
/** | |
* Variables below MUST be overriden by plugin implementations, | |
* either in the subclass declaration or in the subclass constructor. | |
*/ | |
var $name = 'Presentation'; | |
/** | |
* Code, if this is a renderer or pingback plugin. | |
*/ | |
var $code = 'evo_presentation'; | |
var $priority = 50; | |
var $version = '0.1-dev'; | |
var $author = 'http://example.com/'; | |
var $help_url = ''; | |
| |
var $apply_rendering = 'opt-in'; |
Depois, precisamos substituir o PluginInit (o 'construtor' do Plugin)
PHP:
function PluginInit( & $params ) | |
{ | |
$this->short_desc = $this->T_('Presentation Plugin'); | |
$this->long_desc = $this->T_('Presentation Plugin for b2evolution. Supports slisdhare and ...'); | |
} |
Um plugin renderizador de texto deve implementar o método RenderItemasHtml. Vamos lá!
PHP:
function RenderItemAsHtml( $params ) | |
{ | |
$content = $params['data']; | |
$params['data'] = callback_on_non_matching_blocks( $content, '~(<(code|pre)[^>]*>.*?</\2>)|(<[^>]+?>)~is', array($this,'render_slideshare' )); | |
return true; | |
} |
callback_on_non_matching_blocks é uma função do b2evolution e irá aplicar uma função de substituição de textos em todo o trecho que NÃO casar com uma determinada regex. Com essa regex, estamos definindo que não queremos que o texto dentro de tags code, pre, e dentro de definições de tags sejam afetados pelo método render_slideshare. (Valeu Yabba pela ajuda com a regex!). Vamos agora ao método render_slideshare do objeto:
PHP:
function render_slideshare($text) | |
{ | |
$regex = "#\[slideshare(.+?)\]#is"; | |
$new_content = preg_replace_callback( $regex, array($this,'slideshare_replacer'), $text ); | |
return $new_content; | |
} |
Mais uma regex, para casar o texto do slidshare e efetivamente fazer a substituição, no método slideshare_replacer.
PHP:
function slideshare_replacer ( $matches ) | |
{ | |
$slideshare = html_entity_decode($matches[1]); | |
$slidevars = array(); | |
parse_str($slideshare,$slidevars); | |
| |
$height = $slidevars['w']/1.22; | |
$res = '<object style="margin:0px" width="'.$slidevars['w'].'" '.'height="'.$height.'"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc='.$slidevars['doc'].'"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc='.$slidevars['doc'].'" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="'.$slidevars['w'].'" '.'height="'.$height.'"></embed></object>'; | |
return $res; | |
} |
A forma com que o slideshare gera o texto para publicação facilitou as coisas: usando a função parse_str do php eu consigo transformar os parâmetros (id=380143&doc=django-096-1209509342005285-9&w=425) em um hash. AÃ, foi só gerar o texto da tag object.
Como queremos que nosso slide seja exibido também em feeds, precisamos escrever o método RenderItemAsXml. Felizmente, isso é bem simples:
PHP:
function RenderItemAsXml( $params ) | |
{ | |
return $this->RenderItemAsHtml( $params); | |
} |
Nosso plugin está pronto! Agora, basta selecionar o "Presentation" nos renderizador de texto ao publicar sua apresentação do slideshare! Se você quiser dar uma olhada em como fica o plugin pronto, você pode baixar o arquivo.
O resultado: [slideshare id=380143&doc=django-096-1209509342005285-9&w=425]
Mais ainda há mais o que fazer. Na próxima parte do tutorial, vamos ver como usar as ferramentas que o b2evolution para criar configurações para o nosso plugin! Veja a parte 1!
Endereço de trackback para este post
Trackback URL (clique direito e copie atalho/localização do link)
2 comentários
-
§ Sérgio Lima
dito em: 31/12/2008 @ 20:36
Só falta aprender php :-) -
§ Gustavo de Andrade Rocha
dito em: 29/12/2009 @ 17:43
Eu não sei nada sobre php então eu baixei o plugin para inserir no blog, porém, não deu certo e também deu um erro. Alguém pode me ajudar? :-

