Score:1

วิธีป้องกันการเปลี่ยนธีมที่เกิดจาก $rendererService->renderPlain()

ธง ru

ฉันกำลังพยายามใช้ผลลัพธ์จากตัวจัดรูปแบบฟิลด์ที่ปรับแต่งอย่างหนักอีกครั้งเป็น <select><option> ข้อความในเว็บฟอร์ม ฉันสามารถใช้การแสดงฟิลด์ซ้ำได้ แต่มีผลข้างเคียงจากการสลับธีมที่ใช้สำหรับการแสดงผล

ด้านล่างนี้เป็นรหัสแบบง่าย บรรทัด $dateRenderArray = ... และ $dateHtml = ... เป็นต้นฉบับและเป็นสาเหตุของปัญหา:

ฟังก์ชัน mymodule_webform_options_alter (อาร์เรย์ &$ตัวเลือก อาร์เรย์ &$องค์ประกอบ $options_id = NULL) {
  foreach (ตัวเลือก $ เป็น $value => $text) {
    $entity = getEntityByOption($value);

    // ใช้เอาต์พุตตัวจัดรูปแบบฟิลด์ที่กำหนดเองซ้ำ
    $dateRenderArray = $entity->get('field_daterange')->view('ทีเซอร์');

    // บรรทัดต่อไปนี้ทำให้เกิดการเปลี่ยนธีม
    $dateHtml = \Drupal::service('renderer')->renderPlain($dateRenderArray);

    $datePlaintext = str_replace(["\n", " "], ["", " "], ตัดแต่ง(strip_tags($dateHtml)));
    $muchBetterOptionText = $someOtherPlaintextFromEntity ' ' . $date ข้อความธรรมดา;
    $options[$value] = $muchBetterOptionText;
  }
}

วิธีนี้ใช้งานได้ดีในฟอร์มส่วนหน้าสำหรับอีเมลที่ส่งและในรายการการส่งฟอร์มเว็บของผู้ดูแลระบบ

แต่ในมุมมองรายละเอียดการส่งเว็บฟอร์มเดียว บรรทัดเหล่านั้นทำให้เกิดการเปลี่ยนธีมที่ไม่ต้องการจากธีมผู้ดูแลระบบเป็นธีมส่วนหน้า

คำถาม:
ฉันจะป้องกันไม่ให้เปลี่ยนธีมได้อย่างไร เรนเดอร์ธรรมดา() และเก็บธีมผู้ดูแลระบบไว้เมื่อดูการส่งเว็บฟอร์มเดียว

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

4uk4 avatar
cn flag
โดยปกติจะไม่มีการสลับธีมภายในคำขอ ชุดรูปแบบมีการเจรจาทั่วโลกสำหรับคำขอทั้งหมด ฉันเดาว่าน่าจะมีสองคำขอ คำขอหนึ่งแสดงเนื้อหาและคำขอหนึ่งเรียกเบ็ด คุณสามารถตรวจสอบชื่อเส้นทางสำหรับทั้งสองได้หรือไม่? หากคุณมีสองเส้นทางที่แตกต่างกัน ให้ตรวจสอบข้อกำหนดแต่ละข้อสำหรับการเจรจาธีมของผู้ดูแลระบบ หากจำเป็นให้ใช้ผู้เจรจาต่อรองของคุณเองสำหรับคำขอครั้งที่สอง ดู https://drupal.stackexchange.com/questions/281447/themenegotiator-not-working-for-admin-pages
Score:1
ธง ru

พบว่ามีตรรกะเฉพาะ Webform บางอย่างที่เกี่ยวข้อง (@see เอนทิตี WebformSubmission โดยใช้ก ธีมที่กำหนดเองและตรรกะการเรนเดอร์).

การแสดงผลแบบกำหนดเองของฉันทำให้ตรรกะของเว็บฟอร์มสับสน ฉันเปลี่ยนไปใช้ตัวเรนเดอร์ของ Webform และบังคับใช้ธีมผู้ดูแลระบบหลังจากเรนเดอร์แบบกำหนดเองของฉัน

ฟังก์ชัน mymodule_webform_options_alter (อาร์เรย์ &$ตัวเลือก อาร์เรย์ &$องค์ประกอบ $options_id = NULL) {
  // บริการเรนเดอร์ของ webform
  $webformRenderer = \Drupal::service('webform.theme_manager');

  foreach (ตัวเลือก $ เป็น $value => $text) {
    $entity = getEntityByOption($value);

    // ใช้เอาต์พุตตัวจัดรูปแบบฟิลด์ที่กำหนดเองซ้ำ
    $dateRenderArray = $entity->get('field_daterange')->view('ทีเซอร์');

    // บรรทัดต่อไปนี้ทำให้เกิดการเปลี่ยนแปลงธีมบนเส้นทาง entity.webform_submission.canonical
    $dateHtml = $webformRenderer->renderPlain($dateRenderArray);

    $datePlaintext = str_replace(["\n", " "], ["", " "], ตัดแต่ง(strip_tags($dateHtml)));
    $muchBetterOptionText = $someOtherPlaintextFromEntity ' ' . $date ข้อความธรรมดา;
    $options[$value] = $muchBetterOptionText;
  }

  // ชื่อเส้นทางเป็นโมฆะ ต้องใช้คำขอแทน
  ถ้า (strpos(\Drupal::request()->getRequestUri(), '/admin/structure/webform/manage/MY_WEBFORM_ID/submission/') === 0) {
    //เฉพาะผู้ดูแลระบบเท่านั้นที่สามารถดูการส่งเว็บฟอร์มได้
    $webformRenderer->setCurrentTheme(\Drupal::config('system.theme')->get('admin'));
  }
}

ดูแฮ็คเล็กน้อย แต่ก็ใช้กลอุบาย

โพสต์คำตอบ

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