Score:1

ไม่สามารถตั้งค่าตัวกรองเปิดเผยโดยทางโปรแกรมได้เมื่อใช้ตัวกรองตามบริบท

ธง ru

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

ฟังก์ชัน MYMODULE_views_pre_build(\Drupal\views\ViewExecutable $view) {
  ถ้า ($view->current_display !== 'MY_VIEW_DISPLAY') {
    กลับ;
  }
  $exposedFilterValues ​​= $view->getExposedInput();
  ถ้า (!array_key_exists('MY_FIELD', $exposedFilterValues)) {
    $personalizedDefaultValue = $someUserEntity->getMyCustomDefaultFilterValue();
    $view->setExposedInput(array_merge($exposedFilterValues, ['MY_FIELD' => $personalizedDefaultValue] );
    $view->element['#cache']['tags'] = Cache::mergeTags($view->element['#cache']['tags'] ?? [], $someUserEntity->getCacheTags() );
  }
}

แต่:

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

เหตุใดโค้ดสำหรับฟิลด์ที่เปิดเผยจึงไม่ทำงานเมื่อมีค่าตามบริบทของฟิลด์ที่แตกต่างกันโดยสิ้นเชิง

sonfd avatar
in flag
เมื่อคุณพูดว่าโค้ดนี้ดำเนินการ คุณหมายถึงโค้ดที่อยู่ในคำสั่ง if นี้หรือไม่: `if (!array_key_exists('MY_FIELD', $exposedFilterValues))` ฉันสงสัยว่าตัวกรองที่เปิดเผยของคุณได้รับค่า (สตริงว่าง) เมื่อมีตัวกรองตามบริบทหรือไม่ - ตัวกรองตามบริบทอาจทริกเกอร์การประมวลผลตัวกรองบางอย่างที่จะไม่เกิดขึ้นในขั้นตอนนี้
ru flag
การใช้เบรกพอยต์ xdebug ฉันได้ตรวจสอบแล้วว่า `setExposedInput()` ภายใน `if(!array_key_exists)` ดำเนินการอย่างถูกต้องในทั้งสองกรณี
Pushpinder Rana avatar
us flag
ตรวจสอบให้แน่ใจว่าแบบสอบถาม Views ไม่ได้รับการเปลี่ยนแปลงหลังจากโค้ดที่กำหนดเองของคุณ เนื่องจาก hook views_query_alter() ทำงานหลังจาก views_pre_build()
sonfd avatar
in flag
ตกลง นี่คือสิ่งที่ฉันทำเพื่อทดสอบ: ฉันสร้างมุมมองที่มีตัวกรองเปิดเผย "my_filter" จากนั้นฉันสร้าง `mymodule_views_pre_build()` ด้วยโค้ดหนึ่งบรรทัด: `$view->setExposedInput(['my_filter' => 'test']);` ฉันโหลดมุมมองและพบว่าตัวกรองที่เปิดเผยของฉันถูกตั้งค่าเป็น "ทดสอบ" จากนั้นฉันอัปเดตมุมมองของฉันด้วยตัวกรองตามบริบทของ Content ID และบันทึกเฉพาะการกำหนดค่าเริ่มต้น จากนั้นฉันโหลดมุมมองของฉันอีกครั้ง และตัวกรองที่เปิดเผยของฉันยังคงตั้งค่าเป็น "ทดสอบ" ฉันยังทดสอบด้วยค่าสำหรับตัวกรองบริบทของฉันใน URL และดูว่าตัวกรองที่เปิดเผยยังคงตั้งค่าเป็น "ทดสอบ"
sonfd avatar
in flag
นอกจากนี้ คุณจะต้องเพิ่มบริบทแคชสำหรับผู้ใช้ของคุณ เนื่องจากคุณกำลังเปลี่ยนแปลงผลลัพธ์ต่อผู้ใช้ เมื่อคุณตั้งค่าการแคชแล้ว ระบบจะแคชสำหรับผู้ใช้รายแรก จากนั้นจึงล้างข้อมูลเมื่อผู้ใช้รายนั้นอัปเดต แต่จะไม่แตกต่างกันไปตามผู้ใช้แต่ละราย
ru flag
รหัสใช้งานได้กับการติดตั้งวานิลลา Drupal ต้องมีปัญหากับโมดูลส่วนร่วม ไม่ทราบว่าจะหาได้อย่างไรมี _a lot_ ของโมดูลที่กำหนดเองในโครงการนี้ :-(
Pushpinder Rana avatar
us flag
คุณลองตรวจสอบ Views hooks อื่น ๆ (เช่น views_query_alter()) ในโมดูลที่กำหนดเองของคุณแล้วหรือยัง เปิดใช้งานการดีบักและคัดแยกโค้ดโดยใช้ debug_backtrace คุณควรระบุโมดูลอื่นที่มีผลเหนือการเปลี่ยนแปลงนี้ คุณสามารถทดสอบได้โดยใช้รายการเหตุการณ์/ตะขอของ Devel (Admin UI) ที่ให้รายการฟังก์ชันที่ดำเนินการทั้งหมดสำหรับแต่ละคำขอ หวังว่ามันจะช่วยได้

โพสต์คำตอบ

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