उपयोगकर्ता फ़ील्ड एक्सेस करें?


18

$account = \Drupal::currentUser()उपयोगकर्ता ऑब्जेक्ट लोड करता है $account, लेकिन मैं उपयोगकर्ता ऑब्जेक्ट (व्यवस्थापक UI के माध्यम से) पर बनाए गए कस्टम फ़ील्ड तक कैसे पहुंच सकता हूं?

साथ dpm($account)मैं अपने कस्टम फ़ील्ड के किसी भी नहीं देख सकता।


क्या कस्टम फ़ील्ड का अभी कोई मूल्य है? याद करने के लिए उन्हें इकाई वस्तु से गायब किया जा रहा है, जब तक वे वास्तव में एक मूल्य सेट है लगता है
क्लाइव

हां, उनके पास मूल्य हैं। मैं यूआईडी प्राप्त कर सकता हूं \Drupal::currentUser()->id()और फिर डेटाबेस क्वेरी कर सकता हूं , लेकिन डी 7 में वे पहले से ही ऑब्जेक्ट पर थे?
24ma13wg

यह मुद्दा केवल उपयोक्ता के बारे में नहीं है; यह आम तौर पर उपयोगकर्ता ऑब्जेक्ट से संबंधित है। api.drupal.org/api/drupal/… आपको वहां तक ले जाता है, लेकिन जैसा कि आमतौर पर Drupal Docs के साथ होता है, यह अभी भी अंधेरे में बहुत ज्यादा निकलता है
sea26.2

जवाबों:


29

\Drupal::currentUser() एक रिटर्न Drupal\Core\Session\AccountInterface वस्तु । यह एक पूर्ण उपयोगकर्ता हो सकता है (यह एक होगा Drupal\user\UserInterface), लेकिन अभी, डिफ़ॉल्ट प्रमाणीकरण विधि के लिए, यह नहीं है।

उपयोगकर्ता इकाई और सभी क्षेत्रों को प्राप्त करने के लिए इसका उपयोग करें:

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

डी 7 में बिल्कुल वैसा ही व्यवहार था, अब अंतर केवल इतना है कि डी 7 में, वे बस अलग-अलग stdClass'es थे, अब आपके पास दोनों को अलग करने के लिए स्पष्ट इंटरफेस हैं।


डाउन-वोट के बावजूद, यह उत्तर सही है, यहां तक ​​कि Drupal 7 के बारे में। Drupal 7 $GLOBALS['user']में एक पूर्ण लोड उपयोगकर्ता ऑब्जेक्ट नहीं है; इसमें केवल उपयोगकर्ता तालिका में मिली जानकारी है।
kiamlaluno

हाँ, यकीन नहीं है कि यह एक गिरावट क्यों है। यह सही है, D7 और D8 दोनों के बारे में।
mpdonadio

यह उत्तर का केवल एक हिस्सा है। और वास्तव में, यह आपको मूल "समाधान" की तुलना में डेटा के करीब नहीं मिलता है। आपको ऑब्जेक्ट से डेटा "प्राप्त" करना होगा। ऐसा करने के लिए - नीचे @batigolix द्वारा पोस्ट किए गए कार्य समाधान देखें।
समुद्र २६.२

ध्यान दें कि जिन फ़ील्ड में मान नहीं हैं वे मान सरणी में दिखाई नहीं देंगे।
ज्येनग्रीन

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

इसके अलावा, उपयोगकर्ता निकाय के पास शरीर का आधार फ़ील्ड नहीं है। यदि वह उपयोगकर्ता इंटरफ़ेस से जोड़ा गया फ़ील्ड है, तो फ़ील्ड का नाम फ़ील्ड_ के साथ शुरू होगा । मैं उस उदाहरण से बचूंगा, क्योंकि यह उपयोगकर्ताओं को लगता है कि Drupal कोर कोड से एक आधार फ़ील्ड जोड़ा गया है।
किमलालुनो

1

Drupal::currentUser()लागू करने वाली वस्तु देता है Drupal\Core\Session\AccountProxyInterface। जो कि लौटाए जाने से अलग है User::load(), जो लागू करने वाली वस्तु है Drupal\user\UserInterface

इसका मतलब यह है कि यह आश्वस्त नहीं है कि आपको Userइसके खेतों में भरी हुई वस्तु मिलेगी , लेकिन यह आश्वासन भी नहीं दिया गया है कि आपको कोई Userवस्तु मिली है । परिणामस्वरूप, आप Userकक्षा से उपलब्ध कुछ विधियों को कॉल करते हैं , जैसे कि User::get()। आप कॉल कर सकते हैं AccountInterface::id(), जो उपयोगकर्ता आईडी लौटाता है; उसके बाद, आप तब पूर्ण Userऑब्जेक्ट को लोड कर सकते हैं User::load()और इकाई से जुड़े सभी फ़ील्ड मॉड्यूल तक पहुंच सकते हैं।

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

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

इसके बाद $account, आप उपयोगकर्ता खाते से जुड़े सभी क्षेत्रों तक पहुँच सकते हैं।


शायद, लेकिन यह अभी भी सवाल उठाता है: "आप कस्टम फ़ील्ड कैसे एक्सेस करते हैं"। उत्तर देखें @batigolix से
sea26.2

सवाल यह है कि कोई कस्टम फ़ील्ड क्यों $account = \Drupal::currentUser(): dpm($account);नहीं दिखाया जाता है? लेकिन यह उत्तर कहता है कि उपयोगकर्ता निकाय फ़ील्ड तक कैसे पहुँचें। चूँकि सवाल यह नहीं कहता है कि ओपी किस क्षेत्र तक पहुँचने की कोशिश कर रहा है, इसलिए उत्तर यही कहता है कि किस विधि का उपयोग करना है। @Batigolix से उत्तर नहीं हैं।
kiamlaluno

-2

यहां API फ़ंक्शन का उपयोग करके एक-लाइनर दिया गया है:

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

उसके बाद, उपयोगकर्ता फ़ील्ड सुलभ होंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.