Rummage.Phoenix
— это платформа поддержки Phoenix
, которую можно использовать для управления коллекциями Phoenix
и моделями Ecto
с помощью операций поиска, сортировки и разбивки на страницы.
Он выполняет вышеуказанные операции с помощью Rummage.Ecto
для разбивки запросов Ecto
на страницы и добавляет поддержку Phoenix и HTML в представления и контроллеры. Для получения информации о том, как настроить Rummage.Ecto
посетите эту страницу.
Самое приятное в рыться то, что все три операции: Search
, Sort
и Paginate
легко интегрируются и могут быть настроены отдельно. Чтобы проверить их бесшовную интеграцию, пожалуйста, проверьте информацию ниже.
ПРИМЕЧАНИЕ. Rummage
не похож на Ransack
и не собирается им быть. Он не добавляет функции на основе параметров поиска. Если вы хотите использовать это для модели, вы всегда можете настроить Rummage
на использование вашего модуля Search
для этой модели. Вот почему Rummage стал настраиваемым.
Ищите, сортируйте и разбивайте на страницы без проблем в Phoenix!
Он доступен в Hex, пакет можно установить как:
Добавьте 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
для всех моделей, добавьте его в функцию model
в web.ex
Добавьте конфигурацию 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
search
в файле router.ex
(действие определять не нужно): 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>
ИЛИ для сортировки по ассоциациям:
< 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
то, что все три перехватчика/операции легко интегрируются, не влияя на функциональность друг друга, и поэтому ваша страница выглядит примерно так:
По умолчанию
Пользовательские параметры нумерации страниц