Acessar programaticamente o campo de usuário personalizado

8

Adicionei um campo de referência ao nó (nome da máquina: field_node) a todos os usuários em:

example.com/admin/config/people/accounts/fields/

Agora estou trabalhando em um módulo personalizado e hook_node_access

Como acesso programaticamente o campo Node-reference quando o usuário está conectado?

user1706487
fonte

Respostas:

10

Você pode obter valores de campo de qualquer entidade com field_get_items(); o usuário conectado está disponível no $userobjeto global e para carregar campos nesse objeto que você pode usar user_load().

Coloque-os juntos e você terá algo como isto:

// Get a fully loaded entity object for the logged in user.
$account = user_load($GLOBALS['user']->uid);

// Extract the field items
$field_items = field_get_items('user', $account, 'field_node');
if ($field_items) {
  // This will be 'target_id' if you're using the Entity Reference module, 
  // or 'nid' if you're using References
  $column_name = '?'; 

  $nid = $field_items[0][$column_name];
}

Esse é o código abstrato, se você quiser.

Vale lembrar que já hook_node_access()foi passado um $accountobjeto (que será o usuário logado se a verificação de acesso estiver acontecendo para ele); portanto, é melhor usá-lo para verificar isso. Talvez você ainda precise executá-lo user_load(), será fácil verificar isso com um pouco de depuração.

Clive
fonte
6

Duas opções aqui, usando a API principal ou entity_metadata_wrapper

global $user;
// Load full user account object
$account = user_load($user->uid);
// Get field;
$items = field_get_items('user', $account, 'field_node');
// Debug info
drupal_set_message('<pre>'.var_export($items,1).'</pre>');
// This gets the sanitized output, from the first field delta value (0)
$output = field_view_value('user', $account, 'field_node', $items[0]);

Funções relevantes:

Você também pode, se estiver usando o módulo API da entidade, usar entity_metadata_wrapper

global $user;
$user_wrapper = entity_metadata_wrapper('user', $user);
drupal_set_message('<pre>'.var_export($user_wrapper->field_node->raw(),1).'</pre>'); // Raw value
drupal_set_message('<pre>'.var_export($user_wrapper->field_node->value(),1).'</pre>'); // Loaded value

EDIT : Desculpe, a resposta foi postada enquanto eu estava postando esta resposta.

David Thomas
fonte