Score:3

การแทนที่สตริงในพารามิเตอร์ตัวกรองบริบทของ Views หรือไม่

ธง nr

ใน Drupal 9 ฉันมี View ที่เรียกว่า ข่าว.

มุมมองจะแสดงที่เส้นทางต่อไปนี้:

/ข่าว

ฉันสามารถแก้ไขได้ตามเส้นทางต่อไปนี้:

/admin/structure/views/view/news/edit

มีตัวกรองบริบทต่อไปนี้:

แหล่งข้อมูลเนื้อหา: ประเภทเนื้อหา

ค่าตัวกรองตามบริบทมีให้โดย URL

เมื่อค่าตัวกรองเป็น ไม่ ใน URL: ให้ค่าเริ่มต้น

พิมพ์: แก้ไขแล้ว

ค่าคงที่: ทั้งหมด

ค่าข้อยกเว้น: ทั้งหมด

หากได้รับค่านี้ ตัวกรองจะถูกละเว้น นั่นคือ "ค่าทั้งหมด"

วิธีนี้ใช้ได้ดีกับเนื้อหาประเภทต่างๆ เช่น บทความ และ โพสต์บล็อก.

เมื่อมุมมองปรากฏขึ้นสำหรับเส้นทาง /หัวข้อข่าวตัวกรองตามบริบทจะแสดงเฉพาะประเภทเนื้อหาเท่านั้น บทความ.

เมื่อมุมมองปรากฏขึ้นสำหรับเส้นทาง /news/blog_postตัวกรองตามบริบทจะแสดงเฉพาะประเภทเนื้อหาเท่านั้น โพสต์บล็อก.

จนถึงตอนนี้ดีมาก

ตอนนี้ไคลเอ็นต์มีประเภทเนื้อหาที่กำหนดเองซึ่งเรียกว่า "วิดีโอ Youtube" พร้อมชื่อเครื่อง youtube_video.

เมื่อมุมมองนี้แสดงขึ้นสำหรับเส้นทาง /news/youtube_video. ตัวกรองบริบทแสดงเฉพาะประเภทเนื้อหา youtube_video.

แต่ลูกค้าต้องการให้เส้นทางเป็น /ข่าว/วิดีโอ.

ตัวเลือกของฉันคืออะไร?

ข้อ จำกัด บางประการ:

  • ลูกค้า อย่างแน่นอน ต้องการให้เส้นทางเป็น /ข่าว/วิดีโอและไม่ใช่สิ่งที่ชอบ /news?type=วิดีโอ.
  • ฉันไม่คิดว่ามันไม่สำคัญที่จะจับคู่ /ข่าว/ฟู และทดแทน บาร์ สำหรับ ฟู เป็นอินพุตสำหรับตัวกรองตามบริบท
  • ฉันรู้วิธีใช้พารามิเตอร์ตำแหน่งในเส้นทาง แต่ฉันไม่คิดว่าฉันจะสามารถแทนที่เส้นทางได้ง่ายๆ เพียงแค่ /ข่าว/ฟู ในขณะที่คงตัวกรองตามบริบทไว้เช่นเดียวกับเนื้อหาประเภทอื่นๆ

ความยืดหยุ่นบางอย่าง:

  • ไซต์ Drupal 9 เป็นเว็บไซต์ใหม่ และฉันกำลังจะย้ายเนื้อหาจาก Drupal 7 ผ่าน Migrate API ดังนั้น เป็นไปได้ เพื่อเปลี่ยนชื่อเครื่องของ youtube_video ประเภทเนื้อหาเป็น วิดีโอ ระหว่างการโยกย้าย จากนั้นมุมมองนี้จะทำงานโดยไม่มีการแก้ไข (ปัญหาคือการหาทุกอย่างอื่นที่อ้างอิงถึงชื่อเครื่อง youtube_video และเปลี่ยนเป็น วิดีโอ เช่นกัน - อาจต้องใช้ความพยายามอย่างมาก)
  • อาจเป็นไปได้ที่จะเปลี่ยนพารามิเตอร์การค้นหาแบบมีเงื่อนไขโดยใช้ hook_views_pre_view() หรือ hook_views_query_alter()แต่ฉันต้องการทำเช่นนี้หากพารามิเตอร์เฉพาะตรงกันเท่านั้น
Score:3
ธง gf

จะ hook_views_pre_view() ทำเคล็ดลับ?

ฟังก์ชัน hook_views_pre_view (ViewExecutable $view, $display_id, อาร์เรย์ &$args) {
  ถ้า ($view->id() == 'my_view' &&
    $display_id == 'my_display' &&
    $args[0] == 'ข่าว' &&
    $args[1] == 'วิดีโอ') {
    $args[1] = 'youtube_video';
  }
}

แทนที่ มุมมองของฉัน และ my_display ด้วยค่าที่เหมาะสม

hotwebmatter avatar
nr flag
Thanks @uberhacker. I accepted your answer, which basically set me on the right path.
Score:1
ธง nr

นี่คือการพิสูจน์แนวคิดการทำงานครั้งแรกของฉันตามคำตอบด้านบน:

/**
 * ใช้ hook_view_pre_view()
 */
ฟังก์ชัน my_module_views_pre_view (ViewExecutable $view, $display_id, array &$args) {
  ถ้า ($view->id() == 'ข่าว' && isset($args[0])) {
    ถ้า ($args[0] == 'วิดีโอ') {
      $args[0] = 'youtube_video';
    }
  }
}

อาร์กิวเมนต์แรกในเส้นทาง /ข่าว/วิดีโอ จริง ๆ แล้วแค่เรียก View with $view_id = 'ข่าว'ดังนั้น พารามิเตอร์ตัวกรองตามบริบทจะไม่เริ่มต้นจนกว่าจะถึงส่วนที่สองในเส้นทางนั้น ซึ่งก็คือ $arg[0].

และสิ่งสำคัญคือต้องตรวจสอบว่า $arg[0] ถูกตั้งค่าก่อนตรวจสอบค่า มิฉะนั้น /ข่าว เส้นทางจะส่งข้อผิดพลาดเมื่อไม่มีการกรองผ่าน

สุดท้าย ในกรณีของฉัน ไม่จำเป็นต้องตรวจสอบเฉพาะเจาะจง $display_idเนื่องจากฉันต้องการให้การแทนที่สตริงเกิดขึ้นสำหรับการแสดงทั้งหมดของมุมมองนี้โดยเฉพาะ

นอกเหนือจากนั้น คำตอบข้างต้นทำให้ถูกต้อง

โพสต์คำตอบ

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