我必须在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后端中的自定义商品模块运行正常。)
答案 0 :(得分:2)
作为旁注:你看到了炼金术 - 雪貂宝石吗? (在较旧的Alchemy版本中,它是一个内置功能)它会搜索你的所有EssenceText
和EssenceRichtext
(如果你没有为某些精华关闭它),但也许值得一看。
我更喜欢不依赖于您在路由中设置名称所做的页面网址名称 - 因为其他内容编辑者可以轻松地重命名该页面,或者在名称错误的其他语言树中创建一个。
相反,我会定义一个仅用于搜索结果的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 %>
多数民众赞成