Làm cách nào để tìm URL kiểu ảnh từ trong mẫu twig?


9

Tôi đang thực hiện một mẫu nút sử dụng một hình ảnh hai lần; một lần theo cách 'bình thường' (nghĩa là sử dụng kiểu hình ảnh được xác định trong cấu hình hiển thị của trường cho chế độ xem đó) và cái kia là thuộc tính hình ảnh nền css.

Tôi cần một trong hai điều:

  1. (lý tưởng) một cách để lấy URL cho một kiểu hình ảnh khác nhau của cùng một hình ảnh.

  2. một cách để lấy URL cho trường hình ảnh.

Tôi đang vật lộn để sử dụng dump()kint()giúp mình trả lời. Cả hai đều xuất ra quá nhiều (nhờ các liên kết được nhúng đến "cha mẹ", v.v.) và dường như không có thông tin tôi cần. ví dụ: nhìn vào dump(content.field_image)đầu ra URL thực tế của hình ảnh không có ở đó (vậy nó đến từ đâu để có thể được hiển thị với {{ content.field_image }}?!). kint()mặt khác chết hoàn toàn nếu tôi chuyển một đối số cho nó và phiên bản cấp cao nhất lại quá lớn để điều hướng. Việc gỡ lỗi trở nên dễ dàng hơn nhiều với phptemplate + xdebug. (Có, tôi biết thật tốt khi chủ đề không thể bỏ cơ sở dữ liệu.)

Có câu trả lời cho (1) ngụ ý rằng bạn không thể làm điều đó , nhưng tôi không hiểu tại sao tôi không thể lấy URL hiện có trong (2)?

Câu trả lời:


10

Bạn có thể lấy url kiểu ảnh trong hàm tiền xử lý và chuyển nó vào mẫu nút. (trong trường hợp của tôi, tôi cần ở cấp độ trang. Tôi đoán điều này sẽ vẫn hoạt động cho nút)

Một cái gì đó như thế này, với "myimagefield" là tên máy cho trường hình ảnh của bạn và "myimagestyle" là tên máy cho kiểu của bạn, cũng đảm bảo bạn bao gồm Entity \ ImageStyle.

use Drupal\image\Entity\ImageStyle;

/**
 * Implements hook_preprocess_page().
*/
function mytheme_preprocess_page(&$variables, $hook) {
  if ($variables['node']) {
    $node = $variables['node'];
    if($node->myimagefield[0]){
        $cover_image = $node->myimagefield[0]->entity->getFileUri();
        $image_url = ImageStyle::load('myimagestyle')->buildUrl($cover_image);
        $variables['my_image'] = $image_url;
    }
  }
}

1
câu hỏi nói để kéo chế độ xem từ cấu hình hiển thị của trường. Bằng cách thực hiện $ image_url = ImageStyle :: load ('myimagestyle') -> buildUrl ($ cover_image); Làm thế nào bạn kéo phong cách hình ảnh từ cấu hình của trường? Bạn chỉ cần thêm myimagestyle, nhưng nếu cùng một trường nằm trên nhiều thực thể (ví dụ: các nút) trong đó nó yêu cầu các kiểu hình ảnh khác nhau thì sao?
tên người dùng

12

Phần đầu tiên đã được trả lời trong câu hỏi được liên kết, nơi có mã làm thế nào để làm điều này. Để trả lời phần thứ hai của câu hỏi, bạn có thể truy cập hình ảnh gốc trong đối tượng nút:

{{ file_url(node.field_image.entity.uri.value) }}

Một nhận xét về content:

Trong một mẫu nút, trường hình ảnh trong contentchưa sẵn sàng để được hiển thị. Trường chứa cấu hình như thế nào sẽ được hiển thị và đối tượng trường chứa tất cả dữ liệu thô. Sau này, nó sẽ được đặt cùng nhau trong các trường mẫu, định dạng hình ảnh và mẫu hình ảnh. Đó là lý do bạn không tìm thấy url bạn đang tìm kiếm contenttại thời điểm này.

Trong mẫu nút, bạn có thể sử dụng các trường ở cấp cao nhất của mảng nội dung, ví dụ: hiển thị trường hình ảnh

{{ content.field_image }}

như được cấu hình trong chế độ xem.

Biên tập:

Có một bộ lọc mới trong mô-đun Twig Tweak . Bây giờ bạn có thể tạo url kiểu ảnh trong twig trực tiếp từ uri hoặc url của ảnh gốc:

{{ node.field_image.entity.uri.value | image_style('thumbnail') }} 

Cảm ơn. Vì vậy, tất cả các hook tiền xử lý được gọi khi twig gọi kết xuất, ví dụ tại điểm bạn đi {{ content.field_image }}và không phải trước đó? Ngoài ra, tôi nghĩ rằng url tôi sẽ nhận được từ đề xuất của bạn là url gốc - phần 2 trong Q của tôi đã yêu cầu url của kiểu ảnh, như được định cấu hình theo chế độ xem. Điều đó có thể không?
artfulrobot 15/03/2016

Điều này chỉ hoạt động cho hình ảnh được tải lên thường xuyên và không cho hình ảnh tham chiếu thực thể. Làm thế nào điều này có thể được thực hiện để làm việc với hình ảnh tham chiếu thực thể?
paulcap1

@ paulcap1, không biết chính xác ý bạn là gì, vì trường hình ảnh là trường tham chiếu (đối với thực thể tệp). Nếu bạn có nghĩa là bạn có hình ảnh bên trong của một thực thể được tham chiếu, thì bạn cần .entityhai lần, lần đầu tiên để đến thực thể và lần thứ hai cho hình ảnh.
4k4

1
@ paulcap1, ví dụ{{ node.field_ref.entity.field_image.entity.uri.value }}
4k4

@ 4k4. Tôi đang sử dụng loại nội dung Trang mặc định. Tôi có một trường tham chiếu thực thể được gọi là field_global_image. Điều này sử dụng Gói hình ảnh. Trường hình ảnh Gói được gọi là "" hình ảnh "Tôi đã thử theo cách của bạn bằng cách sử dụng {{node.field_global_image.entity.image.entity.uri.value}} Tôi cũng đã thử chuyển đổi các trường như thế này {{node.image.entity.field_global_image .entity.uri.value}} Không hoạt động. Trong câu trả lời của tôi trong một bài viết riêng biệt, đó là những gì làm việc cho tôi.
paulcap1

6

Cài đặt Mô-đun Twig Tweak https://www.drupal.org/project/twig_tweak

Và mô-đun này Twig Field https://www.drupal.org/project/twig_field_value

Nếu bạn đang sử dụng hình ảnh trường tải lên hình ảnh thông thường, hãy sử dụng điều này trong mẫu nút của bạn:

<img src="{{ node.field_regular_image.entity.uri.value | image_style('thumbnail') }} " >

Nếu bạn đang sử dụng hình ảnh tham chiếu thực thể, hãy sử dụng:

<img src="{{ file_url(content.field_global_image|field_target_entity.image.entity.uri.value | image_style('thumbnail'))}} " >

Lưu ý rằng trong ví dụ về việc sử dụng các thực thể được tham chiếu imagesau khi tham chiếu field_target_entityđến trường hình ảnh trên thực thể được tham chiếu. Bạn có thể phải điều chỉnh nó.
daniels

1
Cảm ơn! Ví dụ tham chiếu thực thể cũng có thể được thực hiện mà không cần mô-đun twig_field_value bằng cách:file_url(node.field_image.entity.field_referenced_image.entity.uri.value | image_style('thumbnail'))
John
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.