1

我必须在 Alchemy CMS 页面中呈现动态内容(优惠的搜索结果)。

首先,我在 cms-backend 中创建了一个名为“searchresult”的页面。

我做了一个没有本质的元素。应该呈现一个表格。

seachform 具有 as 操作/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

但这仍然会重定向到该控制器,并且 searchparams 会丢失。

Alchemy cms 中是否有任何“钩子”,我可以在其中捕获 searchparams 并填充如下变量:

@offers = Offer.where(...)

并将其带到 cms 页面元素(视图部分)

我试图在这里找到解决方案:为 Alchemy CMS 创建自定义留言簿模块

但不幸的是,这对我来说还不够完整。(我的 CMS 后端中的自定义报价模块工作正常。)

4

2 回答 2

2

作为旁注:你看到炼金雪貂宝石了吗?(在较早的炼金术版本中,它是一个内置功能)它搜索所有你的EssenceTextEssenceRichtext(如果你不为某些本质关闭它),但也许它值得一看。

我不想像您通过在路由中设置名称那样依赖页面 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
于 2014-01-22T22:39:16.167 回答
0

这是我自己的解决方案。

不知道,如果这是正确的方法 - 但它有效:-)

将页面名称路由到控制器#action:

  get '/searchresult' => 'offers#handlesearch', :as => :searchresult

控制器:

Controller 继承自 Alchemy::PagesController 并使用 Alchemy::PagesHelper

然后将 params[:urlname] 放在请求的路径上。所以Controller可以加载正确的页面描述。其余的由炼金术魔法处理。

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 %>

而已

于 2014-01-13T09:15:16.533 回答