Rummage.Phoenix
Phoenix
コレクションとEcto
モデルを検索、並べ替え、およびページ付け操作で操作するために使用できるPhoenix
のサポート フレームワークです。
Rummage.Ecto
使用して上記の操作を実行し、 Ecto
クエリをページ分割し、ビューとコントローラーに Phoenix および HTML サポートを追加します。 Rummage.Ecto
の設定方法については、このページを参照してください。
rummage の最も優れた点は、 Search
、 Sort
、 Paginate
3 つの操作がすべてシームレスに統合され、個別に設定できることです。シームレスな統合を確認するには、以下の情報を確認してください。
注: Rummage
Ransack
とは異なりますし、そのつもりもありません。検索パラメータに基づいて関数は追加されません。モデルにそれを使用したい場合は、いつでもそのモデルにSearch
モジュールを使用するようにRummage
設定できます。これが、Rummag が構成可能になった理由です。
フェニックスでシームレスに検索、並べ替え、ページネーションを行います。
これは 16 進数で利用でき、パッケージは次のようにインストールできます。
mix.exs
の依存関係のリストにrummage_phoenix
を追加します。
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
ページネーション リンクをレンダリングします (コントローラーのindex
アクションからビューにrummage
渡していることを確認してください)。
< % = 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>
または、関連付けで並べ替える場合:
< 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
の最も優れた点は、3 つのフック/オペレーションがすべて相互の機能に影響を与えることなくシームレスに統合されるため、次のようなページが表示されることです。
デフォルト
カスタムページネーションパラメータ