เข้าถึงฟิลด์ผู้ใช้หรือไม่


18

$account = \Drupal::currentUser()โหลดวัตถุผู้ใช้ลงใน$accountแต่ฉันจะเข้าถึงฟิลด์ที่กำหนดเองที่ฉันสร้างบนวัตถุผู้ใช้ (ผ่านทาง UI การดูแลระบบ) ได้อย่างไร

ด้วยdpm($account)ฉันไม่เห็นฟิลด์ที่กำหนดเองใด ๆ


ฟิลด์ที่กำหนดเองมีค่าใด ๆ หรือยัง ดูเหมือนจะจำได้ว่าพวกเขาหายไปจากวัตถุเอนทิตี้จนกว่าพวกเขาจะมีชุดค่า
Clive

ใช่พวกเขามีค่า ฉันจะได้รับ uid ด้วย\Drupal::currentUser()->id()แล้วทำแบบสอบถามฐานข้อมูล แต่ใน D7 พวกเขามีวัตถุอยู่แล้ว?
24ma13wg

ปัญหานี้ไม่ได้เกี่ยวกับผู้ใช้ลูกเกดเท่านั้น โดยทั่วไปเกี่ยวข้องกับวัตถุผู้ใช้ api.drupal.org/api/drupal/…ทำให้คุณไปที่นั่นครึ่งหนึ่ง แต่โดยปกติแล้วเป็นกรณีของ Drupal Docs มันจะยังคงอยู่ในที่มืดมาก
ทะเล 26.2

คำตอบ:


29

\Drupal::currentUser()ส่งคืนDrupal\Core\Session\AccountInterfaceวัตถุ นั่นอาจเป็นผู้ใช้เต็มรูปแบบ (นั่นอาจเป็นDrupal\user\UserInterface) แต่ตอนนี้สำหรับวิธีการรับรองความถูกต้องเริ่มต้นนั้นไม่ใช่

ใช้สิ่งนี้เพื่อรับเอนทิตีผู้ใช้และฟิลด์ทั้งหมด:

$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())

D7 มีพฤติกรรมเดียวกันทุกประการความแตกต่างตอนนี้เป็นเพียงใน D7 พวกเขาต่างกันเพียง stdClass'es ตอนนี้คุณมีส่วนต่อประสานที่ชัดเจนเพื่อแยกความแตกต่างทั้งสอง


คำตอบนี้ถูกต้องแม้เกี่ยวกับ Drupal 7 $GLOBALS['user']ไม่ได้มีวัตถุผู้ใช้ที่โหลดเต็มใน Drupal 7; มันมีเพียงข้อมูลที่พบในตารางผู้ใช้
kiamlaluno

ใช่ไม่แน่ใจว่าทำไมเรื่องนี้ถึงได้ลงคะแนน ถูกต้องทั้ง D7 และ D8
mpdonadio

นี่เป็นเพียงส่วนหนึ่งของคำตอบ และในความเป็นจริงแล้วคุณจะไม่ได้ใกล้ชิดกับข้อมูลมากไปกว่า "โซลูชัน" ดั้งเดิม คุณต้อง "รับ" ข้อมูลจากวัตถุ หากต้องการทำเช่นนั้น - ดูโซลูชันการทำงานที่โพสต์โดย @batigolix ด้านล่าง
sea26.2

โปรดทราบว่าเขตข้อมูลที่ไม่มีค่าจะไม่ปรากฏในอาร์เรย์ค่า
JAyenGreen

16

และนี่คือวิธีดึงมันออกมาจากวัตถุนั้น:

// Load the current user.
$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());

// Get field data from that user.
$website = $user->get('field_website')->value;
$body = $user->get('body')->value;

// Some default getters include.
$email = $user->get('mail')->value;
$name = $user->get('name')->value;
$uid= $user->get('uid')->value;

1
$user->id()คุณจะได้รับรหัสผู้ใช้ด้วย
kiamlaluno

นอกจากนี้กิจการที่ผู้ใช้ไม่ได้มีร่างกายฟิลด์ฐาน หากเป็นข้อมูลเพิ่มจากอินเตอร์เฟซผู้ใช้ชื่อสนามจะเริ่มต้นด้วยfield_ ฉันจะหลีกเลี่ยงตัวอย่างนั้นเนื่องจากทำให้ผู้ใช้คิดว่าเป็นฟิลด์ฐานที่เพิ่มจาก Drupal core code
kiamlaluno

1

Drupal::currentUser()Drupal\Core\Session\AccountProxyInterfaceผลตอบแทนที่ได้วัตถุการดำเนินการ ที่แตกต่างจากสิ่งที่กลับมาจากการที่เป็นวัตถุการดำเนินการUser::load()Drupal\user\UserInterface

ซึ่งหมายความว่าไม่มั่นใจว่าคุณจะได้รับUserวัตถุเต็มเมื่อโหลดเขตข้อมูล แต่ไม่มั่นใจด้วยซ้ำว่าคุณได้รับUserวัตถุ ในฐานะที่เป็นผลให้คุณโทรเรียกบางส่วนของวิธีการที่ใช้ได้จากระดับเช่นUser User::get()คุณสามารถโทรหาAccountInterface::id()ซึ่งจะส่งคืน ID ผู้ใช้ เมื่อนั้นคุณสามารถโหลดUserวัตถุทั้งหมดด้วยUser::load()และสามารถเข้าถึงโมดูลฟิลด์ทั้งหมดที่แนบกับเอนทิตี

use Drupal\Core\Session\AccountProxyInterface;
use Drupal\user\Entity\User;

$account = User::load(\Drupal::currentUser()->id());

ด้วย$accountคุณสามารถเข้าถึงฟิลด์ทั้งหมดที่เกี่ยวข้องกับบัญชีผู้ใช้


บางทีมันอาจจะยังคงเป็นคำถาม: "คุณจะเข้าถึงฟิลด์ CUSTOM ได้อย่างไร" ดูคำตอบข้างต้นจาก @batigolix
sea26.2

คำถามมีมากขึ้นเพราะเหตุใดจึง$account = \Drupal::currentUser(): dpm($account);ไม่แสดงฟิลด์ที่กำหนดเองใด ๆ แต่คำตอบนี้บอกวิธีการเข้าถึงฟิลด์เอนทิตีผู้ใช้ เนื่องจากคำถามไม่ได้บอกว่า OP พยายามเข้าถึงช่องใดคำตอบก็บอกว่าจะใช้วิธีไหน ไม่มีคำตอบจาก @batigolix
kiamlaluno

-2

นี่คือสายการบินเดียวที่ใช้ฟังก์ชัน API:

$account = \Drupal::currentUser()->getAccount();

หลังจากนั้นฟิลด์ผู้ใช้จะสามารถเข้าถึงได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.