Score:0

ประสบปัญหาในการกรองมุมมองโดยทางโปรแกรม

ธง jp

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

ตัวกรองของฉันเป็นดังนี้:

(
ประเภทเนื้อหา = contenttype_a
และ
uid(ผู้เขียนโหนด) = */ค่านี้ถูกเพิ่มโดยทางโปรแกรม*/
)

หรือ

(
ประเภทเนื้อหา = contenttype_b
และ
user_target_id(reference) = */ค่านี้ถูกเพิ่มโดยทางโปรแกรม*/
)

กว่าที่ฉันใช้สิ่งนี้ในโมดูลของฉัน:

 */
ฟังก์ชัน entity_access_views_pre_view(ViewExecutable $view, $display_id, อาร์เรย์ &$args){
  $currentUser = \Drupal::currentUser();
  $cuid = $currentUser->id();

    /* @ มุมมองตัวกรอง: สื่อ */
    ถ้า ($view->id() == 'my_view_id') {
      ถ้า ($display_id == 'block_1' || $display_id == 'page_1' || $display_id == 'page_2') {
        $filters = $view->display_handler->getOption('ฟิลเตอร์');
        $filters['uid']['value']['value'] = $cuid;
        $filters['user_target_id']['value']['value'] = $cuid;
        $view->display_handler->overrideOption('ฟิลเตอร์', $ฟิลเตอร์);
      }
    }
}

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

ฉันไม่สามารถใช้ตัวกรองตามบริบท ซึ่งฉันต้องการ เนื่องจากมุมมองแสดงเนื้อหาสองประเภท โดยที่ตัวกรองเนื้อหาแต่ละประเภทควรแตกต่างกัน

ขอบคุณล่วงหน้า.

Score:0
ธง cn

ก่อนอื่น คุณสามารถลองเพิ่มบริบทแคชให้กับองค์ประกอบการแสดงผลของ View ก่อนที่จะแสดงผล:

/**
 * ใช้ hook_views_pre_render()
 *
 */
ฟังก์ชัน mymodule_views_pre_render (ViewExecutable $view) {
  ถ้า ($view->id() == 'my_view_id') {
    ถ้า ($view->current_display == 'block_1') {
      $view->element['#cache']['contexts'][] = 'ผู้ใช้';
      // หรือเพิ่มแคช max-age 0 สำหรับจำนวนผู้ใช้ที่สูง
      $view->element['#cache']['max-age'] = 0;
    }
  }
}

สิ่งนี้ไม่ได้ช่วยอะไรหาก Views กำลังแคชแบบสอบถามเป็นการภายใน จากนั้นคุณสามารถลองปิดใช้งานการแคชโดยกำหนดค่า ไม่มี หรือ ตามเวลา ปลั๊กอินแคชภายในมุมมอง คุณไม่สามารถกำหนดค่าบริบทแคชที่นี่ได้ แต่ให้กำหนดอายุแคชสูงสุดเป็น 0 เท่านั้น ซึ่งไม่ใช่ความคิดที่ไม่ดีเสมอไปหากคุณมีจำนวนผู้ใช้สูงและไม่ต้องการแคชตัวแปรจำนวนเท่ากัน Drupal มีระบบแคชที่ยอดเยี่ยมสำหรับการส่งมอบบล็อกที่ไม่สามารถแคชได้ให้กับผู้ใช้ที่ผ่านการรับรองความถูกต้อง (Dynamic Page Cache + BigPipe)

Joost avatar
jp flag
ขอบคุณ การปิดใช้งานแคชในมุมมองเป็นความพยายามครั้งแรกของฉันในการแก้ปัญหานี้ ตอนนี้ฉันกำลังรอดูว่าจะแก้ปัญหาได้หรือไม่

โพสต์คำตอบ

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