Score:0

จะแคช View block ตามภาษาเนื้อหาได้อย่างไร

ธง us

ฉันมีมุมมอง (บล็อก) ที่ง่ายมากเพื่อแสดงรายการชื่อโหนด ข้อมูลพร็อพเพอร์ตี้นี้มีรหัสจากตัวกรองตามบริบทของ URL และตัวกรองเดียวเพื่อกรองภาษาของเนื้อหาที่ตั้งค่าไว้สำหรับหน้า (ตามคำนำหน้า URL) จากนั้นบล็อกนี้จะถูกวางโดยใช้ Layout Builder ในโหมดมุมมองเนื้อหาแบบเต็มสำหรับโหนดประเภทนี้มุมมองถูกกำหนดให้ใช้การแคชตามแท็ก เมื่อฉันสลับหน้าไปมาระหว่างภาษา ภาษาของชื่อเรื่องไม่เปลี่ยนแปลง

การปิดใช้งานการแคชมุมมองจะแก้ไขปัญหานี้

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

จนถึงตอนนี้ฉันได้ลองสิ่งนี้แล้ว:

ฟังก์ชัน mycustom_views_pre_view (ViewExecutable $view, $display_id, อาร์เรย์ &$args) {
  $language_manager = \Drupal::languageManager();
  $langcode = $language_manager->getCurrentLanguage(LanguageInterface::TYPE_CONTENT)->getId();
  ถ้า (isset($view->element['#cache']['contexts']) && is_array($view->element['#cache']['contexts'])) {
    foreach ($view->element['#cache']['contexts'] as $key => $context) {
      ถ้า (stristr($context, 'language_interface')) {
        unset($view->element['#cache']['contexts'][$key]);
      }
    }
    $view->element['#cache']['contexts'][] = 'ภาษา:language_content';
    $view->element['#cache']['tags'][] = 'ภาษา:' $langcode;
  }
}

สิ่งนี้ดูเหมือนจะไม่ช่วยอะไร

เป็นไปได้ไหมที่ฉันแก้ไขการแคชมุมมองแล้ว แต่บล็อกยังคงแคชไม่ถูกต้อง

Score:1
ธง cn

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

/**
 * ใช้ hook_preprocess_views_view_field()
 */
ฟังก์ชัน mymodule_preprocess_views_view_field (อาร์เรย์ &$ตัวแปร) {
  // กำหนดเป้าหมายมุมมองและฟิลด์เฉพาะ
  $variables['#cache']['contexts'][] = language:language_content';
}
Score:0
ธง de

คุณสามารถเพิ่มคลาสแบ็กเอนด์สำหรับบล็อก จากนั้นเพิ่มบริบทแคชเกี่ยวกับภาษาลงในบล็อกนั้น

ขั้นแรก คุณต้องได้รับคีย์การกำหนดค่าสำหรับบล็อกการดู ฉันเชื่อว่ามันเป็น views.view.[BLOCK_ID]. คุณสามารถรับรหัสบล็อกได้ในส่วนขั้นสูงของมุมมอง

ต่อไป คุณเพิ่มคลาสที่กำหนดเองลงในบล็อก นี่คือวิธีการดำเนินการสำหรับบล็อกการสร้างตราสินค้าของระบบ

/**
 * ใช้ hook_block_alter()
 *
 * เปลี่ยนคลาสสำหรับบล็อกการสร้างตราสินค้าของระบบเพื่อเพิ่มแคช
 * บริบทสำหรับภาษา
 */
ฟังก์ชัน [MODULE]_block_alter(อาร์เรย์ &$definitions) {
  // ตั้งค่าการโทรกลับแบบกำหนดเองสำหรับบล็อกเมนูระบบ
  $definitions['system_branding_block']['class'] = 'Drupal\[MODULE]\Plugin\Block\SystemBrandingBlockOverride';
}

จากนั้นคุณสามารถเพิ่มบริบทแคชในภาษาในชั้นเรียน:

เนมสเปซ Drupal\[MODULE]\Plugin\Block;

ใช้ Drupal\system\Plugin\Block\SystemBrandingBlock

/**
 * เพิ่มการแคชกลุ่มให้กับบล็อกการสร้างตราสินค้าของระบบ
 */
คลาส SystemBrandingBlockOverride ขยาย SystemBrandingBlock {

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นสาธารณะ getCacheContexts () {
    $contexts = parent::getCacheContexts();

    $contexts[] = 'ภาษา';

    ส่งคืน $contexts;
  }

}

โปรดทราบว่าคุณอาจต้องการใช้หนึ่งในบริบทของแคชต่อไปนี้แทน:

  • ภาษา:language_interface
  • ภาษา:language_content
liquidcms avatar
us flag
จะไม่แปลกใจถ้ายังใช้งานได้ แต่คำตอบของ 4k4 คือ 1 บรรทัด - ดังนั้นเลือกอันนั้น
Jaypan avatar
de flag
หากผลงานของเขาดีขึ้น!
4uk4 avatar
cn flag
บล็อกการสร้างตราสินค้าของระบบเป็นบล็อกหลักเดียวที่ฉันรู้จักซึ่งไม่แสดงเนื้อหาของบล็อก คุณไม่ต้องการวิธีแก้ปัญหานี้สำหรับบล็อกอื่นๆ ในทางตรงกันข้าม มักจะใช้ไม่ได้กับเนื้อหาที่แสดงผล โดยทั่วไปเป็นวิธีที่ดีที่สุดในการเพิ่มข้อมูลเมตาของแคชลงในเนื้อหาที่ละเอียดที่สุดที่เป็นของข้อมูลนั้นและปล่อยให้มันฟองขึ้น

โพสต์คำตอบ

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