ユーザーのプロフィール写真のURLを取得する方法は?


8

次のコードを使用してユーザーのプロフィール写真を取得する必要があります。

\Drupal::service('renderer')->renderPlain(\Drupal\user\Entity\User::load(\Drupal::currentUser()->id())->user_picture->first()->view('large'))

画像タグ付きのオブジェクトを返し_Call to a member function view() on a non-object_ますが、ユーザーにプロフィール写真が設定されていない場合はエラーで失敗します。

デフォルトのユーザー画像を取得するにはどうすればよいですか?に対する回答も試しましたが、エラーが発生します

Drupal \ Core \ Database \ InvalidQueryException:クエリ条件 'file_managed.uuid IN()'は空にできません。

回答:


5

コードは問題ありませんが、フィールドが空でないかどうかを確認する必要があります。

if ($user = \Drupal\user\Entity\User::load(\Drupal::currentUser()->id())) {
  if (!$user->user_picture->isEmpty()) {
    $picture = $user->user_picture->view('large')
  }
  else {
    $picture = // get default picture
  }
}

Drupal 8では、レンダリングサービスを使用しないでください。新しいテンプレートシステムはこれを自動的に行います。


救い主、期待通りに働きました!:)
Rishi Kulshreshtha 2017年

4
// Getting the actual user uid.
$uid = \Drupal::service('current_user')->id();
// Getting the actual user entity.
$user = \Drupal::service('entity.manager')->getStorage('user')->load($uid);
// Getting the user picture.
$user_picture = $user->user_picture->entity->getFileUri();

// To use dpm you need the devel module.
dpm($user_picture);

1
この方法でユーザーエンティティを呼び出すことをお勧めします。この方法を使用する必要があります。そうしないと、「\ Drupal \ user \ Entity \ User」の呼び出しを「use」の上部に配置することを要求するDrupalコーディング標準が尊重されません。4k4の答えを使用する場合、静的関数でこれを必要とする場合、問題が発生します。この答えはここで良いです。
JFキワド

1
1. AccountProxyクラスでgetAccountメソッドを使用します。アカウントオブジェクトが既に存在する場合は、エンティティの負荷を節約できます。
$account = \Drupal::currentUser()->getAccount();
2.メソッドを使用してフィールドアイテム(エンティティ参照)を調べ、値があるかどうかを確認します。
if (!$account->user_picture->isEmpty()) {
3.レンダラーを使用してフィールド項目からのプレーン出力をレンダリングする代わりに。このデータは、他のいくつかの方法で取得できます。
   $image_url = $account
                  ->user_picture
                  ->first()
   // Fetch the file entity associated with the image item entity reference.
                  ->get('entity')
   // Use the url() to call file_create_url() as in Drupal 7 to get the URL.
                  ->url();
}

2番目のポイントで、非オブジェクトメンバー関数isEmpty()の呼び出しエラーが発生しました。また、でprint_r($account)Drupal\Core\Session\UserSession Objectuser_pictureプロパティのないを取得しました。
user1960

1

これは本当にPHPの問題です。特にdrupalエンティティのフィールドを処理する場合は、オブジェクトメソッドの呼び出しを別の関数の引数内に配置しないでください。フィールドが設定されている場合と設定されていない場合があります。

$uid = \Drupal::currentUser()->id();

// Might be zero if user is logged out.
if ($uid) {
  $user = \Drupal\user\Entity\User::load($uid);
   // check that the field exists and that it has a value.
  if (!empty($user->user_picture) && $user->user_picture->isEmpty() === FALSE) {
    $image = $user->user_picture->first();
    $rendered = \Drupal::service('renderer')->renderPlain($image);
  }
}

また、Drupalコーディング標準では、行を80文字未満にしてみることをお勧めします。コードを読みやすくするため、これは良い習慣だと思います。見る:

https://www.drupal.org/node/935284

また、ユーザーのデフォルト画像を取得する方法については、こちらの投稿をご覧ください。このフィールドにデフォルトの画像を設定することができます。

デフォルトのユーザー画像を取得するにはどうすればよいですか?


0

これは、Drupal 8での最良の方法であり、コントローラーを使用してカスタムモジュールを作成し、変数をTwigに送信します。

$pictureUri = $user->user_picture->entity->getFileUri();
                         $style = \Drupal::entityTypeManager()->getStorage('image_style')->load('thumbnail');
                         $urlPicture = $style->buildUrl($pictureUri);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.