Accedere ai campi utente?


18

$account = \Drupal::currentUser()carica l'oggetto utente in $account, ma come posso accedere ai campi personalizzati che ho creato sull'oggetto utente (tramite l'interfaccia utente dell'amministratore)?

Con dpm($account)non riesco a vedere nessuno dei miei campi personalizzati.


I campi personalizzati hanno ancora dei valori? Sembra di ricordare che mancano dall'oggetto entità fino a quando non hanno effettivamente un valore impostato
Clive

Sì, hanno valori. Posso ottenere l'UID con \Drupal::currentUser()->id()e quindi eseguire una query sul database, ma in D7 erano già lì sull'oggetto?
24ma13wg,

Questo problema non riguarda solo l'utente del ribes; appartiene generalmente all'oggetto utente. api.drupal.org/api/drupal/… ti porta a metà strada, ma come di solito accade con Drupal Docs, lascia molto ancora al buio
mare26.2

Risposte:


29

\Drupal::currentUser()restituisce un Drupal\Core\Session\AccountInterfaceoggetto. Potrebbe essere un utente completo (sarebbe un Drupal\user\UserInterface), ma in questo momento, per il metodo di autenticazione predefinito, non lo è.

Usa questo per ottenere l'entità utente e tutti i campi:

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

D7 aveva esattamente lo stesso comportamento, la differenza ora è proprio che in D7, erano semplicemente stdClass differenti, ora hai interfacce esplicite per differenziare i due.


Nonostante il voto negativo, questa risposta è corretta, anche su Drupal 7. $GLOBALS['user']non contiene un oggetto utente a pieno carico, in Drupal 7; contiene solo le informazioni trovate nella tabella degli utenti.
kiamlaluno

Sì, non sono sicuro del motivo per cui questo ha avuto un downvote. È corretto, sia su D7 che su D8.
mpdonadio

Questa è solo una parte della risposta. E in effetti, non ti avvicina ai dati della "soluzione" originale. Devi "ottenere" i dati dall'oggetto. Per farlo - vedi la soluzione di lavoro pubblicata da @batigolix di seguito.
mare26.2

Si noti che i campi che non hanno valori non verranno visualizzati nella matrice dei valori.
JAyenGreen

16

Ed ecco come tirarlo fuori da quell'oggetto:

// 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
Ottieni l'ID utente con $user->id().
kiamlaluno

Inoltre, l'entità Utente non ha un campo base del corpo . Se quello è un campo aggiunto dall'interfaccia utente, il nome del campo inizierebbe con field_ . Vorrei evitare questo esempio, poiché fa pensare agli utenti che sia un campo base aggiunto dal codice core di Drupal.
kiamlaluno

1

Drupal::currentUser()restituisce l'implementazione di un oggetto Drupal\Core\Session\AccountProxyInterface. Questo è diverso da ciò User::load()che è tornato , che è un oggetto che implementa Drupal\user\UserInterface.

Ciò significa che non è garantito che si ottiene un Useroggetto pieno con i suoi campi caricati, ma non è nemmeno garantito che si ottiene un Useroggetto. Di conseguenza, si chiama chiama alcuni dei metodi disponibili dalla Userclasse, ad esempio User::get(). È possibile chiamare AccountInterface::id(), che restituisce l'ID utente; con ciò, è quindi possibile caricare l'intero Useroggetto con User::load()e avere accesso a tutti i moduli dei campi collegati all'entità.

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

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

Con $account, è quindi possibile accedere a tutti i campi associati a un account utente.


Forse, ma pone ancora la domanda: "come si accede ai campi CUSTOM". Vedi la risposta sopra da @batigolix
sea26.2

La domanda è di più Perché $account = \Drupal::currentUser(): dpm($account);non mostra campi personalizzati? ma questa risposta spiega come accedere ai campi dell'entità utente. Poiché la domanda non dice a quali campi l'OP sta tentando di accedere, la risposta indica semplicemente quale metodo utilizzare. Non ci sono risposte da @batigolix.
kiamlaluno

-2

Ecco una riga, usando la funzione API:

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

Successivamente, i campi utente saranno accessibili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.