Aldeia Numaboa

  • Increase font size
  • Default font size
  • Decrease font size

Joomla e Twitter

Indique esta página Imprimir PDF
(10 votos, média 4.7 de 5)

Joomla O Twitter se transformou numa febre mundial por ser um imenso repositório de links que levam para os assuntos mais diversos. Como o Twitter é um serviço gratuito, porque não colocar os artigos publicados num site Joomla neste microblog e rede social diretamente através da interface de administração? Além de divulgar os textos num veículo de comunicação de sucesso para aumentar o número de visitas, o Twitter também funciona como uma espécie de diário que registra minha produção e atividade. Resolvi encarar a novidade e, como sempre, compartilhar a experiência com quem tiver interesse no assunto.

O planejamento

Podemos criar um plugin que é acionado toda vez que um artigo for salvo, mas desisti desta idéia por que não só artigos novos, como também os que fossem atualizados, seriam colocados no Twitter. Para evitar entradas em duplicidade, preferi criar um botão que permite "pilotar" novas inserções.

Vamos adicionar um botão na barra de ferramentas da tela de edição de artigos na interface administrativa. Clicando neste botão, o título e um link para o artigo que estiver sendo editado devem ser inseridos no Twitter.

O componente que permite criar e editar artigos é o /administrator/components/com_content. Algumas partes deste componente serão modificadas para atender a nova necessidade. Aqui vai um alerta: quando você for atualizar o Joomla, não se esqueça de que este componente foi modificado. Se ele for sobre-escrito, você pode perder as modificações feitas.

O botão customizado precisa ser atrelado a uma função que cria o título+link e que faz conexão com o Twitter para enviar o novo conteúdo.

A função

Vamos começar escrevendo a função insereTwitter() no arquivo /administrator/components/com_content/controller.php, logo depois da função insertPagebreak().

Para criar o link é preciso saber o tipo de endereçamento que está sendo usado no site: tradicional, do tipo http://www.seusite.com.br/index.php?option=com_content&view=article&id=1115, ou SEF , que é o mesmo link apresentado como http://www.seusite.com.br/informatica/tutos/1115-seuartigo. Escolha a função de acordo com seu modelo de link.

De acordo com as especificações do Twitter, só serão aceitas inserções com no máximo 140 caracteres. Isto nos obriga a "encolher" o conteúdo enviado se o limite de 140 caracteres for ultrapassado.

