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
最好的部分是,所有三个挂钩/操作都无缝集成,不会影响彼此的功能,因此,您的页面看起来有点像这样:
默认
自定义分页参数