Rummage.Phoenix
es un marco de soporte para Phoenix
que se puede utilizar para manipular colecciones Phoenix
y modelos Ecto
con operaciones de búsqueda, clasificación y paginación.
Realiza las operaciones anteriores utilizando Rummage.Ecto
para paginar consultas Ecto
y agrega soporte Phoenix y HTML a vistas y controladores. Para obtener información sobre cómo configurar Rummage.Ecto
visite esta página.
Lo mejor de hurgar es que las tres operaciones: Search
, Sort
y Paginate
se integran perfectamente y se pueden configurar por separado. Para comprobar su integración perfecta, consulte la información a continuación.
NOTA: Rummage
no es como Ransack
y tampoco pretende serlo. No agrega funciones basadas en parámetros de búsqueda. Si desea tener eso para un modelo, siempre puede configurar Rummage
para usar su módulo Search
para ese modelo. Es por eso que Rummage se ha hecho configurable.
¡Busca, ordena y pagina sin problemas en Phoenix!
Está disponible en Hex, el paquete se puede instalar como:
Agregue rummage_phoenix
a su lista de dependencias en mix.exs
:
def deps do
[
{ :rummage_phoenix , "~> 1.2.0" }
]
end
default_per_page
) Rumamge.Phoenix
se puede configurar globalmente con un valor default_per_page
(que se puede anular para un modelo). Esta NO es la forma preferida de configurar default_per_page
ya que podría generar conflictos. Se recomienda hacerlo por modelo como se muestra a continuación en la sección Configuración inicial. Si desea configurar default_per_page
para todos los modelos, agréguelo a la función model
en web.ex
Agregue la configuración rummage_phoenix
a su lista de configuraciones en dev.exs
:
config :rummage_phoenix ,
Rummage.Phoenix ,
default_per_page: 5
Rummage.Controller
en el módulo del controlador: defmodule MyApp.ProductController do
use MyApp.Web , :controller
use Rummage.Phoenix.Controller
# More code below....
end
index
en el controlador: 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
en router.ex
(no es necesario definir la acción): scope "/" , MyApp do
pipe_through :browser # Use the default browser stack
get "/" , PageController , :index
resources "/products" , ProductController
end
Hacer esto por sí mismo le permitirá buscar, ordenar y paginar actualizando params
de la solicitud. Consulte las capturas de pantalla a continuación para obtener más detalles.
Rummage.View
en un módulo de vista: defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View
# More code below...
end
Nota: Si recibe la excepción "MyApp.Router.Helpers no está disponible", puede proporcionarle a su enrutador:
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , helpers: MyApp.Web.Router.Helpers
# More code below...
end
o a través de la configuración:
config :rummage_phoenix, Rummage.Phoenix, [
default_helpers: MyApp.Web.Router.Helpers,
]
Nota: Si el nombre del asistente de ruta es incorrecto, puede especificarlo con:
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , struct: "special_product" # will become special_product_path
# More code below...
end
Agregue esto en la parte inferior de index.html.eex
para representar los enlaces de paginación Rummage
(asegúrese de pasar rummage
a las vistas desde la acción index
en el controlador):
< % = pagination_link ( @ conn , @ rummage ) % >
Vuelve a cargar y así es como debería verse tu página:
Reemplace los encabezados de las tablas en index.html.eex
con enlaces de clasificación (asegúrese de que los encabezados sean columnas reales en la tabla de la base de datos).
Reemplace esto:
< th > Name < / th >
< th > Price < / th >
< th > Category < / th >
Con:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , ci: true ] % > < / th >
< th > < % = sort_link @ conn , @ rummage , [ field: :price ] % > < /th>
O para Ordenar por asociaciones:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , name: "Category Name" , assoc: [ "category" ] ] % > < /th>
Vuelva a cargar y así es como debería verse su página con enlaces ordenables en lugar de solo encabezados de tabla:
NOTA: Actualmente estamos trabajando para agregar mejores elementos a las vistas; pronto la flecha de texto en los enlaces de clasificación será reemplazada por un ícono.
Agregue un formulario de búsqueda en index.html.eex
con campos de búsqueda:
< % = 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" ,
] ) % >
O para Búsqueda por asociaciones:
< % = search_form ( @ conn , @ rummage , [ fields:
[
name: % { label: "Search by Category Name" , search_type: "ilike" , assoc: [ "category" ] }
] , button_class: "btn" ,
] ) % >
Vuelva a cargar y su página debería verse más o menos así:
La mejor parte de Rummage
es que los tres ganchos/operaciones se integran perfectamente sin afectar la funcionalidad de cada uno y, por lo tanto, tienes una página que se parece a esta:
Por defecto
Parámetros de paginación personalizados