1

Alchemy CMS ページで動的コンテンツ (オファーの検索結果) をレンダリングする必要があります。

最初に、cms-backend に「searchresult」というページを作成しました。

エッセンスのないエレメントを作りました。テーブルをレンダリングする必要があります。

検索フォームにはアクションが/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

しかし、これはまだこのコントローラーへのリダイレクトを行い、searchparams は失われます。

Alchemy cms に、searchparams をキャッチして次のような変数を入力できる「フック」はありますか?

@offers = Offer.where(...)

これをcmsページ要素(view-partial)に持っていきます

ここで解決策を見つけようとしました: Alchemy CMS 用のカスタム ゲストブック モジュールの作成

しかし、残念ながら、これは私にとって十分ではありません。(CMS バックエンドのカスタム オファー モジュールは正常に動作します。)

4

2 に答える 2

2

余談ですが、錬金術のフェレットの宝石を見ましたか? (古い Alchemy バージョンでは組み込み機能です) すべての検索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

ここに私自身の解決策があります。

これが正しい方法かどうかはわかりませんが、機能します:-)

pagename から controller#action へのルートを設定します。

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

コントローラ:

Controller は 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 !@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 に答える