Rummage.Phoenix
é uma estrutura de suporte para Phoenix
que pode ser usada para manipular coleções Phoenix
e modelos Ecto
com operações de Pesquisa, Classificação e Paginação.
Ele realiza as operações acima usando Rummage.Ecto
, para paginar consultas Ecto
e adiciona suporte Phoenix e HTML a visualizações e controladores. Para obter informações sobre como configurar Rummage.Ecto
visite esta página.
A melhor parte do rummage é que todas as três operações: Search
, Sort
e Paginate
se integram perfeitamente e podem ser configuradas separadamente. Para verificar sua integração perfeita, verifique as informações abaixo.
NOTA: Rummage
não é como Ransack
e também não pretende ser. Não adiciona funções baseadas em parâmetros de pesquisa. Se quiser ter isso para um modelo, você sempre pode configurar Rummage
para usar seu módulo Search
para esse modelo. É por isso que o Rummage se tornou configurável.
Pesquise, classifique e paginate perfeitamente no Phoenix!
Está disponível em Hex, o pacote pode ser instalado como:
Adicione rummage_phoenix
à sua lista de dependências em mix.exs
:
def deps do
[
{ :rummage_phoenix , "~> 1.2.0" }
]
end
default_per_page
) Rumamge.Phoenix
pode ser configurado globalmente com um valor default_per_page
(que pode ser substituído por um modelo). Esta NÃO é a forma preferida de definir default_per_page
, pois pode levar a conflitos. Recomenda-se fazer isso por modelo conforme mostrado abaixo na seção Configuração Inicial. Se você deseja definir default_per_page
para todos os modelos, adicione-o à função model
em web.ex
Adicione a configuração rummage_phoenix
à sua lista de configurações em dev.exs
:
config :rummage_phoenix ,
Rummage.Phoenix ,
default_per_page: 5
Rummage.Controller
no módulo controlador: defmodule MyApp.ProductController do
use MyApp.Web , :controller
use Rummage.Phoenix.Controller
# More code below....
end
index
no 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
no router.ex
(não há necessidade de definir a ação): scope "/" , MyApp do
pipe_through :browser # Use the default browser stack
get "/" , PageController , :index
resources "/products" , ProductController
end
Fazer isso permitirá que você pesquise, classifique e paginate atualizando params
na solicitação. Por favor, verifique as capturas de tela abaixo para obter detalhes
Rummage.View
em um módulo de visualização: defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View
# More code below...
end
Nota: Se você receber uma exceção "MyApp.Router.Helpers não está disponível", poderá fornecer ao seu roteador:
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , helpers: MyApp.Web.Router.Helpers
# More code below...
end
ou através da configuração:
config :rummage_phoenix, Rummage.Phoenix, [
default_helpers: MyApp.Web.Router.Helpers,
]
Nota: Se o nome do auxiliar de caminho estiver incorreto, você poderá especificá-lo com:
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , struct: "special_product" # will become special_product_path
# More code below...
end
Adicione isto na parte inferior de index.html.eex
para renderizar links de paginação Rummage
(certifique-se de passar rummage
para as visualizações a partir da ação index
no controlador):
< % = pagination_link ( @ conn , @ rummage ) % >
Recarregue e esta é a aparência da sua página:
Substitua os cabeçalhos da tabela em index.html.eex
por links de classificação (certifique-se de que os cabeçalhos sejam colunas reais na tabela do banco de dados).
Substitua isto:
< th > Name < / th >
< th > Price < / th >
< th > Category < / th >
Com:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , ci: true ] % > < / th >
< th > < % = sort_link @ conn , @ rummage , [ field: :price ] % > < /th>
OU para classificar por associações:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , name: "Category Name" , assoc: [ "category" ] ] % > < /th>
Recarregue e é assim que sua página deve ficar com links classificáveis em vez de apenas cabeçalhos de tabela:
NOTA: Atualmente trabalhando para adicionar elementos melhores às visualizações, em breve a seta de texto nos links de classificação será substituída por um ícone
Adicione um formulário de pesquisa em index.html.eex
com campos pesquisáveis:
< % = 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" ,
] ) % >
OU para Pesquisa por associações:
< % = search_form ( @ conn , @ rummage , [ fields:
[
name: % { label: "Search by Category Name" , search_type: "ilike" , assoc: [ "category" ] }
] , button_class: "btn" ,
] ) % >
Recarregue e sua página deverá ficar mais ou menos assim:
A melhor parte do Rummage
é que todos os três ganchos/operações se integram perfeitamente sem afetar a funcionalidade um do outro e, portanto, você tem uma página parecida com esta:
Padrão
Parâmetros de paginação personalizados