Làm cách nào để có URL hình ảnh hồ sơ người dùng?


8

Tôi cần lấy ảnh đại diện của người dùng bằng mã sau:

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

Nó trả về một đối tượng với thẻ hình ảnh, nhưng nó không thành công với _Call to a member function view() on a non-object_lỗi khi người dùng không có bộ ảnh hồ sơ.

Tôi cũng đã thử câu trả lời cho " Làm cách nào để có được hình ảnh người dùng mặc định? ", Nhưng nó gây ra lỗi

Drupal \ Core \ Database \ UnlimitedQueryException: Điều kiện truy vấn 'file_managed.uuid IN ()' không thể để trống.

Câu trả lời:


5

Mã này ổn, nhưng bạn phải kiểm tra xem trường có trống không:

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

Trong Drupal 8 không sử dụng dịch vụ kết xuất. Hệ thống mẫu mới thực hiện điều này tự động.


Cứu tinh, làm việc như mong đợi! :)
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);

1
Nên sử dụng cách này để gọi thực thể người dùng. Bạn sẽ cần sử dụng phương pháp này, nếu không, nó sẽ không tôn trọng các tiêu chuẩn mã hóa Drupal yêu cầu bạn đặt cuộc gọi "\ Drupal \ user \ Entity \ User" lên hàng đầu trong "sử dụng". Nếu bạn sử dụng câu trả lời của 4k4, bạn sẽ gặp vấn đề nếu bạn cần điều này trong một hàm tĩnh. Câu trả lời ở đây là một trong những tốt.
JF Kiwad

1
1. Sử dụng phương thức getAccount trên lớp AccountProxy, sẽ lưu một tải thực thể nếu đối tượng tài khoản đã tồn tại.
$account = \Drupal::currentUser()->getAccount();
2. Sử dụng các phương thức để trên mục trường (tham chiếu thực thể) để kiểm tra xem có giá trị nào không.
if (!$account->user_picture->isEmpty()) {
3. Thay vì sử dụng trình kết xuất để kết xuất đầu ra đơn giản từ mục trường. Dữ liệu này có thể được lấy thông qua một số phương pháp khác.
   $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();
}

Tôi gặp lỗi Gọi hàm thành viên isEmpty () trên một đối tượng không ở điểm thứ hai. Ngoài ra, trên print_r($account), tôi có một Drupal\Core\Session\UserSession Objecttài sản không có user_picture.
dùng1960

1

Đây thực sự là một vấn đề của PHP. Bạn không nên thực hiện các cuộc gọi đến các phương thức đối tượng trong các đối số của hàm khác, đặc biệt nếu bạn đang xử lý các trường trên một thực thể drupal, vì chúng có thể được đặt hoặc không được đặt.

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

Ngoài ra, các tiêu chuẩn mã hóa Drupal khuyên bạn nên thử và giữ các dòng của mình dưới 80 ký tự và tôi cảm thấy đó là cách thực hành tốt, vì nó làm cho mã dễ đọc hơn. Xem:

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

Ngoài ra, đây là một bài viết về việc lấy hình ảnh mặc định cho người dùng. Bạn có thể muốn đặt một hình ảnh mặc định cho trường này.

Làm thế nào để có được hình ảnh người dùng mặc định?


0

Đây là cách tốt nhất trên Drupal 8, tạo mô-đun tùy chỉnh với Trình điều khiển và gửi biến đến Twig:

$pictureUri = $user->user_picture->entity->getFileUri();
                         $style = \Drupal::entityTypeManager()->getStorage('image_style')->load('thumbnail');
                         $urlPicture = $style->buildUrl($pictureUri);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.