Móc vào định dạng trường mô-đun khác?


9

Hiện đang cố gắng triển khai trường hình ảnh được tham chiếu nút trên trang web Drupal 7 của tôi, nó sẽ thay đổi 'chế độ xem' tùy thuộc vào logic lập trình ngay trước khi kết xuất. Trường hiện đang được hiển thị trên một số loại nội dung thông qua cài đặt chế độ hiển thị của chúng, mỗi loại đang sử dụng bộ định dạng trường 'Nút được kết xuất'.

nỗ lực đầu tiên

Ý tưởng đầu tiên của tôi là thực hiện như sau, coi móc là móc là móc:

function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
  switch ($display['type']) {
    case 'node_reference_node':
      /* Programatical logic here to modfy field render settings */
    break;
  }
}

Rõ ràng là trao đổi HOOK cho tên mô-đun của tôi.

Nó không thực sự quan trọng nếu trên sẽ bắn trước hoặc sau khi chức năng ban đầu node_reference_field_formatter_viewtrong node_reference.modulevì tôi hoặc là sẽ ghi đè nó ra hoàn toàn hay, hy vọng, sửa đổi các giá trị của nó trước khi vẽ. Vấn đề duy nhất là, cái móc ở trên dường như chỉ hoạt động trên cơ sở mỗi mô-đun - tức là nó không phải là toàn bộ trang web, vì vậy về cơ bản, nó không kích hoạt mô-đun của tôi.

Bây giờ rõ ràng tôi có thể viết trình định dạng trường của riêng tôi để xuất ra một nút được kết xuất. Nhưng có vẻ như một sự lãng phí khi xem xét đã có một cái tồn tại.

phương pháp khác

Các cách tiếp cận khác của tôi đã được HOOK_preprocess_nodeHOOK_preprocess_fieldnhưng cái trước không chứa bất kỳ view_modethông tin nào , và cái sau chứa ít nhất 5 cấu trúc phức tạp khác nhau mà tất cả đều có tham chiếu đến một thuộc view_modetính ở các cấp độ khác nhau - và cảm thấy khá khó chịu khi phải sửa đổi từng thông tin của chúng các giá trị. Ngay cả khi tôi đã thay đổi một số view_modethuộc tính nhất định , hình ảnh kết quả sẽ không thay đổi.

câu hỏi

Có ai biết một cách rõ ràng để bước vào trước khi trình định dạng trường hiển thị (của mô-đun đóng góp) và thay đổi cài đặt trên cơ sở yêu cầu trên mỗi trang - tức là không phải thay đổi cài đặt chế độ xem vĩnh viễn của loại nội dung thực tế không?


2
Tôi đã tìm kiếm một hook_field_formatter_view_alter()hoặc tương tự có lẽ trong hơn một năm nay, nó chỉ không tồn tại một cách đáng tiếc. FYI hook_preprocess_node()chắc chắn khôngview_modesẵn cho nó, nó ở $vars['view_mode'], không phải $vars['node']->view_modemà bạn có thể đã bị cám dỗ để thử.
Clive

@Clive cảm ơn về thông tin, oh và đã chỉ ra view_modetrên hook_preprocess_node, đánh lừa tôi! Tôi tự hỏi liệu có thứ gì như thế hook_field_formatter_view_alter()này tồn tại trong D8 không ...
Pebbl

Tôi chưa thấy gì cả ... nhưng sau đó mọi thứ đang được chuyển đổi thành plugin trong D8 (tôi không chắc chắn về các trường) nên có thể bạn chỉ cần ghi đè một lớp hiện có để hoàn thành công việc, đó là lý tưởng . Đây là hy vọng!
Clive

1
@Clive, bạn đã tìm thấy móc thay đổi ma thuật của mình được đề cập ở đây cho D7 chưa?
tyler.frankenstein

Câu trả lời:


11

Câu hỏi đề cập đến hook_field_formatter_view()chỉ được gọi trên mô-đun khởi tạo, nhưng bạn có thể sở hữu công cụ định dạng trường thông qua hook_field_formatter_info_alter().

Bạn sẽ có thể đặt modulekhóa của trình định dạng thành MYMODULE như:

function MYMODULE_field_formatter_info_alter(&$info) {
  $info['some_field_formatter']['module'] = 'MYMODULE';
}

Sau đó, bạn có thể thực hiện MYMODULE_field_formatter_view(), tùy chọn cung cấp thông qua mô-đun hiện có xử lý nó để có được một yếu tố để thay đổi.

function MYMODULE_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  // Your custom logic
  $element = OTHER_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
  // Any alterations
}

