Рендеринг динамического контента на странице 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 %>

вот и все

Другие вопросы по тегам