2014-01-12 81 views
1

我必須在Alchemy CMS頁面中呈現動態內容(商品的搜索結果)。呈現CMS頁面中的動態內容

首先,我在cms-backend中創建了一個名爲「searchresult」的頁面。

我做了一個沒有精華的元素。應該呈現表格。

的seachform具有作爲動作/searchresult和網頁時調用(獲取) - 搜索PARAMS:

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

但我在哪裏可以收集該數據?

我試圖與配置選項「控制器」和「行動」到自己的控制器

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

控制器page_layout:

OffersController < Alchemy::BaseController 
    def index 

    end 
end 

但是這使得仍然重定向到該控制器和searchparams丟失。

是否有任何「鉤」在鍊金CMS哪裏可以趕上searchparams和填補像一個變量:

@offers = Offer.where(...) 

並藉此到CMS頁面元素(視圖局部的)

我試圖找到一個解決方案在這裏:Creating a custom Guestbook Module for Alchemy CMS

但這不幸對我來說不夠完整。 (我的CMS後端定製報價模塊正常工作。)

回答

0

這是我自己的解決方案。

不知道,如果這是正確的做法 - 但它工作:-)

坐着一個路線頁面名控制器#動作:

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

控制器:

控制器從Alchemy :: PagesController繼承,並使用Alchemy :: PagesHelper

然後坐在params [:urlname]到請求的路徑。所以控制器可以加載正確的頁面描述。其餘的由鍊金術魔法處理。

class OffersController < Alchemy::PagesController 

    helper Alchemy::PagesHelper 

    def handlesearch 

    params[:urlname] = request.path_info.gsub('/', '') 
    @page ||= load_page 

    if [email protected]? 
     @offers = Offer.where(fb: params[:searchprofgroup]) 
    else 
     render_404 
    end 

    end 

end 

最後的觀點:

#/app/views/offers/handlesearch.html.erb 
<%= render_page_layout %> 

完蛋了

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