Программный доступ к пользовательскому полю пользователя

8

Я добавил поле ссылки на узел (имя машины: field_node) всем пользователям по адресу:

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

Сейчас я работаю в пользовательском модуле hook_node_access

Как получить доступ к полю Node-reference программно, когда пользователь вошел в систему?

user1706487
источник

Ответы:

10

Вы можете получить значения полей из любой сущности с помощью field_get_items(); зарегистрированный пользователь доступен в глобальном $userобъекте, и для загрузки полей в этот объект вы можете использовать user_load().

Соедините их вместе, и вы получите что-то вроде этого:

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

Это абстрактный код, если хотите.

Стоит иметь в виду, что объекту уже hook_node_access()передан $account(который будет зарегистрированным пользователем, если для него будет выполняться проверка доступа), поэтому вам, вероятно, было бы лучше использовать его для проверки. Возможно, вам все равно придется выполнить его user_load(), это будет достаточно легко проверить с помощью небольшой отладки.

Клайв
источник
6

Два варианта здесь, используя основной API или 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]);

Соответствующие функции:

Вы также можете, используя модуль Entity API, использовать 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

РЕДАКТИРОВАТЬ : Извините, ответ был опубликован, когда я публиковал этот ответ.

Дэвид Томас
источник