Lấy URL hình ảnh từ một trường_image trên một nút


42

Vì vậy, tôi có nút này:

object(Drupal\node\Entity\Node)[1862]
  protected 'values' => 
    array (size=17)
      'vid' => 
        array (size=1)
          'x-default' => string '7' (length=1)
      'langcode' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=1)
                  'value' => string 'en' (length=2)
      ... (more fields)
      'field_image' => 
        array (size=1)
          'x-default' => 
            array (size=1)
              0 => 
                array (size=5)
                  'target_id' => string '1' (length=1)
                  'alt' => string '' (length=0)
                  'title' => string '' (length=0)
                  'width' => string '150' (length=3)
                  'height' => string '120' (length=3)

Bây giờ field_image có một mảng với x-default và một số dữ liệu hình ảnh cơ bản. Làm cách nào để hiển thị hình ảnh hoặc tạo liên kết đến hình ảnh bên trong mẫu Twig?


Không có thời gian để kiểm tra nhưng có thể đơn giản như url(node.field_image.0.entity.uri)( vấn đề có liên quan )
Clive

@Clive Tôi đã thử cái này và cho tôi lỗi này: Recoverable fatal error: Object of class Drupal\Core\Field\FieldItemList could not be converted to string vì vậy tôi đã thử nó với cái này: url(node.field_image.0.entity.uri.value)nhưng sau đó nó chỉ cho tôi biết điều này:Twig_Error_Runtime: An exception has been thrown during the rendering of a template ("Route "public://image.png" does not exist.")
Rias

Errr ... Tôi đoán rằng nó cần phải được thực hiện trong một hook hook tiền xử lý, trừ khi có chức năng trợ giúp Twig để chuyển đổi FieldItemLists thành biểu diễn chuỗi (mà tôi không thể tìm thấy)
Clive

Ồ tôi hiểu rồi, url()muốn có một lộ trình. Thế còn url_from_path(node.field_image.0.entity.uri.value)?
Clive

Hmm url_from_path()dường như tạo ra điều này: http://mywebsite.local/public%3A//image.pngvì vậy nó dường như là mã hóa url và nối thêm giá trị chính xác vào url
Rias

Câu trả lời:


49

Đây là phiên bản cập nhật cho câu trả lời này sau 8.0.x. Điều này dựa trên bình luận @joelpittet .

{{ file_url(node.field_image.entity.fileuri) }}

2
Xin lưu ý rằng bạn sẽ nhận được url của ảnh gốc "chưa được chỉnh sửa" và không phải là url cụ thể của kiểu ảnh (ví dụ: hình thu nhỏ). Ngoài câu trả lời của VladimirM, không có cách nào để có được url hình ảnh được tạo kiểu chính xác trong twig. Ít nhất hiện tại ...
Philipp Michael

2
... các kiểu hình ảnh hiện có sẵn trong Twig Tweak - drupal.org/project/twig_tweak
4k4 18/03/17

1
Lớp Tệp có một url()phương thức, vì vậy bạn chỉ cần gọi entity.url()chứ không phải chuyển entity.fileuriđếnfile_url()
Kiee

36

Tôi không biết về Twig, nhưng bạn nhận được tệp URI bằng $node->field_image->entity->getFileUri()PHP và bạn cần phải gọi file_create_url()nó:

file_create_url($node->field_image->entity->getFileUri())

Tôi không biết nếu điều đó là có thể trong twig. Nếu không thể, bạn luôn có thể tính toán nó trong quá trình tiền xử lý và thêm dưới dạng một biến mới.


2
Chúng tôi đang cố gắng đưa file_create_url () vào cốt lõi nhưng sự thiếu quan tâm đã khiến vấn đề trở nên cũ. drupal.org/node/2168231 Mặc dù nếu có trong đó thì nên là {{file_url (node.field_image.entity.fileuri)}}
joelpittet

26

Nếu ai đó cần một hình ảnh theo kiểu:

$styled_image_url = ImageStyle::load('large')->buildUrl($node->field_image->entity->getFileUri());

4
Đây là một câu trả lời tuyệt vời. Lưu ý rằng trong tệp .theme hoặc .module của bạn, bạn sẽ muốn thêm phần này vào đầu:use Drupal\image\Entity\ImageStyle;
mikeDOTexe

2
Tôi gặp vấn đề với https, trong đó Safari sẽ không hiển thị hình ảnh vì nó sử dụng IP thay thế. Bạn có thể muốn thêm $relative = file_url_transform_relative($styled_image_url);để đảm bảo nó tương đối. API tại đây
mikeDOTexe

9

Không có giải pháp twig nào ở trên hoạt động với tôi (có lẽ những giải pháp này hoạt động cho các phiên bản 8.x cũ hơn nhưng không phải cho phiên bản 8.5

{{ file_url(node.field_image['#items'].entity.uri.value) }}

LƯU Ý: nên làm việc cho Drupal 8.5+


Tôi nghĩ thật tệ khi những thứ này bị loại bỏ sau một thời gian. Nâng cấp Drupal nên giữ cho những người làm việc! Điều này làm việc cho tôi trong Drupal 8.6, cảm ơn.
Stef Van Looveren

7

Vì vậy, tôi đã tìm ra câu trả lời với sự giúp đỡ của Clive .

Lấy URI hình ảnh trong Twig được thực hiện bằng cách sử dụng node.field_image.0.entity.uri.value

Lấy URL đầy đủ cho hình ảnh có thể được thực hiện bằng cách sử dụng file_create_url(node.field_image.0.entity.uri.value)

Làm điều này trong Twig chưa thể nhưng họ đang làm việc trên nó -> xem tại đây


6

Đ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) }}" />

