使用spree-multi-domain更改部分模板

时间:2017-09-15 03:48:05

标签: ruby-on-rails ruby erb spree

我有一个使用spree-multi-domain的狂欢商店,自述文件有关于如何切换布局文件的说明

  

这些布局应位于app / views / spree / layouts / store #code /目录中的网站主题扩展中。所以,如果你有一个代码为" alpha"你应该将它的默认布局存储在app / views / spree / layouts / alpha / spree_application.html.erb中

这很好但现在我不知道如何更改home/index.html.erb等其他模板。据我所知,这些文件被渲染到布局模板的yield部分,但我不确定如何使用它为不同的域设置不同的模板。

2 个答案:

答案 0 :(得分:1)

只需创建一个初始化程序multi_domain.rb,并使用两个或多个具有唯一代码的商店

  

store1 = Spree :: Store.find_by(代码:“first_store”)

     

store2 = Spree :: Store.find_by(代码:“second_store”)

你的意见分开如下:

  

应用程序/视图/礼包/ first_store /家/ index.html.erb

     

应用程序/视图/礼包/ second_store /家/ index.html.erb

初始化程序:

var str = 'a b c';
var replaced = str.split(' ').join('_');

此实现适用于包含10个域的真实商店。

答案 1 :(得分:0)

我修改了gonzalo moreno caballero的答案,因此它适用于rails 5.1

只需存储您的观点,例如

  

应用程序/视图/礼包/ first_store /家/ index.html.erb

     

应用程序/视图/礼包/ second_store /家/ index.html.erb

并将其添加到config / initializers / multi_domain.rb

module PartialRendererMultiStore
  def find_template(path, locals)
    prefixes = path.include?(?/) ? [] : @lookup_context.prefixes

    store_prefixes = prefixes
    store_path     = path

    if @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController)
      store_prefixes = (store_prefixes.map { |i| i.gsub('spree/', "spree/#{@view.current_store.code}/") } + store_prefixes).uniq unless store_prefixes.nil?
      store_path     = store_path.gsub('spree/', "spree/#{@view.current_store.code}/") unless store_path.nil?
    end

    begin
      @lookup_context.find_template(store_path, store_prefixes, true, locals, @details)
    rescue ::ActionView::MissingTemplate
      @lookup_context.find_template(path, prefixes, true, locals, @details)
    end
  end
end


class ActionView::PartialRenderer
  prepend PartialRendererMultiStore
end

module TemplateRendererMultiStore
  def find_template(name, prefixes = [], partial = false, keys = [], options = {})
    if prefixes.nil?
      store_prefixes = nil
    elsif @view.respond_to?(:current_store) && @view.current_store && !@view.controller.is_a?(Spree::Admin::BaseController)
      spree = /^spree\//

      store_prefixes = []

      prefixes.each do |i|
        store_prefixes << i.gsub(spree, "spree/#{@view.current_store.code}/") if i.match(spree)
      end

      store_prefixes = (store_prefixes + prefixes).uniq
    else
      store_prefixes = prefixes
    end

    begin
      @lookup_context.find_template(name, store_prefixes, partial, keys, options)
    rescue ::ActionView::MissingTemplate
      @lookup_context.find_template(name, prefixes, partial, keys, options)
    end
  end
end

class ActionView::TemplateRenderer
  prepend TemplateRendererMultiStore
end

spree_application仍然需要进入views/spree/layouts/<store_code>/