以编程方式访问自定义用户字段


8

我向以下位置的所有用户添加了节点引用字段(计算机名称:field_node)。

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

我现在在自定义模块中工作, hook_node_access

用户登录后,如何以编程方式访问“节点引用”字段?

Answers:


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

编辑:对不起,我发布此答案时发布了答案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.