Wie erhalte ich die Profilbild-URL eines Benutzers?

8

Ich muss das Profilbild des Benutzers mit dem folgenden Code abrufen:

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

Es gibt ein Objekt mit dem Image-Tag zurück, schlägt jedoch mit dem _Call to a member function view() on a non-object_Fehler fehl , wenn für einen Benutzer kein Profilbild festgelegt wurde.

Ich habe auch die Antwort auf " Wie erhalte ich das Standardbenutzerbild? " Versucht , aber es gibt den Fehler

Drupal \ Core \ Database \ InvalidQueryException: Die Abfragebedingung 'file_managed.uuid IN ()' darf nicht leer sein.

user1960
quelle

Antworten:

5

Der Code ist in Ordnung, aber Sie müssen überprüfen, ob das Feld nicht leer ist:

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

Verwenden Sie in Drupal 8 keinen Renderdienst. Das neue Vorlagensystem erledigt dies automatisch.

4k4
quelle
Retter, hat wie erwartet gearbeitet! :)
Rishi Kulshreshtha
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);
Adrian Cid Almaguer
quelle
1
Es ist vorzuziehen, auf diese Weise eine Benutzerentität aufzurufen. Sie müssen diesen Ansatz verwenden, da er sonst die Drupal-Codierungsstandards nicht berücksichtigt, nach denen Sie den Aufruf "\ Drupal \ user \ Entity \ User" innerhalb einer "Verwendung" oben platzieren müssen. Wenn Sie die Antwort des 4k4 verwenden, haben Sie ein Problem, wenn Sie dies in einer statischen Funktion benötigen. Diese Antwort hier ist die gute.
JF Kiwad
1
1. Verwenden Sie die Methode getAccount für die AccountProxy-Klasse, mit der eine Entitätslast gespeichert werden soll, wenn das Kontoobjekt bereits vorhanden ist.
$account = \Drupal::currentUser()->getAccount();
2. Verwenden Sie Methoden, um im Feldelement (Entitätsreferenz) zu überprüfen, ob ein Wert vorhanden ist.
if (!$account->user_picture->isEmpty()) {
3. Anstatt den Renderer zum Rendern der einfachen Ausgabe des Feldelements zu verwenden. Diese Daten können über einige andere Methoden abgerufen werden.
   $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();
}
mradcliffe
quelle
Ich habe einen Fehler erhalten. Aufruf einer Mitgliedsfunktion isEmpty () für ein Nichtobjekt am zweiten Punkt. Außerdem habe print_r($account)ich eine Drupal\Core\Session\UserSession ObjectEigenschaft ohne user_picture erhalten.
user1960
1

Dies ist wirklich eher ein PHP-Problem. Sie sollten Objektmethoden nicht in die Argumente einer anderen Funktion aufrufen, insbesondere wenn Sie sich mit Feldern in einer Drupal-Entität befassen, da diese möglicherweise festgelegt oder nicht festgelegt sind.

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

Außerdem empfehlen Drupal-Codierungsstandards, dass Sie versuchen, Ihre Zeilen unter 80 Zeichen zu halten, und ich bin der Meinung, dass dies eine gute Vorgehensweise ist, da der Code dadurch besser lesbar wird. Sehen:

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

Außerdem finden Sie hier einen Beitrag zum Abrufen des Standardbilds für einen Benutzer. Möglicherweise möchten Sie ein Standardbild für dieses Feld festlegen.

Wie bekomme ich das Standardbenutzerbild?

oknate
quelle
0

Dies ist der beste Weg in Drupal 8, ein benutzerdefiniertes Modul mit Controller zu erstellen und eine Variable an Twig zu senden:

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