Nhận một hình ảnh từ một bài viết / thực thể


8

Làm thế nào để tôi dễ dàng có được một hình ảnh (đường dẫn của nó) từ loại nội dung bài viết có trong Drupal 8?

Những gì tôi có là một thực thể. Sử dụng $image = $node->fields['field_image']cho tôi một địa ngục của một cấu trúc, mặc dù.

Có cách nào dễ dàng hơn để có được đường dẫn hình ảnh? Ngoài ra, tôi không thể tìm thấy URL trong này, những gì tôi nhận được là một số loại target_id (ID tệp?).


Điều gì get_class ($node->fields['field_image'])mang lại cho bạn?
Clive

Drupal \ file \ Plugin \ Field \ FieldType \ FileFieldItemList là những gì nó mang lại cho tôi, điều này dường như chỉ chứa các thuộc tính của những gì được phép tải lên.
Vô hình

Nếu bạn lặp lại danh sách các loại thành viên của nó? Tôi đã không kiểm tra, nhưng tôi hy vọng sẽ có một số cách gõ mạnh mẽ của lĩnh vực này. Nếu vẫn thất bại, bạn có thể sử dụng file_load()và một trong những phương pháp khả dụng trênDrupal\file\FileInterface
Clive

Drupal \ image \ Plugin \ Field \ FieldType \ ImageItem là những gì tôi nhận được, mặc dù không biết cách xử lý đúng cách.
Vô hình

file_load là giải pháp cuối cùng, nhưng nó bị lỗi thời và cảm thấy rất sai.
Vô hình

Câu trả lời:


17

Không thấy điều này trước đây.

Cách ngắn nhất để có được thực thể được tham chiếu cho trường một giá trị là:

$node->field_image->entity->url()

Bạn cũng có thể chỉ định rõ ràng delta:

$node->field_image[0]->entity->url()

Điều này hoạt động với rất nhiều phép thuật ArrayAccess và __get ().

Xem thêm bảng cheat tuyệt vời tại http://wizzlern.nl/drupal/drupal-8-entity-cheat-sheet . và https://www.drupal.org/node/1795854 và các trang tài liệu khác ở đó để biết thêm thông tin (vẫn còn rất nhiều công việc đang tiến hành).


Đẹp! Tôi đã tự hỏi làm thế nào chúng ta có thể có được hình ảnh alt. Tôi đã thử $ node-> field_image [0] -> entity-> alt và $ node-> field_image [0] -> entity-> image-> alt; mà tôi tìm thấy trong tài liệu bạn đề cập nhưng nó không hoạt động với thực thể nút tôi nghĩ.
Hedeshy

1
alt / title không nằm trên thực thể tệp được tham chiếu mà chính là mục trường. Chỉ cần $ nút-> field_image [0] -> alt sẽ hoạt động tốt.
Berdir

3

Điều cuối cùng làm việc cho tôi trong D8 là:

$imageUrl = $node->get('field_image')->entity->uri->value;

Sử dụng kint($node->get('field_image')->entity)và xem qua các mảng rất hữu ích

nhập mô tả hình ảnh ở đây

Sau đó, trong tập tin twig của tôi, tôi đã sử dụng:

<img class="top-article-image" src="{{ file_url(imageUrl) }}" />

1

Vì vậy, giải pháp của tôi là sử dụng phương thức "ReferenceencedEntities ()" được tìm thấy trong nodeobject. Điều này đã cho tôi một mảng các đối tượng Tệp mà tôi có thể lặp qua và sử dụng phương thức "url ()" từ các đối tượng tệp để truy xuất một đường dẫn hợp lệ.


0

Nếu nút của bạn có nhiều hơn một hình ảnh, bạn có thể sử dụng điều này để có được một mảng các url hình ảnh (hữu ích để tạo các mô-đun trình chiếu giữa rất nhiều điều hữu ích khác)

$allImagesFound = false;
$imageUrls = array();
$numberOfImages = 0;
while(!$allImagesFound)
{
    //make sure we are not calling a null value, if so then we have found all images
    if($node->get('your_image_field_name')[$numberOfImages] != null) {
        $imageUrls[] = $node->get('your_image_field_name')[$numberOfImages]->entity->url();
        $numberOfImages++;
    } else {
        $allImagesFound = true;
        break;
    }
}

Mảng imageUrls sẽ chứa tất cả các url cho bất kỳ hình ảnh nào được liên kết với trường nút. Hi vọng điêu nay co ich.

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.