Aldeia Numaboa

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

Joomla e Twitter

Indique esta página Imprimir PDF
(11 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á 114 visitantes online

3630 registros
0 hoje
14 nesta semana
4 neste mês

Boas vindas: flor

Estatística

Membros: 3639
Artigos: 1045
Links: 90
Leituras: 6681401

Login

Kanji da hora




Faça contato







Não diga que não avisei ===> No Internet Explorer o meu site fica uma porcaria. Use qualquer outro navegador, porque não tenho tempo e nem paciência para ficar remendando todas as páginas só para atender as sandices do pessoal da microsoft. Que tal experimentar o Firefox, o Opera, o Chrome ou o Safari?