Рендеринг динамического контента на странице CMS
Мне нужно визуализировать динамический контент (результат поиска предложений) на странице CMS Alchemy.
Сначала я создал в cms-backend страницу под названием "searchresult".
Я сделал элемент без сущностей. Стол должен быть представлен.
Seachform имеет в качестве действия /searchresult
и страница вызывается с параметрами (get) -search:
/searchresult?utf8=✓&searchmaingroup=bb&searchprofgroup=4100
Но где я могу собрать данные для этого?
Я попытался page_layout с опцией конфигурации "контроллер" и "действие" на собственный контроллер
- name: offersearch
elements: [header, resulttable]
autogenerate: [header, resulttable]
controller: offers
action: index
cache: false
контроллер:
OffersController < Alchemy::BaseController
def index
end
end
Но это все равно делает перенаправление на этот контроллер, и параметры поиска теряются.
Есть ли какой-нибудь "хук" в cms Алхимии, где я могу поймать searchparams и заполнить переменную как:
@offers = Offer.where(...)
и принять это к элементу страницы cms (view-part)
Я попытался найти решение здесь: Создание настраиваемого модуля Гостевая книга для Alchemy CMS
Но это, к сожалению, не достаточно полно для меня. (Пользовательский модуль предложений в моей CMS работает нормально.)
2 ответа
В качестве примечания: Вы видели алхимический камень хорька? (В старых версиях Alchemy это встроенная функция). EssenceText
а также EssenceRichtext
(если вы не выключаете его для определенных вещей), но, возможно, стоит посмотреть.
Я предпочитаю не полагаться на имена URL-адресов страниц, как вы указали имя в маршрутах, потому что другие редакторы контента могут легко переименовать эту страницу или создать ее в другом языковом дереве с неправильным именем.
Вместо этого я бы определил page_layout, который используется только для результатов поиска.
# config/alchemy/page_layouts.yml
- name: searchresults
elements: [offer_searchresults]
unique: true
cache: false
Тогда вы можете расширить существующие Alchemy::Page
класс с вашим методом обработки поиска:
# app/controllers/alchemy/pages_controller_ext.rb
module Alchemy
PagesController.class_eval do
before_filter :set_searchresult_page, :only => :show
before_filter :perform_search, :only => :show
def perform_search
if params[:searchprofgroup].present? && @search_result_page
@offers = Offer.where(fb: params[:searchprofgroup])
end
end
private
def set_searchresult_page
@search_result_page = Page.published.where(page_layout: "searchresults").first
end
end
end
И последнее, что вам нужно сделать, это сказать Rails, что эти расширения должны быть использованы
# config/application.rb
config.to_prepare do
Dir.glob(Rails.root.join("app/**/*_ext*.rb")) do |c|
Rails.configuration.cache_classes ? require(c) : load(c)
end
end
Вот мое собственное решение.
Не знаю, если это правильный путь - но это работает:-)
Сел маршрут для pagename до контроллера #action:
get '/searchresult' => 'offers#handlesearch', :as => :searchresult
контроллер:
Контроллер наследует от Alchemy::PagesController и использует Alchemy::PagesHelper
Затем сели параметры [:urlname] на запрошенный путь. Таким образом, контроллер может загрузить правильное описание страницы. Остальное обрабатывается магией алхимии.
class OffersController < Alchemy::PagesController
helper Alchemy::PagesHelper
def handlesearch
params[:urlname] = request.path_info.gsub('/', '')
@page ||= load_page
if !@page.blank?
@offers = Offer.where(fb: params[:searchprofgroup])
else
render_404
end
end
end
и наконец мнение:
#/app/views/offers/handlesearch.html.erb
<%= render_page_layout %>
вот и все