Trabalhando com o objeto user do Drupal

Vou falar um pouco sobre usuários no Drupal.

Usuários são uma das razões da existência do Drupal, o Drupal ajuda usuários a criar, colaborar, comunicar usuários, formando assim uma comunidade.

O Drupal requer que o usário possua o recurso de cookies habilitado no navegador para se logar no sistema, caso contrário o usuário só poderá interagir com o sistema através do usuário anônimo, sim, anônimo é um usuário, porque ele é representado na tabela users com id 0.

O código que cria um usuário anônimo está localizado no arquivo bootstrap.inc na funcão drupal_anonymous_user.

O Drupal irá criar uma variável global chamada $user que irá representar a identidade do usuário corrente.

Quando o usuário é logado o objeto $user é gerado, seus atributos é o resultado da junção das tabelas users e sessions através do uid, todos os campos de ambas as tabelas são atribuidos ao objeto $user, também é atribuido a este objeto as regras (rules) que o usuário possui.

Existe um espaço reservado para informações extras do usuário, na tabela user possui uma coluna chamada data do tipo longtext, onde podemos armazenar arrays serializados através da função user_save().

vamos ver um exemplo:

global $user;
$dadosextras = array('novoatributo' => 'novovalor');
user_save( $user, $dadosextras );

agora nosso objeto $user possui um atributo novo:

print $user->novoatributo;

no banco de dados ele é armazenado dessa forma:

a:1:{s:7:"novoatributo";i:"novovalor";}

Obs: isto é muito conveniente, porém cria adicional overhead quando o objeto user é instanciado, isto porque esses dados seram desserializado em toda instanciação do objeto user.

O user id é gerado através do registro de usuário ou pela interface do administrador. o id do último usuário criado fica armazenado na tabela sequences através da variável users_uid, a razão disso eu não sei, mas a tabela users não possui o atributo auto_increment no uid.

hook_user()

Implementado o hook_user seus módulos terão a chance de reagir em diferentes operações na execução da conta de um usuário e modificar o objeto $user.

function hook_user( $op, &$edit, &$user, $category = null)

http://api.drupal.org/api/5/function/hook_user

$op é um parametro utilizado para descrever a operacao corrente de uma conta de usuario e poderá ter vários valores, veja a lista de operações no link acima.

$edit é um array com os valores do formulário enviado quando uma conta de usuário é criada ou atualizada, esse parametro é passado por referencia, então qualquer alteração que você fizer irá alterar os valores do formulário.

$user é o objeto da conta que estamos manipulando.

$category é a categoria da conta que estamos manipulando.

para entender melhor vamos estudar a operação view:

hook_user('view')

hook_user('view') é utilizado por módulos para adicionar informações na página do profile do usuário.

quando acessamos a página de profile de um usuário e aparece o campo Blog e o link para ver os blogs recentes do usuário estamos vendo uma implementação do hook_user view no módulo blog.

/**
* Implementation of hook_user().
*/
function blog_user($type, &$edit, &$user) {
if ($type == 'view' && user_access('edit own blog', $user)) {
$items['blog'] = array('title' => t('Blog'),
'value' => l(t('View recent blog entries'), "blog/$user->uid", array('title' => t("Read @username's latest blog entries.", array('@username' => $user->name)))),
'class' => 'blog',
);
return array(t('History') => $items);
}
}

o módulo diz que quando estivermos vendo a página do perfil do usuario ele vai adicionar atraves de um array informações de blog daquele usuario, vou explicar melhor como isso funciona:

o array items contém uma chave textual única chamada blog, dentro dessa posição do array ele insere um outro array contendo o título da informação, e um valor, neste caso é um link, e também uma classe de css. dae essas informações são adicionadas em um array de retorno, veja que o history é uma chave textual que identifica o grupo que esta informação pertence, o grupo pode ser qualquer nome que você quiser, neste caso foi utilizado History para agrupar com outros valores.

e é isso ai.

Usando o profile.module para extender informações de usuários

Se você pretende extender os campos do formulário de registro do usuário você poderá utilizar o módulo profile para isso.

com o módulo profile você pode mostrar todos os usuários que possuem semelhanças em determinado campo apenas acessando o endereço:

seu_site/profile/nome_do_campo_criado/valor
exemplo: site/profile/sexo/Masculino

iria mostrar todos os usuários do sexo masculino.

esta funcionalizade somente será aplicada quando você define um título para a página quando cadastra o campo.

obs.: esse recurso não funciona para campos do tipo textarea, url e data.

Referencia: Pro Development Drupal

Comentários

hook_user() ???

Olá como vai ? muito interessante os artigos ! Meus parabéns ! mas me diga uma coisa ! no artigo, onde vc comentou sobre o hook_user(), teria a possibilidade da URL do site mudar, somente quando o usuário cadastrado estiver logado ? por ex: se eu logar com o usuário ciclop a URL deverá ficar assim --> www.sitedaturma.com/ciclop

Ou existe alguma outra forma de se fazer isso ? Muito obrigado e feliz 2008 !!!

Fernando H.Santorsula - Porto Feliz-SP
E-mail: fernando.gnu@gmail.com