Điểm:1

Phương pháp mới cho Kết xuất trước biểu mẫu để sử dụng TrustedCallbackInterface là gì

lá cờ cn

Chúng tôi đang nâng cấp từng trang web của mình từ Drupal 8 lên Drupal 9 và có một dòng mã trong chủ đề tùy chỉnh của chúng tôi, đây là vấn đề cuối cùng của chúng tôi.

Chúng tôi gặp lỗi sau trên Chế độ xem sử dụng bộ lọc bị lộ:

Drupal\Core\Security\UntrustedCallbackException: Các cuộc gọi lại kết xuất #pre_render phải là phương thức của một lớp triển khai \Drupal\Core\Security\TrustedCallbackInterface hoặc là một hàm ẩn danh. Cuộc gọi lại là MYSITE_form_alter_views_exposed_form_MYVIEW_pre_render. Xem https://www.drupal.org/node/2966725 trong Drupal\Core\Render\Renderer->doTrustedCallback() (dòng 96 của core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php).

Trong tệp OURTHEME.theme, chúng tôi có chức năng này:

/**
 * Thay đổi biểu mẫu tùy chỉnh cho các sự kiện.
 */
chức năng OURTHEME_form_alter_views_exposed_form_events_pre_render($form) {
  trường $ = [
    'trường_bắt_đầu_ngày_giá_trị',
    'trường_cuối_ngày_giá_trị',
    'trường_địa chỉ_địa phương',
  ];
  foreach ($fields as $field) {
    $form[$field]['#title_display'] = 'sau';
  }
  $form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
  $form['field_event_address_locality']['#suffix'] = '</div>';
  trả về biểu mẫu $;
}

Và chức năng được gọi ở đây (chỉ là một đoạn mã trong chức năng này):

/**
 * Đây là những thay đổi đối với các biến biểu mẫu trước khi chúng được hiển thị.
 */
function OURTHEME_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'views_exposed_form' && strpos($form['#id'], 'views-exposed-form-events-') === 0) {
    $form['#pre_render'][] = 'OURTHEME_form_alter_views_exposed_form_events_pre_render';
  }
  trả về biểu mẫu $;
}

Từ những gì tôi có thể dự đoán từ nghiên cứu mà tôi đã thực hiện cho đến nay, có vẻ như thông thường bất kỳ lớp nào mà các loại chức năng này được sử dụng đều đã triển khai Drupal's TrustedCallbackGiao diện. Thật không may, thông tin duy nhất mà tôi tìm thấy nằm trong các bản vá khác nhau được áp dụng cho các dự án trên Drupal.org, vì vậy tôi đang cố gắng tập hợp một phương pháp từ các ứng dụng ngẫu nhiên của nó.

Tất nhiên, có trang API Drupal, nhưng điều đó không đặc biệt hữu ích khi thực sự ghép các phần lại với nhau thành một phương pháp hữu ích mà bạn không cần biết phần còn lại của API như lòng bàn tay.

Có ai biết nếu có bất kỳ tài liệu nào về cách áp dụng TrustedCallbackGiao diện đến một chức năng mà trước đây đã sử dụng $form['#pre_render'][], đặc biệt là trong THEME.theme không được thiết lập giống với bất kỳ lớp tùy chỉnh cũ nào trong Mô-đun?

Kevin avatar
lá cờ in
Lỗi ở ngay đó - bạn đang thêm một chức năng vào pre_render không được phép gọi. https://www.drupal.org/node/2966725
Loopy avatar
lá cờ cn
Vì vậy, câu trả lời chỉ là "Đừng thử thay đổi biểu mẫu kết xuất trước. Hãy làm những gì bạn cần làm theo cách khác." ?
Kevin avatar
lá cờ in
Nhìn vào bản ghi thay đổi được liên kết
Loopy avatar
lá cờ cn
Tệp .theme không phải là một lớp. Vì vậy, tôi nên tạo thư mục src trong chủ đề của mình và chuyển mã từ tệp .theme sang khai báo lớp mới?
4uk4 avatar
lá cờ cn
Có, xem ví dụ https://drupal.stackexchange.com/a/300204/47547. Đối với một loại gọi lại khác, nhưng nó hiển thị một lớp triển khai RenderCallbackInterface trong một chủ đề.
Loopy avatar
lá cờ cn
Cảm ơn ví dụ thực tế hơn.Cuối cùng, tôi đã gặp khó khăn trong việc tìm ra cách thích hợp để chuyển các giá trị xung quanh cho một biểu mẫu và các thành phần của nó đến nỗi tôi đã từ bỏ và loại bỏ hoàn toàn phương pháp này để thay vào đó chỉ thay đổi mẫu cành cây.
Điểm:3
lá cờ cn

Bạn có thể làm một cái gì đó như thế này:

trong mô-đun mới của bạn my_prerenders Trong my_prerenders/src/ thêm một lớp mới:

không gian tên Drupal\my_prerenders;

sử dụng Drupal\Core\Security\TrustedCallbackInterface;


lớp MyPreRenders triển khai TrustedCallbackInterface {

  /**
   * @inheritDoc
   */
  hàm tĩnh công khai TrustedCallbacks() {
    trả về ['formAlterViewsExposedFormEventsPreRender'];
  }

  hàm công khai formAlterViewsExposedFormEventsPreRender($form) {
    trường $ = [
    'trường_bắt_đầu_ngày_giá_trị',
    'trường_cuối_ngày_giá_trị',
    'trường_địa chỉ_địa phương',
    ];
    foreach ($fields as $field) {
      $form[$field]['#title_display'] = 'sau';
    }
    $form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
    $form['field_event_address_locality']['#suffix'] = '</div>';
    trả về biểu mẫu $;
  }

}

Trong OURTHEME.theme bạn chỉ cần sử dụng:

sử dụng Drupal\my_prerenders\MyPreRenders;

...
...

$form['#pre_render'][] = [MyPreRenders::class, 'formAlterViewsExposedFormEventsPreRender'];

thay vì

$form['#pre_render'][] = 'OURTHEME_form_alter_views_exposed_form_events_pre_render';

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.