Bạn có thể giải thích về câu trả lời của bạn? Cung cấp một số mã?
Scott Joudry

Giải pháp tuyệt vời, tôi gần như không bao giờ nghĩ sẽ sở hữu hoàn toàn công việc của một mô-đun khác (và chuyển tiếp sau khi thay đổi) ... chỉ cần thử nó và tôi kết thúc bằng mã đơn giản hơn nhiều. Chúc mừng!
Pebbl

1
@ScottJoudry ~ có thể đáng lưu ý rằng nếu bạn tiếp quản theo cách này, bạn cần đảm bảo rằng bạn có các phương thức cho tất cả các field_formatterchức năng của node_Vference tức là MYMODULE_field_formatter_settings_summaryMYMODULE_field_formatter_settings_form(ngay cả khi chúng chỉ là các chức năng proxy trở lại mô-đun gốc) nếu không thì UI kết thúc bị hỏng trên bất kỳ bảng chế độ hiển thị nào, khi nó cố gắng tìm các phương thức này trong mô-đun sai.
Pebbl

Cách tiếp cận của Graham C rất thú vị, nhưng đòi hỏi quá nhiều phần ghi đè.
milkovsky

2

Ok vì vậy tôi nhận ra lý do tại sao những thay đổi của tôi #view_modetrong một trong hai hook_preprocess_nodehook_preprocess_fieldskhông hoạt động. (Nhờ Clive để chỉ ra rằng tôi đã hoàn toàn bị mất sự hiện diện của #view_modetrong hook_preprocess_node) .

Vấn đề của tôi xuất phát từ thực tế #view_modeđã được xử lý và chuyển đổi thành #image_styletài sản chính xác - thứ mà tôi đã bỏ qua để tìm kiếm.

Mặc dù vậy, việc thay đổi giá trị này dường như quá phụ thuộc vào hook mà bạn đã sửa đổi. Cuối cùng tôi cũng có một số mã hoạt động, điều đó thực sự thay đổi hình ảnh được hiển thị:

function HOOK_preprocess_field( &$vars ){
  $element     = &$vars['element'];
  $entity_type = !empty($element['#entity_type']) ? $element['#entity_type'] : 'unknown';
  $bundle      = !empty($element['#bundle'])      ? $element['#bundle']      : 'unknown';
  $view_mode   = !empty($element['#view_mode'])   ? $element['#view_mode']   : 'unknown';
  $field_name  = !empty($element['#field_name'])  ? $element['#field_name']  : 'unknown';
  switch ( "$entity_type:$view_mode:$bundle/$field_name" ) {
    case 'node:full:mlandingpage/field_lead_image':
      if ( !empty($vars['items']) && 
           ($subelement = &$vars['items'][0]) ) {
        if ( !empty($subelement['field_image']) && 
             ($subfield = &$subelement['field_image'][0]) ) {
          /// this needs to be set to the image_style value, not the view_mode value.
          $subfield['#image_style'] = 'grid-normal-4-cols';
        }
      }
    break;
  }
}

Ở trên vẫn không cảm thấy rất hùng hồn, nhưng ít nhất nó hoạt động. Tôi sẽ nói với Clive về thực tế là một phương thức _alter như vậy không tồn tại đối với các trình định dạng trường - thật đáng tiếc, các trình định dạng là một tính năng cực kỳ mạnh mẽ của D7, thật tuyệt khi có thêm khả năng tăng cường.

Dù sao, nếu bất kỳ người nào trong tương lai có ý tưởng tốt hơn, hãy trả lời đi :)


0

Cách tiếp cận đơn giản nhất sẽ là sử dụng Panelizer .

Nếu không sử dụng Panelizer nhưng chế độ xem Drupal mặc định hoặc Display Suite, hãy thử hook_field_display_alter () hoặc hook_field_display_ENTITY_TYPE_alter () .

Bạn có thực thể, bối cảnh hiển thị cũng như tất cả các cài đặt định dạng ở đó. Và bạn có thể dễ dàng thay đổi cài đặt kết xuất trường. Bạn thậm chí có thể thay đổi định dạng trường sang một định dạng khác.

Cách tiếp cận hoạt động hoàn hảo cho tôi. Nhược điểm duy nhất là bạn có thể bị nhầm lẫn với các cài đặt khác nhau trong giao diện người dùng "Quản lý hiển thị".


0

https://www.drupal.org/node/2130757 Nó là một ví dụ điển hình. hook_field_formatter_third_party_sinstall_form () rất hữu ích để thay đổi hình thức của trình định dạng trường hiện có.

Nhưng điều này không làm việc với các nhóm lĩnh vực.

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.