Score:1

วิธีการใหม่สำหรับการแสดงแบบฟอร์มล่วงหน้าเพื่อใช้ TrustedCallbackInterface คืออะไร

ธง cn

เรากำลังอัปเกรดไซต์ของเราทีละรายการจาก 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 ซึ่งไม่ได้ตั้งค่าเหมือนกับคลาสที่กำหนดเองแบบเก่าในโมดูล?

Kevin avatar
in flag
ข้อผิดพลาดอยู่ตรงที่ - คุณกำลังเพิ่มฟังก์ชันให้กับ pre_render ที่ไม่ได้รับการอนุมัติให้เรียกใช้ https://www.drupal.org/node/2966725
Loopy avatar
cn flag
ดังนั้น คำตอบคือ "อย่าพยายามเปลี่ยนรูปแบบการแสดงภาพล่วงหน้า ทำในสิ่งที่ต้องทำด้วยวิธีอื่น" ?
Kevin avatar
in flag
ดูบันทึกการเปลี่ยนแปลงที่เชื่อมโยง
Loopy avatar
cn flag
ไฟล์ .theme ไม่ใช่คลาส ฉันควรสร้างโฟลเดอร์ src ในธีมของฉันและย้ายโค้ดจากไฟล์ .theme ของฉันไปยังการประกาศคลาสใหม่หรือไม่
4uk4 avatar
cn flag
ใช่ ดูตัวอย่าง https://drupal.stackexchange.com/a/300204/47547 สำหรับประเภทการโทรกลับที่แตกต่างกัน แต่จะแสดงคลาสที่ใช้ RenderCallbackInterface ในธีม
Loopy avatar
cn flag
ขอบคุณสำหรับตัวอย่างที่สมจริงยิ่งขึ้นในท้ายที่สุด ฉันมีช่วงเวลาที่ยากลำบากในการหาวิธีที่เหมาะสมในการส่งผ่านค่าต่างๆ สำหรับแบบฟอร์มและองค์ประกอบต่างๆ ของแบบฟอร์ม ซึ่งฉันได้ล้มเลิกและเลิกใช้วิธีการนี้ไปโดยสิ้นเชิง แทนที่จะเปลี่ยนเทมเพลตกิ่งแทน
Score:3
ธง cn

คุณสามารถทำสิ่งนี้:

ในโมดูลใหม่ของคุณ my_prerenders ใน my_prerenders/src/ เพิ่มคลาสใหม่:

เนมสเปซ Drupal\my_prerenders;

ใช้ Drupal\Core\Security\TrustedCallbackInterface;


คลาส MyPreRenders ใช้ TrustedCallbackInterface {

  /**
   * @inheritDoc
   */
  ฟังก์ชันสแตติกสาธารณะ trustCallbacks () {
    กลับ ['formAlterViewsExposedFormEventsPreRender'];
  }

  ฟังก์ชันสาธารณะ formAlterViewsExposedFormEventsPreRender (แบบฟอร์ม $) {
    $ฟิลด์ = [
    '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.theme คุณเพียงแค่ต้องใช้:

ใช้ Drupal\my_prerenders\MyPreRenders;

...
...

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

แทน

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

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา