Acceso programático al campo de usuario personalizado

8

Agregué un campo de referencia de nodo (nombre de máquina: field_node) a todos los usuarios en:

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

Ahora estoy trabajando en un módulo personalizado y hook_node_access

¿Cómo accedo al campo de referencia de nodo mediante programación cuando el usuario inicia sesión?

usuario1706487
fuente

Respuestas:

10

Puede obtener valores de campo de cualquier entidad con field_get_items(); el usuario conectado está disponible en el $userobjeto global y puede cargar campos en ese objeto user_load().

Júntelos y obtendrá algo como esto:

// 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];
}

Ese es el código abstracto si quieres.

Vale la pena tener en cuenta que ya hook_node_access()se le pasó un $accountobjeto (que será el usuario conectado si la verificación de acceso se está realizando para ellos), por lo que probablemente sea mejor usar eso para verificar. Es posible que aún necesite ejecutarlo user_load(), será bastante fácil verificarlo con un poco de depuración.

Clive
fuente
6

Dos opciones aquí, utilizando la API principal o 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]);

Funciones relevantes:

También puede, si usa el módulo Entity API, 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

EDITAR : Lo siento, la respuesta se publicó mientras publicaba esta respuesta.

David Thomas
fuente