在CMS页面中呈现动态内容

时间:2014-01-12 19:20:13

标签: ruby-on-rails ruby dynamic alchemy-cms

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

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

我制作了一个没有精华的元素。应该呈现一个表。

seachform具有操作/searchresult,并使用(get)-search参数调用页面:

/searchresult?utf8=✓&searchmaingroup=bb&searchprofgroup=4100

但我在哪里可以收集数据?

我尝试了一个带有配置选项“controller”和“action”的page_layout到一个自己的控制器

- name: offersearch
  elements: [header, resulttable]
  autogenerate: [header, resulttable]
  controller: offers
  action: index
  cache: false

控制器:

OffersController < Alchemy::BaseController
  def index

  end
end

但这仍然会重定向到此控制器并且搜索范围丢失。

Alchemy cms中是否有任何“钩子”,我可以捕捉搜索范围并填充变量,如:

@offers = Offer.where(...)

并将其带到cms页面元素(view-partial)

我试图在这里找到解决方案:Creating a custom Guestbook Module for Alchemy CMS

但遗憾的是,这对我来说还不够完整。 (我的CMS后端中的自定义商品模块运行正常。)

2 个答案:

答案 0 :(得分:2)

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

我更喜欢不依赖于您在路由中设置名称所做的页面网址名称 - 因为其他内容编辑者可以轻松地重命名该页面,或者在名称错误的其他语言树中创建一个。

相反,我会定义一个仅用于搜索结果的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

答案 1 :(得分: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 %>

多数民众赞成