web-dev-qa-db-fra.com

Accéder par programme au champ utilisateur personnalisé

J'ai ajouté un champ Node-reference (nom de la machine: field_node) à tous les utilisateurs sur:

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

Je travaille maintenant dans un module personnalisé & hook_node_access

Comment puis-je accéder par programmation au champ Node-reference lorsque l'utilisateur est connecté?

8
user1706487

Vous pouvez obtenir des valeurs de champ à partir de n'importe quelle entité avec field_get_items() ; l'utilisateur connecté est disponible dans l'objet global $user, et pour charger des champs sur cet objet, vous pouvez utiliser user_load() .

Mettez-les ensemble et vous obtenez quelque chose comme ceci:

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

C'est le code abstrait si vous le souhaitez.

Il convient de garder à l'esprit que hook_node_access() reçoit déjà un objet $account (Qui sera l'utilisateur connecté si le contrôle d'accès se produit pour eux), il serait donc préférable de l'utiliser à vérifier. Vous devrez peut-être encore l'exécuter via user_load(), il sera assez facile de vérifier cela avec un peu de débogage.

10
Clive

Deux options ici, en utilisant l'API de base 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]);

Fonctions pertinentes:

Vous pouvez également, si vous utilisez le module API d'entité, utiliser 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

[~ # ~] modifier [~ # ~] : Désolé, la réponse a été publiée pendant que je publiais cette réponse.

6
David Thomas