Aldeia Numaboa

  • Increase font size
  • Default font size
  • Decrease font size
Home Informática Tutoriais e Programação Joomla Manutenção automática da tabela de usuários

Manutenção automática da tabela de usuários

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

Joomla Você ativou a opção de confirmação de registros e sua tabela de usuários está entupida de registros não confirmados? Você (assim como eu) se irrita com este lixo ocupando espaço no seu banco de dados? A solução que encontrei talvez não seja das mais elegantes, mas funciona. Talvez também seja uma solução para você sorriso

A origem da idéia

Estava patinando com A praga dos registros forçados que, além de perturbarem, estavam inchando as tabelas de usuários registrados. Resolvi o problema da praga e acabei constatando que as tabelas de usuários não só inchavam por conta dos candidatos a "spameiros", mas também por conta de usuários que fornecem endereços de email fictícios, que digitam endereços errados (um monte! se liga pessoal!) ou que simplesmente se esquecem de confirmar seus registros. Por que é que eu deveria guardar tais informações?

Se você leu o artigo sobre "A praga dos registros forçados" então você sabe que fiz um hack no componente com_user para me livrar parcialmente deles. Foi daí que parei para pensar: toda vez que houver uma atualização do Joomla vou ter que me lembrar de "hackear" novamente este componente. Bem, se este é o caso, então vou inserir mais um pouco de código no mesmo arquivo para fazer uma manutenção automática nas tabelas de usuários.

Desrespeitando o padrão MVC (Model-View-Controller) do novo Joomla e só para manter meus "hacks" restritos a um só arquivo, resolvi adicionar mais um pouquinho de código para chegar aonde queria - toda vez que um novo usuário se registrar, fazer uma varredura nas tabelas de usuários e eliminar aqueles que, depois de 15 dias, não tiverem confirmado seus registros. Foi mais simples do que imaginei no início.

O hack

No arquivo controller.php, localizado na pasta /components/com_user/, fica a função register_save(). Procure pelo trecho de código, já no finzinho da função

// Everything went fine, set relevant message depending upon user activation state and display message
if ( $useractivation == 1 ) {
  $message  = JText::_( 'REG_COMPLETE_ACTIVATE' );
} else {
  $message = JText::_( 'REG_COMPLETE' );
}

Logo depois do código acima e antes de

$this->setRedirect('index.php', $message);

coloque este código:

$db =& JFactory::getDBO();
$query = 'SELECT * FROM #__users WHERE block=1'
  . ' AND TO_DAYS( NOW() ) - TO_DAYS( registerDate ) > 14';
$db->setQuery( $query );
$rows = $db->loadObjectList();
 
foreach( $rows as $row ) {
  $query = 'DELETE FROM #__users WHERE id='.$row->id;
  $db->setQuery( $query );
  $db->loadResult();
  $query = 'DELETE FROM #__core_acl_aro WHERE value='.$row->id;
  $db->setQuery( $query );
  $db->loadResult();
}

Inicialmente criamos um objeto database com a função getDBO() do JFactory. Em seguida definimos uma query para selecionar da tabela de usuários todos aqueles que estiverem bloqueados (block=1 significa que não confirmaram seu registro) e cuja data de registro tenha ocorrido há mais de 14 dias. Depois disto, aplicamos a query e armazenamos todos os registros obtidos na variável $rows.

Conhecendo os "infratores", basta trabalhar cada um dos registros com um loop foreach. Usamos a ID do "infrator" ($row->id) e o eliminamos da tabela jos_users e da tabela jos_core_acl_aro.

Duas tabelas? É isto mesmo! Todos os usuários registrados possuem dois registros e ambos precisam ser eliminados.

Mais uma coisinha que aprendi com o tempo

Uma pequena atualização em 19.08.09

Depois de quase um ano usando este hack constatei que a técnica de registro usada pelos espertos de plantão evoluíu. Agora estão conseguindo fazer registros que "dão um nó" na exigência de que sejam ativados (uma medida de segurança mínima num site Joomla). Soma-se a isto uma porção de usuários bem intencionados que fizeram seus registros e os confirmaram, mas que não fizeram nem um único login depois de 30 dias. Apesar de parecer meio draconiano, resolvi eliminá-los também e complementei meu hack com:

$query = "SELECT * FROM #__users WHERE lastvisitDate = '0000-00-00 00:00:00'"
   . ' AND TO_DAYS( NOW() ) - TO_DAYS( registerDate ) > 30';
$db->setQuery( $query );
$rows = $db->loadObjectList();
 
foreach( $rows as $row ) {
   $query = 'DELETE FROM #__users WHERE id=' . $row->id;
   $db->setQuery( $query );
   $db->loadResult();
   $query = 'DELETE FROM #__core_acl_aro WHERE value=' . $row->id;
   $db->setQuery( $query );
   $db->loadResult();
}

Valeu, pessoal. Espero que minha experiência sirva para outros "joomleiros".

Abraços da vovo Vicki vó Vicki



Atualização Qua, 19.08.2009 23:43  

Na Aldeia

Há 75 visitantes online

3304 registros
0 hoje
9 nesta semana
41 neste mês

Boas vindas: Xico

Estatística

Artigos: 1063
Leituras: 6036610
Arquivados: 21
Downloads: 533
Baixados: 172238
Glossário: 1208
Bibliografia: 25
Links: 90

Visitas de onde

Top 5:
Brasil flag 73%Brasil (47546)
Portugal flag 5%Portugal (3071)
EUA flag 3%EUA (2134)
Rússia flag 0%Rússia (259)
Holanda flag 0%Holanda (239)
65143 visitas de 100 países

Hoje:151
Ontem:2587
No mês:39328
Mês passado:25815
Total:65143
Recorde:3037
No dia:04.03.10
Leituras hoje:19395
Leituras Total:280947
Bots hoje:89
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