web-dev-qa-db-ja.com

カスタムユーザーフィールドの値を取得する

カスタムユーザーフィールドのデフォルト値を表示する必要があるカスタムフォームがあります。フィールドは/ admin/config/people/accounts/fieldsの下に作成され、そのマシン名はfield_r_period_length_secです。

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

ただし、値は表示されず、次のエラーが発生します。

通知:未定義のプロパティ:Drupal\Core\Session\AccountProxy :: $ field_r_period_length_sec

何が悪いのですか?

13
matt9292

ベルディールの答えは私にこれを得る検索語を与えました:

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

少し試行錯誤した後、これは他の誰かが必要な場合に機能するコードです:

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

複数の値の場合は、

$r_period = $user->get('field_r_period_length_sec')->getValue();
17
matt9292

現在のユーザーオブジェクトはユーザーエンティティではありません。 AccountInterfaceで指定された情報以外のフィールドにアクセスするには、そのIDを持つユーザーをロードする必要があります。

3
Berdir

これらの回答が機能しなくなったときはわかりませんが、Drupal 8.5を使用すると、上記のソリューションは常にnullを返します。

調査後、ユーザープロファイルからカスタムフィールドにアクセスするためのソリューションは次のとおりです。

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

その後、行うことができます

$activeProfile->field_xxx->value
2

Entity::load()\Drupal::entityManager();に基づいています 非推奨 です。

これを行うより良い方法は、entityTypeManager()を使用することです。

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