Mình ở D9.
Tôi đã thêm tùy chọn tùy chỉnh vào trình định dạng trường hình ảnh sau Hướng dẫn Drupal
Trong quá trình tiền xử lý của trường, tôi có thể nhận được các cài đặt mà tôi đã tạo:
function my_module_pre process_field(&$variables) {
if ($variables["element"]["#formatter"] === 'image') {
$entity = $variables['element']['#object'];
$view_mode = $variables['element']['#view_mode'];
$field_name = $variables['element']['#field_name'];
$entity_display = EntityViewDisplay::collectRenderDisplay($entity, $view_mode);
$field_display = $entity_display->getComponent($field_name);
$variables['my_settings'] = isset($field_display["third_party_settings"]["my_module"]["my_settings"]) && $field_display["third_party_settings"]["my_module"]["my_settings"];
}
}
Tuy nhiên, các trường.html.twig
tệp không phù hợp với nhu cầu của tôi: Tôi phải chuyển cài đặt này tới image-formatter.html.twig
tập tin, bởi vì tôi cần phải đặt một div
ngay sau khi hình ảnh
thẻ và không nằm ngoài một
.
Thật không may, tôi không thể lấy thông tin đó trong quá trình tiền xử lý của trình định dạng hình ảnh, vì tôi không thể tìm cách lấy chế độ xem:
function my_module_pre process_image_formatter(&$variables) {
$item = $variables['item'];
$entity = $item->getEntity();
$field = $item->getFieldDefinition();
// để làm cách lấy view_mode\the third_party_settings?
$entity_display = EntityViewDisplay::collectRenderDisplay($entity, $missing_view_mode);
}
Điều đó có thể không?
CHỈNH SỬA:
Cảm ơn câu trả lời 4k4, những gì tôi đã làm:
- Đã thêm vào bên trong chức năng trường tiền xử lý:
if (!empty($variables['items'])) {
foreach ($variables['items'] as &$item) {
$item['content']['#item_attributes']['my_settings'] = $my_settings;
}
}
Và sau đó thêm một chức năng tiền xử lý ảnh để có thông tin đó dưới dạng biến chứ không phải thuộc tính - nhiều sở thích hơn là sự cần thiết nghiêm ngặt.
function my_module_pre process_image(&$variables) {
$variables['my_settings'] = $variables["attributes"]["my_settings"] ?? SAI;
unset($variables["attributes"]["my_settings"]);
}