เรากำลังอัปเกรดไซต์ของเราทีละรายการจาก Drupal 8 เป็น Drupal 9 และมีโค้ดหนึ่งบรรทัดในธีมที่เรากำหนดเองซึ่งเป็นปัญหาสุดท้ายของเรา
เราได้รับข้อผิดพลาดต่อไปนี้ในมุมมองที่ใช้ตัวกรองที่เปิดเผย:
Drupal\Core\Security\UntrustedCallbackException: Render #pre_render callbacks ต้องเป็นเมธอดของคลาสที่ใช้ \Drupal\Core\Security\TrustedCallbackInterface หรือเป็นฟังก์ชันนิรนาม การโทรกลับคือ MYSITE_form_alter_views_exposed_form_MYVIEW_pre_render ดู https://www.drupal.org/node/2966725 ใน Drupal\Core\Render\Renderer->doTrustedCallback() (บรรทัดที่ 96 ของ core/lib/Drupal/Core/Security/DoTrustedCallbackTrait.php)
ในไฟล์ OURTHEME.theme เรามีฟังก์ชันนี้:
/**
* แก้ไขแบบฟอร์มที่กำหนดเองสำหรับกิจกรรม
*/
ฟังก์ชัน OURTHEME_form_alter_views_exposed_form_events_pre_render($form) {
$ฟิลด์ = [
'field_start_date_value',
'field_end_date_value',
'field_address_locality',
];
foreach ($fields เป็น $field) {
$form[$field]['#title_display'] = 'หลังจาก';
}
$form['field_date_range_end_value']['#prefix'] = '<div class="event-exposed-form">';
$form['field_event_address_locality']['#suffix'] = '</div>';
คืนฟอร์ม $;
}
และมีการเรียกใช้ฟังก์ชันที่นี่ (เป็นเพียงส่วนย่อยของโค้ดในฟังก์ชันนี้):
/**
* นี่คือการเปลี่ยนแปลงรูปแบบตัวแปรก่อนที่จะแสดงผล
*/
ฟังก์ชัน OURTHEME_form_alter(&$form, &$form_state, $form_id) {
ถ้า ($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';
}
คืนฟอร์ม $;
}
จากสิ่งที่ฉันสามารถคาดเดาได้จากการวิจัยที่ฉันได้ทำมา ดูเหมือนว่าโดยปกติแล้ว ไม่ว่าคลาสใดก็ตามที่ฟังก์ชันเหล่านี้ถูกใช้งานใน Drupal TrustedCallbackInterface
. โชคไม่ดีที่ฉันพบข้อมูลเดียวจากแพตช์ต่างๆ ที่นำไปใช้กับโครงการใน Drupal.org ดังนั้นฉันจึงพยายามรวบรวมวิธีการจากแอปพลิเคชันแบบสุ่มของมัน
แน่นอนว่ามีหน้า Drupal API แต่นั่นไม่เป็นประโยชน์อย่างยิ่งเมื่อพูดถึงการรวมส่วนต่าง ๆ เข้าด้วยกันเป็นวิธีการที่มีประโยชน์โดยไม่ต้องรู้ API ที่เหลือเหมือนมือคุณ
ไม่มีใครรู้ว่ามีเอกสารใด ๆ เกี่ยวกับวิธีการสมัคร TrustedCallbackInterface
กับฟังก์ชั่นที่เคยใช้งาน $form['#pre_render'][]
โดยเฉพาะอย่างยิ่งใน THEME.theme ซึ่งไม่ได้ตั้งค่าเหมือนกับคลาสที่กำหนดเองแบบเก่าในโมดูล?