Rummage.Phoenix
是Phoenix
的支援框架,可用於透過搜尋、排序和分頁操作來操作Phoenix
集合和Ecto
模型。
它透過使用Rummage.Ecto
來完成上述操作,對Ecto
查詢進行分頁並向視圖和控制器添加 Phoenix 和 HTML 支援。有關如何配置Rummage.Ecto
的信息,請訪問此頁面。
翻閱的最佳部分是所有三個操作: Search
、 Sort
和Paginate
無縫集成,並且可以單獨配置。要查看它們的無縫集成,請查看以下資訊。
註: Rummage
與Ransack
不同,也無意如此。它不會添加基於搜尋參數的功能。如果您希望某個型號具有該功能,您可以隨時將Rummage
配置為使用該模型的Search
模組。這就是 Rummage 變得可設定的原因。
在 Phoenix 中無縫搜尋、排序和分頁!
它以十六進制形式提供,該軟體包可以安裝為:
將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
,請將其加入到web.ex
中的model
函數中
將rummage_phoenix
配置加入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
router.ex
中定義search
路徑(無需定義操作): 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 不可用」異常,您可以提供路由器:
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>
OR 對於按關聯排序:
< 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
最好的部分是,所有三個掛鉤/操作都無縫集成,不會影響彼此的功能,因此,您的頁面看起來有點像這樣:
預設
自訂分頁參數