Thay đổi giá trị trường trước khi kết xuất


8

Trong Drupal 8, tôi đã nghĩ rằng đó là một nhiệm vụ đơn giản nhưng không phải:

function hmytheme_preprocess_field(&$variables, $hook) {
    $element = $variables['element'];
    if (isset($element['#field_name'])) {

        if($element['#field_name'] == "bar"){
             element['#items']->value ="foo";
             //or
             element['#items']->set(0,"foo");
        }
    }
}

Đây không phải là làm cho kết xuất. Làm thế nào để ? Tôi không muốn tiết kiệm giá trị đã thay đổi

Câu trả lời:


6

Quá muộn để thay đổi đối tượng trường, vì trường đã được chuẩn bị để kết xuất. Bạn phải tìm giá trị trường bên trong mảng kết xuất, ví dụ như trong #markupvà thay đổi nó ở đó. Nơi bạn tìm thấy giá trị phụ thuộc vào cách hiển thị trường của bạn được định cấu hình trong chế độ xem.

Trong khi có thể, thường có một cách tốt hơn. Bạn có thể tạo bộ định dạng của riêng bạn trả về cấu trúc mà bạn muốn. #text là một trường văn bản được định dạng, bạn có thể tạo một bộ lọc biến đổi văn bản theo cách bạn muốn. Phụ thuộc vào những gì bạn muốn làm chính xác.

(Nhận xét từ @Berdir)

Xem tài liệu drupal cách tạo bộ định dạng trường tùy chỉnh:

https://www.drupal.org/docs/8/creating-custom-modules/create-a-custom-field-formatter


1
wooookay, do đó, trong $ biến ['nội dung'] ['field_bar] [0] [' # text '] ... Trong mỗi hook, đường may có một cách khác nhau ... có logic hay chúng ta chỉ có một logic để xem bên trong biến $ để làm điều này? Hoặc có lẽ không nên thay đổi kết xuất ở đây?
Cawet

Hoàn toàn tốt để thay đổi mảng kết xuất trong tiền xử lý. Đó là những gì mà hook được cho là được sử dụng cho. Nhưng bạn phải đối phó với một số loại phần tử kết xuất và điều chỉnh mã của bạn cho phù hợp. Chúng thay đổi cho mọi loại trường và định dạng trường bạn chọn và định cấu hình trong chế độ xem.
4k4

Trong khi có thể, thường có một cách tốt hơn. Bạn có thể tạo bộ định dạng của riêng bạn trả về cấu trúc mà bạn muốn. #text là trường văn bản được định dạng, bạn có thể tạo bộ lọc biến đổi văn bản theo cách bạn muốn. Phụ thuộc vào những gì bạn muốn làm chính xác.
Berdir

Tôi sẽ không đi xa để trả lời câu hỏi này về chủ đề. Nhưng nếu bạn sẵn sàng biến một mô-đun tùy chỉnh thành một trình định dạng trường hoặc plugin bộ lọc văn bản là điều nên làm. Không chỉ lý do @Berdir đề cập, mà còn bởi vì mã của bạn trở nên độc lập với chủ đề và có thể dễ dàng mở rộng bất kỳ trang web nào.
4k4

Bạn có thể thêm nó làm câu trả lời mã mẫu được không
KTM

2

Như đã đề cập ở trên, bạn phải thay đổi #markup, ví dụ cho trường "field_block_iframe" bên dưới:

/**
 * Implements hook_preprocess_field().
 *
 * @param $variables
 * @param $hook
 */
function THEME_preprocess_field__field_block_iframe(&$variables, $hook) {
  $variables['items'][0]['content']['#markup'] = 'Going down, to the core.';
}
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.