Secara terprogram Mengakses bidang pengguna khusus

8

Saya menambahkan bidang referensi-Node (nama mesin: field_node) ke semua pengguna di:

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

Saya sekarang bekerja di modul khusus & hook_node_access

Bagaimana cara mengakses bidang referensi-Node secara terprogram ketika pengguna masuk?

pengguna1706487
sumber

Jawaban:

10

Anda bisa mendapatkan nilai bidang dari entitas apa pun dengan field_get_items(); pengguna yang masuk tersedia di $userobjek global , dan untuk memuat bidang ke objek yang dapat Anda gunakan user_load().

Gabungkan semuanya dan Anda mendapatkan sesuatu seperti ini:

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

Itu kode abstrak jika Anda suka.

Perlu diingat bahwa hook_node_access()sudah melewati $accountobjek (yang akan menjadi pengguna login jika pemeriksaan akses terjadi untuk mereka) sehingga Anda mungkin akan lebih baik menggunakannya untuk memeriksa. Anda mungkin masih harus menjalankannya user_load(), cukup mudah untuk memeriksanya dengan sedikit debugging.

Clive
sumber
6

Dua opsi di sini, menggunakan API inti atau 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]);

Fungsi yang relevan:

Anda juga bisa, jika menggunakan modul Entity API, menggunakan entitas_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

EDIT : Maaf, jawaban telah diposting ketika saya memposting jawaban ini.

David Thomas
sumber