web-dev-qa-db-fra.com

Comment obtenir l'URL de la photo de profil d'un utilisateur?

J'ai besoin d'obtenir la photo de profil de l'utilisateur en utilisant le code suivant:

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

Il renvoie un objet avec la balise image, mais il échoue avec l'erreur _Call to a member function view() on a non-object_ lorsqu'un utilisateur n'a pas d'image de profil définie.

J'ai également essayé answer to " Comment obtenir l'image utilisateur par défaut? ", mais cela donne l'erreur

Drupal\Core\Database\InvalidQueryException: la condition de requête 'file_managed.uuid IN ()' ne peut pas être vide.

8
user1960

Le code est OK, mais vous devez vérifier si le champ n'est pas vide:

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
  }
}

Dans Drupal 8 n'utilise pas le service de rendu. Le nouveau système de modèles le fait automatiquement.

5
4k4
// 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);
4
$account = \Drupal::currentUser()->getAccount();
if (!$account->user_picture->isEmpty()) {
   $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();
}
1
mradcliffe

C'est vraiment plus un problème de PHP. Vous ne devez pas placer d'appels aux méthodes d'objet dans les arguments d'une autre fonction, surtout si vous traitez des champs sur un drupal entité, car ils peuvent être définis ou non.

$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);
  }
}

En outre, Drupal vous suggèrent d'essayer de garder vos lignes sous 80 caractères, et je pense que c'est une bonne pratique, car cela rend le code plus lisible. Voir:

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

En outre, voici un article sur l'obtention de l'image par défaut pour un utilisateur. Vous souhaiterez peut-être définir une image par défaut pour ce champ.

Comment obtenir l'image utilisateur par défaut?

1
oknate

C'est le meilleur moyen sur Drupal 8, créez un module personnalisé avec Controller et envoyez une variable à Twig:

$pictureUri = $user->user_picture->entity->getFileUri();
                         $style = \Drupal::entityTypeManager()->getStorage('image_style')->load('thumbnail');
                         $urlPicture = $style->buildUrl($pictureUri);
0
lucasvm1980