Ruft den Wert eines benutzerdefinierten Benutzerfelds ab

13

Ich habe ein benutzerdefiniertes Formular, das einen Standardwert aus einem benutzerdefinierten Benutzerfeld anzeigen muss. Das Feld wurde unter / admin / config / people / accounts / fields erstellt und der Computername lautet field_r_period_length_sec.

//get user
$userCurrent = \Drupal::currentUser();
$uid = $userCurrent->id();
$r_period = $userCurrent->field_r_period_length_sec;

Der Wert wird jedoch nicht angezeigt und ich erhalte folgende Fehlermeldung:

Hinweis: Undefinierte Eigenschaft: Drupal \ Core \ Session \ AccountProxy :: $ field_r_period_length_sec

Was mache ich falsch?

matt9292
quelle

Antworten:

17

Berdirs Antwort gab mir einen Suchbegriff, der mir Folgendes einbrachte:

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

Nach einigem Ausprobieren ist dies der Code, der funktioniert, falls jemand anderes Folgendes benötigt:

$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
$r_period = $user->field_r_period_length_sec->value;

Verwenden Sie für mehrere Werte

$r_period = $user->get('field_r_period_length_sec')->getValue();
matt9292
quelle
1
Für alle, die die Warnung von PHPStorm entfernen möchten, $r_period = $user->field_r_period_length_sec->value;fügen Sie diesen Kommentar /** @var $user \Drupal\user\Entity\User */oben hinzu$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
Neil Nand
3

Das aktuelle Benutzerobjekt ist keine Benutzerentität. Sie müssen den Benutzer mit dieser ID laden, um auf ein Feld mit Ausnahme der durch angegebenen Informationen zugreifen zu können AccountInterface.

Berdir
quelle
2

Ich weiß nicht, wann diese Antworten nicht mehr funktionieren, aber mit Drupal 8.5 gibt die obige Lösung immer null zurück.

Nach der Untersuchung lautet die Lösung für den Zugriff auf ein benutzerdefiniertes Feld über ein Benutzerprofil:

$activeProfile = \Drupal::getContainer()
  ->get('entity_type.manager')
  ->getStorage('profile')
  ->loadByUser(User::load([uid]), '[profile_machine_name]');

Dann können Sie tun

$activeProfile->field_xxx->value
Denis Kolmerschlag
quelle
Vielen Dank! Ich konnte ein bestimmtes Feld aus dem Benutzerprofil abrufen. Aber ich frage mich, wie Sie einen Profilfeldnamen festlegen / aktualisieren können. TIA
John Rey Tanquinco
1
$ profile-> set ('Feldname', Wert)
Denis Kolmerschlag
1

Entity::load()basiert darauf, \Drupal::entityManager();dass veraltet ist .

Ein besserer Weg, dies zu tun, ist die Verwendung von entityTypeManager ().

$user = \Drupal::entityTypeManager()->getStorage('user')->load($current_user->id());
$r_period = $user->field_r_period_length_sec->value;
powpow12
quelle