Rummage.Phoenix
est un framework de support pour Phoenix
qui peut être utilisé pour manipuler les collections Phoenix
et les modèles Ecto
avec des opérations de recherche, de tri et de pagination.
Il accomplit les opérations ci-dessus en utilisant Rummage.Ecto
, pour paginer les requêtes Ecto
et ajoute la prise en charge de Phoenix et HTML aux vues et aux contrôleurs. Pour plus d’informations sur la configuration de Rummage.Ecto
visitez cette page.
L’avantage de fouiller est que les trois opérations : Search
, Sort
et Paginate
s’intègrent de manière transparente et peuvent être configurées séparément. Pour vérifier leur intégration transparente, veuillez vérifier les informations ci-dessous.
REMARQUE : Rummage
n'est pas comme Ransack
et n'a pas l'intention de l'être non plus. Il n'ajoute pas de fonctions basées sur les paramètres de recherche. Si vous souhaitez avoir cela pour un modèle, vous pouvez toujours configurer Rummage
pour utiliser votre module Search
pour ce modèle. C'est pourquoi Rummage a été rendu configurable.
Recherchez, triez et paginez en toute transparence dans Phoenix !
Ceci est disponible en Hex, le package peut être installé comme :
Ajoutez rummage_phoenix
à votre liste de dépendances dans mix.exs
:
def deps do
[
{ :rummage_phoenix , "~> 1.2.0" }
]
end
default_per_page
) Rumamge.Phoenix
peut être configuré globalement avec une valeur default_per_page
(qui peut être remplacée pour un modèle). Ce n'est PAS la manière préférée de définir default_per_page
car cela pourrait entraîner des conflits. Il est recommandé de le faire par modèle, comme indiqué ci-dessous dans la section Configuration initiale. Si vous souhaitez définir default_per_page
pour tous les modèles, ajoutez-le à la fonction model
dans web.ex
Ajoutez la configuration rummage_phoenix
à votre liste de configurations dans dev.exs
:
config :rummage_phoenix ,
Rummage.Phoenix ,
default_per_page: 5
Rummage.Controller
dans le module de contrôleur : defmodule MyApp.ProductController do
use MyApp.Web , :controller
use Rummage.Phoenix.Controller
# More code below....
end
index
dans le contrôleur : 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
dans le router.ex
(pas besoin de définir l'action) : scope "/" , MyApp do
pipe_through :browser # Use the default browser stack
get "/" , PageController , :index
resources "/products" , ProductController
end
Faire cela lui-même vous permettra de rechercher, trier et paginer en mettant à jour params
de la demande. Veuillez vérifier les captures d'écran ci-dessous pour plus de détails
Rummage.View
dans un module d'affichage : defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View
# More code below...
end
Remarque : Si vous obtenez une exception « MyApp.Router.Helpers n'est pas disponible », vous pouvez fournir à votre routeur :
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , helpers: MyApp.Web.Router.Helpers
# More code below...
end
ou via la config :
config :rummage_phoenix, Rummage.Phoenix, [
default_helpers: MyApp.Web.Router.Helpers,
]
Remarque : Si le nom de l'assistant de chemin est incorrect, vous pouvez le spécifier avec :
defmodule MyApp.ProductView do
use MyApp.Web , :view
use Rummage.Phoenix.View , struct: "special_product" # will become special_product_path
# More code below...
end
Ajoutez ceci au bas de index.html.eex
pour afficher les liens de pagination Rummage
(assurez-vous de transmettre rummage
aux vues à partir de l'action index
dans le contrôleur) :
< % = pagination_link ( @ conn , @ rummage ) % >
Rechargez et voici à quoi devrait ressembler votre page :
Remplacez les en-têtes de tableau sur index.html.eex
par des liens de tri (assurez-vous que les en-têtes sont de véritables colonnes du tableau de la base de données.)
Remplacez ceci :
< th > Name < / th >
< th > Price < / th >
< th > Category < / th >
Avec:
< th > < % = sort_link @ conn , @ rummage , [ field: :name , ci: true ] % > < / th >
< th > < % = sort_link @ conn , @ rummage , [ field: :price ] % > < /th>
OU pour Trier par associations :
< th > < % = sort_link @ conn , @ rummage , [ field: :name , name: "Category Name" , assoc: [ "category" ] ] % > < /th>
Rechargez et voici à quoi devrait ressembler votre page avec des liens triables au lieu de simplement des en-têtes de tableau :
REMARQUE : Nous travaillons actuellement sur l'ajout de meilleurs éléments aux vues, bientôt la flèche de texte dans les liens de tri sera remplacée par une icône.
Ajoutez un formulaire de recherche dans index.html.eex
avec des champs consultables :
< % = 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 pour Recherche par associations :
< % = search_form ( @ conn , @ rummage , [ fields:
[
name: % { label: "Search by Category Name" , search_type: "ilike" , assoc: [ "category" ] }
] , button_class: "btn" ,
] ) % >
Rechargez et votre page devrait ressembler à ceci :
La meilleure partie de Rummage
est que les trois hooks/opérations s'intègrent de manière transparente sans affecter les fonctionnalités de chacun et, par conséquent, vous avez une page ressemblant un peu à ceci :
Défaut
Paramètres de pagination personnalisés