Programmgesteuert auf benutzerdefiniertes Benutzerfeld zugreifen

8

Ich habe allen Benutzern ein Knotenreferenzfeld (Computername: field_node) hinzugefügt unter:

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

Ich arbeite jetzt in einem benutzerdefinierten Modul & hook_node_access

Wie greife ich programmgesteuert auf das Knotenreferenzfeld zu, wenn der Benutzer angemeldet ist?

user1706487
quelle

Antworten:

10

Sie können Feldwerte von jeder Entität mit field_get_items()abrufen. Der angemeldete Benutzer ist im globalen $userObjekt verfügbar. Zum Laden von Feldern in dieses Objekt können Sie diese verwenden user_load().

Füge diese zusammen und du bekommst so etwas:

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

Das ist der abstrakte Code, wenn Sie möchten.

Es ist zu beachten, dass hook_node_access()bereits ein $accountObjekt übergeben wurde (dies ist der angemeldete Benutzer, wenn die Zugriffsprüfung für ihn durchgeführt wird). Daher ist es wahrscheinlich besser, wenn Sie dies verwenden, um dies zu überprüfen. Möglicherweise müssen Sie es noch durchlaufen user_load(). Es ist einfach genug, dies mit ein wenig Debugging zu überprüfen.

Clive
quelle
6

Hier zwei Optionen: Verwenden der Kern-API oder 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]);

Relevante Funktionen:

Wenn Sie das Entity-API-Modul verwenden, können Sie auch entity_metadata_wrapper verwenden

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

BEARBEITEN : Entschuldigung, die Antwort wurde gepostet, während ich diese Antwort gepostet habe.

David Thomas
quelle