ใน 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()แต่ฉันต้องการทำเช่นนี้หากพารามิเตอร์เฉพาะตรงกันเท่านั้น