Rummage.Phoenix
เป็นเฟรมเวิร์กการสนับสนุนสำหรับ Phoenix
ที่สามารถใช้เพื่อจัดการคอลเลกชัน Phoenix
และโมเดล Ecto
ด้วยการดำเนินการค้นหา เรียงลำดับ และแบ่งหน้า
ดำเนินการข้างต้นให้สำเร็จโดยใช้ Rummage.Ecto
เพื่อแบ่งหน้าคิวรี Ecto
และเพิ่มการสนับสนุน Phoenix และ HTML ให้กับมุมมองและตัวควบคุม สำหรับข้อมูลเกี่ยวกับวิธีการกำหนดค่า Rummage.Ecto
โปรดไปที่หน้านี้
ส่วนที่ดีที่สุดเกี่ยวกับการค้นหาคือการดำเนินการทั้งสามรายการ: Search
, Sort
และ Paginate
ผสานรวมได้อย่างราบรื่นและสามารถกำหนดค่าแยกกันได้ หากต้องการตรวจสอบการผสานรวมที่ราบรื่น โปรดตรวจสอบข้อมูลด้านล่าง
หมายเหตุ: Rummage
ไม่เหมือนกับ Ransack
และไม่ได้ตั้งใจที่จะเป็นเช่นนั้น ไม่เพิ่มฟังก์ชันตามพารามิเตอร์การค้นหา หากคุณต้องการให้มีสิ่งนั้นสำหรับโมเดล คุณสามารถกำหนดค่า Rummage
เพื่อใช้โมดูล Search
สำหรับโมเดลนั้นได้ตลอดเวลา นี่คือเหตุผลว่าทำไม Rummage จึงถูกกำหนดค่าได้
ค้นหา จัดเรียง และแบ่งหน้าได้อย่างราบรื่นใน Phoenix!
มีอยู่ใน Hex สามารถติดตั้งแพ็คเกจได้ดังนี้:
เพิ่ม rummage_phoenix
ในรายการการพึ่งพาของคุณใน mix.exs
:
def deps do
[
{ :rummage_phoenix , "~> 1.2.0" }
]
end
default_per_page
) Rumamge.Phoenix
สามารถกำหนดค่าได้ทั่วโลกด้วยค่า default_per_page
(ซึ่งสามารถแทนที่สำหรับโมเดลได้) นี่ ไม่ใช่ วิธีที่แนะนำในการตั้งค่า default_per_page
เนื่องจากอาจทำให้เกิดข้อขัดแย้งได้ ขอแนะนำให้ทำต่อรุ่นดังแสดงด้านล่างในส่วนการตั้งค่าเริ่มต้น หากคุณต้องการตั้ง default_per_page
สำหรับโมเดลทั้งหมด ให้เพิ่มลงในฟังก์ชัน model
ใน web.ex
เพิ่ม rummage_phoenix
config ไปยังรายการการกำหนดค่าของคุณใน dev.exs
:
config :rummage_phoenix ,
Rummage.Phoenix ,
default_per_page: 5
Rummage.Controller
ในโมดูลคอนโทรลเลอร์: defmodule MyApp.ProductController do
use MyApp.Web , :controller
use Rummage.Phoenix.Controller
# More code below....
end
index
ในคอนโทรลเลอร์: def index ( conn , params ) do
{ query , rummage } = Product
|> Rummage.Ecto . rummage ( params [ "rummage" ] )
products = Repo . all ( query )
render conn , "index.html" ,
products: products ,
rummage: rummage
end
search
ใน router.ex
(ไม่จำเป็นต้องกำหนดการกระทำ): scope "/" , MyApp do
pipe_through :browser # Use the default browser stack
get "/" , PageController , :index
resources "/products" , ProductController
end
การทำเช่นนี้จะทำให้คุณสามารถค้นหา จัดเรียง และแบ่งหน้าโดยการอัปเดต params
ตามคำขอ โปรดตรวจสอบภาพหน้าจอด้านล่างเพื่อดูรายละเอียด
Rummage.View
ในโมดูลมุมมอง: defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View
# More code below...
end
หมายเหตุ: หากคุณได้รับข้อยกเว้น "MyApp.Router.Helpers is not available" คุณสามารถจัดเตรียมเราเตอร์ของคุณได้:
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , helpers: MyApp.Web.Router.Helpers
# More code below...
end
หรือผ่านการกำหนดค่า:
config :rummage_phoenix, Rummage.Phoenix, [
default_helpers: MyApp.Web.Router.Helpers,
]
หมายเหตุ: หากชื่อตัวช่วยพาธไม่ถูกต้อง คุณสามารถระบุได้ด้วย:
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , struct: "special_product" # will become special_product_path
# More code below...
end
เพิ่มสิ่งนี้ที่ด้านล่างของ index.html.eex
เพื่อแสดงลิงก์การแบ่งหน้า Rummage
(ตรวจสอบให้แน่ใจว่าคุณส่ง rummage
ไปยังมุมมองจากการดำเนินการ index
ในคอนโทรลเลอร์):
< % = pagination_link ( @ conn , @ rummage ) % >
โหลดซ้ำและหน้าเว็บของคุณควรมีลักษณะดังนี้:
แทนที่ส่วนหัวของตารางบน index.html.eex
ด้วยลิงก์การเรียงลำดับ (ตรวจสอบให้แน่ใจว่าส่วนหัวเป็นคอลัมน์จริงในตารางในฐานข้อมูล)
แทนที่สิ่งนี้:
< th > Name < / th >
< th > Price < / th >
< th > Category < / th >
กับ:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , ci: true ] % > < / th >
< th > < % = sort_link @ conn , @ rummage , [ field: :price ] % > < /th>
หรือสำหรับการจัดเรียงตามสมาคม:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , name: "Category Name" , assoc: [ "category" ] ] % > < /th>
โหลดซ้ำและนี่คือลักษณะที่หน้าเว็บของคุณควรมีลักษณะพร้อมลิงก์ที่จัดเรียงได้ แทนที่จะเป็นเพียงส่วนหัวของตาราง:
หมายเหตุ: ขณะนี้กำลังดำเนินการเพื่อเพิ่มองค์ประกอบที่ดีขึ้นให้กับมุมมอง เร็วๆ นี้ลูกศรข้อความในลิงก์การเรียงลำดับจะถูกแทนที่ด้วยไอคอน
เพิ่มแบบฟอร์มการค้นหาใน index.html.eex
ด้วยฟิลด์ที่ค้นหาได้:
< % = search_form ( @ conn , @ rummage , [ fields:
[
name: % { label: "Search by Product Name" , search_type: "ilike" } ,
price: % { label: "Search by Price" , search_type: "eq" } ,
] , button_class: "btn" ,
] ) % >
หรือสำหรับการค้นหาตามสมาคม:
< % = search_form ( @ conn , @ rummage , [ fields:
[
name: % { label: "Search by Category Name" , search_type: "ilike" , assoc: [ "category" ] }
] , button_class: "btn" ,
] ) % >
โหลดซ้ำและหน้าของคุณควรมีลักษณะดังนี้:
ส่วนที่ดีที่สุดเกี่ยวกับ Rummage
ก็คือ hooks/การดำเนินการทั้งสามนั้นผสานรวมได้อย่างราบรื่นโดยไม่กระทบต่อฟังก์ชันการทำงานของกันและกัน ดังนั้น คุณจึงมีเพจที่มีลักษณะดังนี้:
ค่าเริ่มต้น
พารามิเตอร์การแบ่งหน้าแบบกำหนดเอง