Điều gì xảy ra nếu không có hình ảnh được chèn và chúng tôi đã đặt giá trị mặc định.
amol

2

bạn có thể lấy url trực tiếp bằng cách sử dụng field_image.entity.url


2

Tôi luôn luôn sử dụng chức năng trợ giúp

  /**
   * Get the Image URI.
   *
   * @param \Drupal\Core\Entity\Entity $entity
   * @param $fieldName
   * @param bool $imageStyle
   * @return mixed
   */
  public function getImageUri(\Drupal\Core\Entity\Entity $entity, $fieldName, $imageStyle = FALSE) {
    $imageField = $entity->get($fieldName)->getValue();
    if (!empty($imageField[0]['target_id'])) {
      $file = File::load($imageField[0]['target_id']);
      if ($imageStyle) {
        return ImageStyle::load($imageStyle)->buildUrl($file->getFileUri());
      }

      // Original URI.
      return file_create_url($file->getFileUri());
    }
  }

1

Đây là cách nếu bạn muốn lấy URL hình ảnh với kiểu hình ảnh được liên kết cho bất kỳ trường hình ảnh nào trong mẫu twig:

Đầu tiên cài đặt mô-đun Twig Tweak

Sau đó đặt URI hình ảnh làm biến. Với URI, bạn có thể sử dụng mẫu điều chỉnh twig để có được đường dẫn với bất kỳ kiểu hình ảnh nào bạn muốn. Xem bên dưới:

{% set image_uri = content.field_feature_row_image['#items'].entity.uri.value %}

<img src="{{ image_uri|image_style('image1200x1103') }}"/>

Twig Tweak v2.4 + cung cấp file_urlbộ lọc để trích xuất URL tệp từ một thực thể.

<img src="{{ node.field_image|file_url|image_style('image1200x1103') }}"/>

0

Tôi có cùng một vấn đề, vì vậy tôi đã tạo ra một get_image_path()hàm Twig và thêm nó với một loạt các công cụ hữu ích khác vào mô-đun Starter khởi động của tôi:

https://github.com/brynj-digital/starter

Hàm chấp nhận trường hình ảnh và tên máy của một kiểu hình ảnh, sau đó trả về đường dẫn hình ảnh đó.

Nó hoạt động trong rất nhiều hoàn cảnh - bạn có thể vượt qua node.field_name, content.field_namehoặc row._entity.field_name(trong trường hợp của một lĩnh vực Xem mẫu).


0

Trời ạ, thực sự phải mất nhiều thời gian để tìm hiểu lý do tại sao các URL kết quả của tôi không hoạt động. Tất cả 404'ed. Bạn cần tạo một đạo hàm trước nếu nó không tồn tại .

Vì vậy, ví dụ khi bạn thêm một kiểu hình ảnh sau đó, sau khi hình ảnh gốc được tải lên, thì vẫn chưa có tệp hình ảnh được tạo kiểu (hình ảnh phái sinh). Nó cần phải được tạo ra đầu tiên.

Thay thế field_MYIMAGEMYSTYLEkhi bạn cần.

$original_image = $node->field_MYIMAGE->entity->getFileUri();
$style = \Drupal::entityTypeManager()->getStorage('image_style')->load('MYSTYLE');

$destination = $style->buildUri($original_image);
if (!file_exists($destination)) {
  $style->createDerivative($original_image, $destination);
}

$url = $style->buildUrl($original_image);

Tôi ước điều này sẽ tự động xảy ra.


0

hơi liên quan, đây là những gì tôi đã sử dụng (nhờ tất cả các câu trả lời trước để đưa tôi đến đó) để lấy URL tệp hình ảnh từ trường hình ảnh của thực thể phương tiện trong twig:

{% set media_img_url = file_url(content.field_media_image.0['#item'].entity.uri.value) %}

bây giờ tôi có thể sử dụng biến này trong mẫu twig của mình

{{ media_img_url }}

0

Để lấy thuộc tính hình ảnh như URI, alt, title, v.v ... hãy sử dụng cú pháp như mẫu dưới đây

Trong mẫu twig nút

{{node.field_name.entity.fileuri}}

Trong mẫu twig trường

{{content.field_name.entity.fileuri}}

Trong mẫu twig lĩnh vực khác

{{element['#object'].field_name.entity.fileuri}}

Lưu ý: Đồng thời kiểm tra bảng cheat mô-đun twig_tweaks để biết chi tiết liên quan đến vấn đề liên quan đến twig.


0

Bạn có thể sử dụng url()phương thức trên lớp Tệp làm lối tắt:

{{ file_url(node.field_image.entity.fileuri) }}

có thể rút ngắn thành:

{{ node.field_image.entity.url }}

Điều này hoạt động trong các chức năng tiền xử lý nhưng kích hoạt một Twig_Sandbox_SecurityErrorkhi được gọi trong một mẫu twig.

Nếu bạn nhận được, Twig_Sandbox_SecurityErrorbạn có thể yêu cầu twig cho phép urltrong tệp settings.php của bạn như được đề cập trong bài đăng Stackoverflow này

Xem tài liệu về Tệp :: Url () https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/feft/File%3A%3Aurl/8.6.x


-4

Bạn có thể làm điều đó theo hai cách!

1) file_create_url (---------) // bên trong ghi đường dẫn của nút

2) file_url (-------) // bên trong ghi đường dẫn của nút

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.