/administrator/components/com_content/controller.php - função sem SEF
function insertPagebreak() { $document =& JFactory::getDocument(); $document->setTitle(JText::_('PGB ARTICLE PAGEBRK')); ContentView::insertPagebreak(); }   function insereTwitter() { global $mainframe; $db =& JFactory::getDBO();   //----- Obter o registro do artigo $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' ); $query = 'SELECT *' . ' FROM #__content' . ' WHERE id = '.(int) $cid[0]; $db->setQuery($query, 0, 1); $artigo = $db->loadObject();   //----- Criar o link $link = 'http://www.seusite.com.br/index.php?option=com_content&view=article&id=' . $artigo->id;   //----- Criar conexão com o Twitter $login = 'usuário'; $pass = 'senha'; $host = 'twitter.com'; $porta = 80; $fp = fsockopen( $host, $porta, $err_num, $err_msg, 10 );   $conta = base64_encode( $login . ':' . $pass ); if($fp) { $twit = 'status=' . $artigo->title . ' ' . $link; $limite = strlen( $twit ); if( $limite > 147 ) // 140 = dados + 7 = header { // cortar caracteres do título $tit_curto = substr( $artigo->title, 0, strlen( $artigo->title ) - ( $limite-147 ) ); $twit = 'status=' . $tit_curto . ' ' . $link; $limite = strlen( $twit ); }   //----- Enviar dados fwrite($fp, "POST /statuses/update.xml <a class="mosinfopop" style="cursor:help;border-bottom:1px dotted #000000;" href="javascript:void(0)" onmouseover="return overlib('<p>O <b>H</b>yper<b>T</b>ext <b>T</b>ransfer <b>P</b>rotocol (Protocolo de Transferência de Hipertexto - HTTP) é o protocolo de comunicação utilizado para a troca de dados entre um navegador e um servidor web. É o protocolo de comunicação que você aciona quando digita um endereço no seu navegador: http://www...</p>&amp;nbsp;<br />', CAPTION, 'HTTP',BELOW,RIGHT, WIDTH, 300, FGCOLOR, '#CCCCFF', BGCOLOR, '#333399', TEXTCOLOR, '#000000', CAPCOLOR, '#FFFFFF', OFFSETX, 10, OFFSETY, 10);" onmouseout="return nd();" > HTTP</a>/1.1\n"); fwrite($fp, "Authorization: Basic $conta\n"); fwrite($fp, "Host: $host\n"); fwrite($fp, "Content-type: application/x-www-form-urlencoded, charset=utf-8\n"); fwrite($fp, "Content-length: $limite\n"); fwrite($fp, "Connection: close\n\n"); fwrite($fp, $twit);   //----- checar se realmente chegou $buf = NULL; while( !feof( $fp ) ) { $buf .= fgets( $fp, 128 ); } fclose($fp);   //----- avisar if(strpos($buf, '401 Unauthorized')) $mainframe->enqueueMessage( "Problema com o usuário ou a senha do Twitter. O Twitter nã foi atualizado.", 'error' ); else $mainframe->enqueueMessage( "O Twitter foi atualizado (conta $login)" ); } } }
/administrator/components/com_content/controller.php - função com SEF
function insertPagebreak() { $document =& JFactory::getDocument(); $document->setTitle(JText::_('PGB ARTICLE PAGEBRK')); ContentView::insertPagebreak(); }   function insereTwitter() { global $mainframe; $db =& JFactory::getDBO();   //----- Obter o registro do artigo $cid = JRequest::getVar( 'cid', array(0), 'post', 'array' ); $query = 'SELECT *' . ' FROM #__content' . ' WHERE id = '.(int) $cid[0]; $db->setQuery($query, 0, 1); $artigo = $db->loadObject();   //----- Identificar a seção à qual o artigo pertence $query = 'SELECT * FROM #__sections WHERE id = ' . $item->sectionid; $db->setQuery( $query ); $secao = $db->loadObject();   //----- Identificar a categoria à qual o artigo pertence $query = 'SELECT * FROM #__categories WHERE id = ' . $item->catid; $db->setQuery( $query ); $categ = $db->loadObject();   //----- Buscar item (ou itens) de menu $query = "SELECT * FROM #__menu WHERE link LIKE '%" . $secao->id . "' AND link LIKE '%section%'"; $db->setQuery( $query ); $menu1 = $db->loadObject(); // item de menu - primeiro nível   $menu2 = ''; // item de menu - segundo nível, se houver if( !$menu1->parent == 0 ) { $query = 'SELECT * FROM #__menu WHERE id=' . $menu1->parent; $db->setQuery( $query ); $menu2 = $db->loadObject(); } // Se você tiver mais níveis de menu vai precisar ajustar com $menu3, $menu4, etc   //----- Criar o link SEF $link = 'http://www.seusite.com.br/' . $menu2->alias; if( $menu2->alias ) $link .= '/'; $link .= $menu1->alias . '/' . $categ->alias . '/' .$artigo->id . '-' . $artigo->alias;   //----- Criar conexão com o Twitter $login = 'usuário'; $pass = 'senha'; $host = 'twitter.com'; $porta = 80; $fp = fsockopen( $host, $porta, $err_num, $err_msg, 10 );   $conta = base64_encode($login.':'.$pass); if($fp) { $twit = 'status=' . $artigo->title . ' ' . $link; $limite = strlen( $twit ); if( $limite > 147 ) // 140 = dados + 7 = header { // cortar caracteres do título $tit_curto = substr( $artigo->title, 0, strlen( $artigo->title ) - ( $limite-147 ) ); $twit = 'status=' . $tit_curto . ' ' . $link; $limite = strlen( $twit ); }   //----- Enviar dados fwrite($fp, "POST /statuses/update.xml HTTP/1.1\n"); fwrite($fp, "Authorization: Basic $conta\n"); fwrite($fp, "Host: $host\n"); fwrite($fp, "Content-type: application/x-www-form-urlencoded, charset=utf-8\n"); fwrite($fp, "Content-length: $limite\n"); fwrite($fp, "Connection: close\n\n"); fwrite($fp, $twit);   //----- checar se realmente chegou $buf = NULL; while( !feof( $fp ) ) { $buf .= fgets( $fp, 128 ); } fclose($fp);   //----- avisar if(strpos($buf, '401 Unauthorized')) $mainframe->enqueueMessage( "Problema com o usuário ou a senha do Twitter. O Twitter nã foi atualizado.", 'error' ); else $mainframe->enqueueMessage( "O Twitter foi atualizado (conta $login)" ); } } }

O botão na barra de ferramentas

Os botões que aparecem na barra de ferramentas da tela de edição de artigos são criados em /administrator/components/com_content/toolbar.content.administrator.html.php. Logo no início do arquivo, na função _EDIT($edit), adicione a seguinte linha logo abaixo de JToolBarHelper::help

toolbar.content.administrator.html.php
JToolBarHelper::help( 'screen.content.edit' ); JToolBarHelper::custom( 'twitter', 'twitter.png', 'twitter.png', 'Twitter', false );

Agora vem o pulo do gato para que o botão seja representado por uma imagem. Tanto faz o nome que você tenha dado à imagem quando chamou a função JToolBarHelper::custom (no exemplo é twitter.png) por que vamos usar a folha de estilos do template da área administrativa para definir a imagem. Como uso o template Khepri, a folha de estilos é /administrator/templates/khepri/css/icon.css. Abra este arquivo e adicione a seguinte linha após .icon-32-default para criar a classe .icon-32-twitter:

/administrator/templates/khepri/css/icon.css
.icon-32-default { background-image: url(../images/toolbar/icon-32-default.png); } .icon-32-twitter { background-image: url(../images/toolbar/icon-32-twitter.png); }
icon-32-twitter.png

Observe que a url referencia uma imagem que está em ../images/toolbar/ (que corresponde a /administrator/templates/khepri/images/toolbar/) cujo nome é icon-32-twitter.png. Além da localização correta, o nome da imagem também é muito importante: precisa começar com icon-32-. Se quiser usar a mesma que eu usei, copie a imagem ao lado e faça o upload da mesma para o diretório indicado.

Associando o botão à função insereTwitter

Botão criado, função pronta. Agora só falta avisar que, quando o botão for clicado, a função insereTwitter() deve ser acionada. Abra o arquivo /administrator/components/com_content/admin.content.php e coloque a opção 'twitter' entre as opções 'ins_pagebreak' e default:

/administrator/components/com_content/admin.content.php
case 'ins_pagebreak' : ContentController::insertPagebreak(); break;   case 'twitter' : ContentController::insereTwitter(); break;   default : ContentController::viewContent(); break;

Chamamos esta opção de 'twitter' por que foi assim que a nominamos quando chamamos a função JToolBarHelper::custom( 'twitter', 'imagem.png', 'imagem.png', 'Twitter', false ). Quando clicamos no botão, chamamos o arquivo admin.content.php com a opção 'twitter' que, usando a classe ContentController, chama a função insereTwitter() que colocamos em controller.php.

Agora é testar para crer. Pra mim funcionou certinho comemora

Atualização Seg, 22.06.2009 14:35  

Na Aldeia

Há 65 visitantes online

3308 registros
0 hoje
12 nesta semana
45 neste mês

Boas vindas: paulo

Estatística

Artigos: 1064
Leituras: 6041586
Arquivados: 21
Downloads: 533
Baixados: 172402
Glossário: 1208
Bibliografia: 25
Links: 90

Visitas de onde

Top 5:
Brasil flag 73%Brasil (49336)
Portugal flag 5%Portugal (3192)
EUA flag 3%EUA (2227)
Rússia flag 0%Rússia (264)
Holanda flag 0%Holanda (240)
67746 visitas de 100 países

Hoje:135
Ontem:2619
No mês:41931
Mês passado:25815
Total:67746
Recorde:3037
No dia:04.03.10
Leituras hoje:20991
Leituras Total:290419
Bots hoje:47
Dados desde:16.02.2010

Login

Kanji da hora




Faça contato







Juro por Deus que estou morta de vergonha. Ao invés do nosso presidente ouvir os apelos e tentar ajudar, ele "tira sarro" de prisioneiros políticos perseguidos pelo seu lunático amigo Castro, apreciador do frango ensopado de dona Letícia.

Leia Mais