Uzyskaj wartość niestandardowego pola użytkownika

13

Mam niestandardowy formularz, który musi wyświetlać wartość domyślną z niestandardowego pola użytkownika. Pole zostało utworzone w / admin / config / people / account / fields, a jego nazwa komputera to field_r_period_length_sec.

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

Jednak wartość nie jest wyświetlana i pojawia się ten błąd:

Uwaga: Niezdefiniowana właściwość: Drupal \ Core \ Session \ AccountProxy :: $ field_r_period_length_sec

Co ja robię źle?

matt9292
źródło

Odpowiedzi:

17

Odpowiedź Berdira dała mi wyszukiwane hasło, które dało mi to:

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

Po kilku próbach i błędach jest to kod, który działa, na wypadek, gdyby ktokolwiek inny potrzebował:

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

Aby uzyskać wiele wartości, użyj

$r_period = $user->get('field_r_period_length_sec')->getValue();
matt9292
źródło
1
Dla każdego, kto chce usunąć ostrzeżenie z PHPStorm, $r_period = $user->field_r_period_length_sec->value;dodaj ten komentarz /** @var $user \Drupal\user\Entity\User */powyżej$user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
Neil Nand
3

Bieżący obiekt użytkownika nie jest jednostką użytkownika. Musisz załadować użytkownika o tym identyfikatorze, aby uzyskać dostęp do dowolnego pola oprócz informacji określonych przez AccountInterface.

Berdir
źródło
2

Nie wiem, ponieważ kiedy te odpowiedzi już nie działają, ale w Drupal 8.5 powyższe rozwiązanie cały czas zwraca wartość null.

Po zbadaniu rozwiązaniem dostępu do niestandardowego pola z profilu użytkownika jest:

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

To możesz zrobić

$activeProfile->field_xxx->value
Denis Kolmerschlag
źródło
Dzięki! Udało mi się uzyskać określone pole z profilu użytkownika. Ale zastanawiam się, jak ustawić / zaktualizować nazwę pola profilu? TIA
John Rey Tanquinco
1
$ profile-> set ('nazwa_pola', wartość)
Denis Kolmerschlag
1

Entity::load()jest oparty na \Drupal::entityManager();których jest przestarzały .

Lepszym sposobem na to jest użycie obiektu entityTypeManager ().

$user = \Drupal::entityTypeManager()->getStorage('user')->load($current_user->id());
$r_period = $user->field_r_period_length_sec->value;
powpow12
źródło