A Aldeia Numaboa ancestral ainda está disponível para visitação. É a versão mais antiga da Aldeia que eu não quis simplesmente descartar depois de mais de 10 milhões de pageviews. Como diz a Sirley, nossa cozinheira e filósofa de plantão: "Misericórdia, ai que dó!"

Se você tiver curiosidade, o endereço é numaboa.net.br.

Leia mais...

Informática Numaboa - Tutoriais e Programação

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

Dom

7

Set

2008


19:06

(4 votos, média 4.75 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ê smile

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 vó Vicki



фишки для игры в покеркупить посуду для стеклокерамической плитыхарьков никас официальный сайтноутбук intelsamsung ультратонкий ноутбуксайт никосаофициальный никас

Informações adicionais