spree_multi_domain 3.0.2 → 3.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +45 -0
- data/Rakefile +18 -0
- data/app/controllers/admin/products_controller_decorator.rb +13 -0
- data/app/controllers/products_controller_decorator.rb +11 -0
- data/app/mailers/order_mailer.rb +21 -0
- data/app/mailers/shipment_mailer.rb +12 -0
- data/app/models/models_decorator.rb +22 -0
- data/app/models/store.rb +5 -0
- data/app/views/admin/stores/_form.html.erb +4 -0
- data/app/views/admin/stores/edit.html.erb +2 -2
- data/app/views/admin/stores/index.html.erb +2 -2
- data/app/views/admin/stores/new.html.erb +2 -2
- data/app/views/shared/_google_analytics.html.erb +10 -4
- data/config/locales/en.yml +8 -0
- data/lib/generators/spree_multi_domain/install_generator.rb +15 -0
- data/lib/generators/templates/db/migrate/20091202122944_create_stores.rb +14 -0
- data/lib/generators/templates/db/migrate/20091202123245_add_order_store.rb +9 -0
- data/lib/generators/templates/db/migrate/20100114020535_add_store_to_tracker.rb +13 -0
- data/lib/generators/templates/db/migrate/20100227175140_add_default_store.rb +9 -0
- data/lib/generators/templates/db/migrate/20100227180338_create_products_stores.rb +13 -0
- data/lib/generators/templates/db/migrate/20100616204303_store_id_for_taxonomies.rb +10 -0
- data/lib/generators/templates/db/migrate/20110223141800_add_email_to_stores.rb +13 -0
- data/lib/spree/search/multi_domain.rb +20 -0
- data/lib/spree_multi_domain.rb +76 -4
- data/spree_multi_domain.gemspec +22 -0
- metadata +27 -11
- data/db/seeds.rb +0 -2
- data/lib/spree_multi_domain/engine.rb +0 -154
- data/lib/tasks/site_extension_tasks.rake +0 -17
data/.gitignore
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
\#*
|
2
|
+
**/*.db
|
3
|
+
*~
|
4
|
+
.#*
|
5
|
+
.DS_Store
|
6
|
+
.dotest
|
7
|
+
.idea
|
8
|
+
.loadpath
|
9
|
+
.project
|
10
|
+
*.swp
|
11
|
+
public/dispatch.cgi
|
12
|
+
public/dispatch.fcgi
|
13
|
+
public/dispatch.rb
|
14
|
+
httpd
|
15
|
+
pgsql
|
16
|
+
config/*-public.asc
|
17
|
+
config/database.yml
|
18
|
+
config/mongrel_cluster.yml
|
19
|
+
db/*.sql
|
20
|
+
db/*.sqlite3*
|
21
|
+
db/schema.rb
|
22
|
+
doc/**/*
|
23
|
+
lib/products_index_profiler.rb
|
24
|
+
log/*.log
|
25
|
+
pkg
|
26
|
+
public/assets
|
27
|
+
public/attachments
|
28
|
+
public/blank_iframe.html
|
29
|
+
public/images
|
30
|
+
public/javascripts
|
31
|
+
public/stylesheets
|
32
|
+
public/ckeditora
|
33
|
+
spree.gemspec
|
34
|
+
spree_dev
|
35
|
+
spree_test
|
36
|
+
tmp
|
37
|
+
vendor/rails
|
38
|
+
vendor/extensions/google_base
|
39
|
+
public/google_base.xml
|
40
|
+
public/template_google_base.xml
|
41
|
+
coverage/*
|
42
|
+
var
|
43
|
+
TAGS
|
44
|
+
nbproject
|
45
|
+
vendor/extensions/theme_default/app/stylesheets/*.css
|
data/Rakefile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/packagetask'
|
5
|
+
require 'rake/gempackagetask'
|
6
|
+
|
7
|
+
spec = eval(File.read('spree_multi_domain.gemspec'))
|
8
|
+
|
9
|
+
Rake::GemPackageTask.new(spec) do |p|
|
10
|
+
p.gem_spec = spec
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Release to gemcutter"
|
14
|
+
task :release => :package do
|
15
|
+
require 'rake/gemcutter'
|
16
|
+
Rake::Gemcutter::Tasks.new(spec).define
|
17
|
+
Rake::Task['gem:push'].invoke
|
18
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
class OrderMailer < ActionMailer::Base
|
2
|
+
helper "spree/base"
|
3
|
+
|
4
|
+
def confirm_email(order, resend=false)
|
5
|
+
@order = order
|
6
|
+
subject = (resend ? "[RESEND] " : "")
|
7
|
+
subject += "#{Spree::Config[:site_name]} Order Confirmation ##{order.number}"
|
8
|
+
mail_params = {:to => order.email, :subject => subject}
|
9
|
+
mail_params[:from] = order.store.email if order.store.email.present?
|
10
|
+
mail(mail_params)
|
11
|
+
end
|
12
|
+
|
13
|
+
def cancel_email(order, resend=false)
|
14
|
+
@order = order
|
15
|
+
subject = (resend ? "[RESEND] " : "")
|
16
|
+
subject += "#{Spree::Config[:site_name]} Cancellation of Order ##{order.number}"
|
17
|
+
mail_params = {:to => order.email, :subject => subject}
|
18
|
+
mail_params[:from] = order.store.email if order.store.email.present?
|
19
|
+
mail(mail_params)
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class ShipmentMailer < ActionMailer::Base
|
2
|
+
helper "spree/base"
|
3
|
+
|
4
|
+
def shipped_email(shipment, resend=false)
|
5
|
+
@shipment = shipment
|
6
|
+
subject = (resend ? "[RESEND] " : "")
|
7
|
+
subject += "#{Spree::Config[:site_name]} Shipment Notification ##{shipment.order.number}"
|
8
|
+
mail_params = {:to => shipment.order.email, :subject => subject}
|
9
|
+
mail_params[:from] = shipment.order.store.email if shipment.order.store.email.present?
|
10
|
+
mail(mail_params)
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Product.class_eval do
|
2
|
+
has_and_belongs_to_many :stores
|
3
|
+
scope :by_store, lambda {|store| joins(:stores).where("products_stores.store_id = ?", store)}
|
4
|
+
end
|
5
|
+
|
6
|
+
Order.class_eval do
|
7
|
+
belongs_to :store
|
8
|
+
scope :by_store, lambda { |store| where(:store_id => store.id) }
|
9
|
+
end
|
10
|
+
|
11
|
+
Taxonomy.class_eval do
|
12
|
+
belongs_to :store
|
13
|
+
end
|
14
|
+
|
15
|
+
Tracker.class_eval do
|
16
|
+
belongs_to :store
|
17
|
+
|
18
|
+
def self.current(domain)
|
19
|
+
trackers = Tracker.find(:all, :conditions => {:active => true, :environment => ENV['RAILS_ENV']})
|
20
|
+
trackers.select { |t| t.store_id == Store.current(domain).try(:id) }.first
|
21
|
+
end
|
22
|
+
end
|
data/app/models/store.rb
CHANGED
@@ -7,4 +7,9 @@ class Store < ActiveRecord::Base
|
|
7
7
|
|
8
8
|
scope :default, where(:default => true)
|
9
9
|
scope :by_domain, lambda { |domain| where("domains like ?", "%#{domain}%") }
|
10
|
+
|
11
|
+
def self.current(domain = nil)
|
12
|
+
current_store = domain ? Store.by_domain(domain).first : nil
|
13
|
+
current_store || Store.default.first
|
14
|
+
end
|
10
15
|
end
|
@@ -20,6 +20,10 @@
|
|
20
20
|
</label>
|
21
21
|
</td>
|
22
22
|
</tr>
|
23
|
+
<tr>
|
24
|
+
<td><label><%=t("send_mails_as")%></label></td>
|
25
|
+
<td><%= text_field :store, :email, {"style" => "width:200px"} %></td>
|
26
|
+
</tr>
|
23
27
|
<tr>
|
24
28
|
<td><label><%=t("domains")%></label></td>
|
25
29
|
<td><%= text_area :store, :domains, {:cols => 60, :rows => 4} %></td>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%= render :partial => 'admin/shared/configuration_menu' %>
|
2
2
|
|
3
3
|
<h1><%= t("editing_store") %></h1>
|
4
|
-
<%=
|
4
|
+
<%= render "shared/error_messages", :target => @store %>
|
5
5
|
<% form_for(@store, :url => object_url, :html => { :method => :put }) do |f| %>
|
6
6
|
<%= render :partial => "form", :locals => { :f => f } %>
|
7
7
|
<p class="form-buttons">
|
8
8
|
<%= button t('update') %>
|
9
9
|
<%= t("or") %> <%= link_to t("actions.cancel"), admin_stores_url %>
|
10
10
|
</p>
|
11
|
-
<% end %>
|
11
|
+
<% end %>
|
@@ -15,6 +15,7 @@
|
|
15
15
|
<thead>
|
16
16
|
<th><%= t("name") %></th>
|
17
17
|
<th><%= t("code") %></th>
|
18
|
+
<th><%= t("send_mails_as") %></th>
|
18
19
|
<th><%= t("domains") %></th>
|
19
20
|
<th><%= t("action") %></th>
|
20
21
|
</thead>
|
@@ -23,6 +24,7 @@
|
|
23
24
|
<tr id="<%= dom_id store %>">
|
24
25
|
<td width="120px"><%= store.name %></td>
|
25
26
|
<td width="80px"><%= store.code %></td>
|
27
|
+
<td width="80px"><%= store.email %></td>
|
26
28
|
<td width="220"><%= store.domains %></td>
|
27
29
|
<td width="140px">
|
28
30
|
<%= link_to_edit store %>
|
@@ -32,5 +34,3 @@
|
|
32
34
|
<% end %>
|
33
35
|
</tbody>
|
34
36
|
</table>
|
35
|
-
<%= will_paginate(:previous_label => "« #{t('previous')}", :next_label => "#{t('next')} »") %>
|
36
|
-
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<%= render :partial => 'admin/shared/configuration_menu' %>
|
2
2
|
|
3
3
|
<h1><%= t("new_store") %></h1>
|
4
|
-
<%=
|
4
|
+
<%= render "shared/error_messages", :target => @store %>
|
5
5
|
|
6
6
|
<% form_for(:store, :url => collection_url) do |f| %>
|
7
7
|
<%= render :partial => "form", :locals => { :f => f } %>
|
@@ -9,4 +9,4 @@
|
|
9
9
|
<%= button t('continue') %>
|
10
10
|
<%= t("or") %> <%= link_to t("actions.cancel"), admin_stores_url %>
|
11
11
|
</p>
|
12
|
-
<% end %>
|
12
|
+
<% end %>
|
@@ -1,10 +1,16 @@
|
|
1
|
-
<% if tracker =
|
1
|
+
<% if tracker = current_tracker %>
|
2
2
|
|
3
3
|
<script type="text/javascript">
|
4
4
|
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
|
5
5
|
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
|
6
6
|
</script>
|
7
7
|
|
8
|
+
<script type="text/javascript">
|
9
|
+
var pageTracker = _gat._getTracker("<%= tracker.analytics_id %>");
|
10
|
+
pageTracker._initData();
|
11
|
+
pageTracker._trackPageview();
|
12
|
+
</script>
|
13
|
+
|
8
14
|
<% if @analytics_page %>
|
9
15
|
<script type="text/javascript">document.strTrackPageView="<%= @analytics_page %>";</script>
|
10
16
|
<% end %>
|
@@ -31,8 +37,8 @@
|
|
31
37
|
"<%= "#{"QA-" if request.server_name =~ /^(dev.|localhost)/ }#{@order.number}" %>",
|
32
38
|
"",
|
33
39
|
"<%= @order.total %>",
|
34
|
-
"<%= @order.
|
35
|
-
"<%= @order.
|
40
|
+
"<%= @order.adjustments.tax.sum(:amount).to_s %>",
|
41
|
+
"<%= @order.adjustments.shipping.sum(:amount).to_s %>",
|
36
42
|
"<%= @order.ship_address.city if @order.ship_address %>",
|
37
43
|
"<%= @order.ship_address.state.name if @order.ship_address && @order.ship_address.state %><%= @order.ship_address.state_name if @order.ship_address && @order.ship_address.state.nil? %>",
|
38
44
|
"<%= @order.ship_address.country.name if @order.ship_address && @order.ship_address.country %>"
|
@@ -53,4 +59,4 @@
|
|
53
59
|
|
54
60
|
</script>
|
55
61
|
<% end %>
|
56
|
-
<% end %>
|
62
|
+
<% end %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SpreeMultiDomain
|
2
|
+
module Generators
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path("../../templates", __FILE__)
|
5
|
+
|
6
|
+
desc "Configures your Rails application for use with spree_multi_domain"
|
7
|
+
|
8
|
+
def copy_migrations
|
9
|
+
directory "db"
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
@@ -0,0 +1,13 @@
|
|
1
|
+
class CreateProductsStores < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :products_stores, :id => false do |t|
|
4
|
+
t.references :product
|
5
|
+
t.references :store
|
6
|
+
t.timestamps
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.down
|
11
|
+
drop_table :products_stores
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Spree::Search
|
2
|
+
class MultiDomain < Spree::Search::Base
|
3
|
+
def get_base_scope
|
4
|
+
base_scope = @cached_product_group ? @cached_product_group.products.active : Product.active
|
5
|
+
base_scope = base_scope.by_store(current_store_id) if current_store_id
|
6
|
+
base_scope = base_scope.in_taxon(taxon) unless taxon.blank?
|
7
|
+
|
8
|
+
|
9
|
+
base_scope = get_products_conditions_for(base_scope, keywords) unless keywords.blank?
|
10
|
+
|
11
|
+
base_scope = base_scope.on_hand unless Spree::Config[:show_zero_stock_products]
|
12
|
+
base_scope
|
13
|
+
end
|
14
|
+
|
15
|
+
def prepare(params)
|
16
|
+
super
|
17
|
+
@properties[:current_store_id] = params[:current_store_id]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/spree_multi_domain.rb
CHANGED
@@ -1,7 +1,24 @@
|
|
1
1
|
require 'spree_core'
|
2
2
|
require 'spree_multi_domain_hooks'
|
3
|
-
require 'spree_multi_domain/engine'
|
4
3
|
|
4
|
+
module SpreeMultiDomain
|
5
|
+
class Engine < Rails::Engine
|
6
|
+
|
7
|
+
config.autoload_paths += %W(#{config.root}/lib)
|
8
|
+
|
9
|
+
def self.activate
|
10
|
+
#override search to make it multi-store aware
|
11
|
+
Spree::Config.searcher_class = Spree::Search::MultiDomain
|
12
|
+
|
13
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
|
14
|
+
Rails.env.production? ? require(c) : load(c)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
config.to_prepare &method(:activate).to_proc
|
20
|
+
end
|
21
|
+
end
|
5
22
|
|
6
23
|
# Make it possible to add to existing resource controller hooks with '<<' even when there's no hook of a given type defined yet.
|
7
24
|
# e.g. create.before << :assign_to_store
|
@@ -25,17 +42,72 @@ ResourceController::Accessors.module_eval do
|
|
25
42
|
end
|
26
43
|
end
|
27
44
|
|
45
|
+
Spree::CurrentOrder.module_eval do
|
46
|
+
def current_order_with_multi_domain(create_order_if_necessary = false)
|
47
|
+
current_order_without_multi_domain(create_order_if_necessary)
|
48
|
+
if @current_order and current_store and @current_order.store.nil?
|
49
|
+
@current_order.update_attribute(:store_id, current_store.id)
|
50
|
+
end
|
51
|
+
@current_order
|
52
|
+
end
|
53
|
+
alias_method_chain :current_order, :multi_domain
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
module SpreeBase
|
58
|
+
module InstanceMethods
|
59
|
+
private
|
60
|
+
|
61
|
+
def current_store
|
62
|
+
@current_store ||= ::Store.current(request.env['SERVER_NAME'])
|
63
|
+
end
|
64
|
+
|
65
|
+
def current_tracker
|
66
|
+
@current_tracker ||= Tracker.current(request.env['SERVER_NAME'])
|
67
|
+
end
|
68
|
+
|
69
|
+
def get_taxonomies
|
70
|
+
@taxonomies ||= current_store.present? ? Taxonomy.where(["store_id = ?", current_store.id]) : Taxonomy
|
71
|
+
@taxonomies = @taxonomies.find(:all, :include => {:root => :children})
|
72
|
+
@taxonomies
|
73
|
+
end
|
74
|
+
|
75
|
+
def add_current_store_id_to_params
|
76
|
+
params[:current_store_id] = current_store.try(:id)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
class << self
|
81
|
+
|
82
|
+
def included_with_multi_domain(receiver)
|
83
|
+
included_without_multi_domain(receiver)
|
84
|
+
|
85
|
+
receiver.send :helper, 'products'
|
86
|
+
receiver.send :helper, 'taxons'
|
87
|
+
receiver.send :before_filter, 'add_current_store_id_to_params'
|
88
|
+
receiver.send :helper_method, 'current_store'
|
89
|
+
receiver.send :helper_method, 'current_tracker'
|
90
|
+
end
|
91
|
+
|
92
|
+
alias_method_chain :included, :multi_domain
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
28
96
|
|
29
97
|
module ActionView::Layouts
|
30
98
|
|
31
99
|
def find_layout_with_multi_store(layout)
|
100
|
+
store_layout = layout
|
32
101
|
if respond_to?(:current_store) && current_store && !controller.is_a?(Admin::BaseController)
|
33
|
-
layout.gsub
|
102
|
+
store_layout = layout.gsub("layouts/", "layouts/#{current_store.code}/")
|
103
|
+
end
|
104
|
+
begin
|
105
|
+
find_layout_without_multi_store(store_layout)
|
106
|
+
rescue ::ActionView::MissingTemplate
|
107
|
+
find_layout_without_multi_store(layout)
|
34
108
|
end
|
35
|
-
find_layout_without_multi_store(layout)
|
36
109
|
end
|
37
110
|
|
38
111
|
alias_method_chain :find_layout, :multi_store
|
39
112
|
|
40
113
|
end
|
41
|
-
|
@@ -0,0 +1,22 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.platform = Gem::Platform::RUBY
|
3
|
+
s.name = 'spree_multi_domain'
|
4
|
+
s.version = '3.0.4'
|
5
|
+
s.summary = 'Adds multiple site support to Spree'
|
6
|
+
s.description = 'Multiple Spree stores on different domains - single unified backed for processing orders.'
|
7
|
+
s.required_ruby_version = '>= 1.8.7'
|
8
|
+
|
9
|
+
s.authors = ['Brian Quinn', 'Roman Smirnov', 'David North']
|
10
|
+
s.email = 'brian@railsdog.com'
|
11
|
+
s.homepage = 'http://spreecommerce.com'
|
12
|
+
s.rubyforge_project = 'spree_multi_domain'
|
13
|
+
|
14
|
+
s.files = `git ls-files`.split("\n")
|
15
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
16
|
+
s.require_path = 'lib'
|
17
|
+
s.requirements << 'none'
|
18
|
+
|
19
|
+
s.has_rdoc = false
|
20
|
+
|
21
|
+
s.add_dependency('spree_core', '>= 0.40.0')
|
22
|
+
end
|
metadata
CHANGED
@@ -5,16 +5,18 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 3
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 3.0.
|
8
|
+
- 4
|
9
|
+
version: 3.0.4
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Brian Quinn
|
13
|
+
- Roman Smirnov
|
14
|
+
- David North
|
13
15
|
autorequire:
|
14
16
|
bindir: bin
|
15
17
|
cert_chain: []
|
16
18
|
|
17
|
-
date:
|
19
|
+
date: 2011-02-23 00:00:00 +03:00
|
18
20
|
default_executable:
|
19
21
|
dependencies:
|
20
22
|
- !ruby/object:Gem::Dependency
|
@@ -26,10 +28,9 @@ dependencies:
|
|
26
28
|
- !ruby/object:Gem::Version
|
27
29
|
segments:
|
28
30
|
- 0
|
29
|
-
-
|
31
|
+
- 40
|
30
32
|
- 0
|
31
|
-
|
32
|
-
version: 0.30.0.beta1
|
33
|
+
version: 0.40.0
|
33
34
|
type: :runtime
|
34
35
|
version_requirements: *id001
|
35
36
|
description: Multiple Spree stores on different domains - single unified backed for processing orders.
|
@@ -41,12 +42,15 @@ extensions: []
|
|
41
42
|
extra_rdoc_files: []
|
42
43
|
|
43
44
|
files:
|
45
|
+
- .gitignore
|
44
46
|
- README.md
|
45
|
-
-
|
46
|
-
-
|
47
|
-
- lib/spree_multi_domain_hooks.rb
|
48
|
-
- lib/tasks/site_extension_tasks.rake
|
47
|
+
- Rakefile
|
48
|
+
- app/controllers/admin/products_controller_decorator.rb
|
49
49
|
- app/controllers/admin/stores_controller.rb
|
50
|
+
- app/controllers/products_controller_decorator.rb
|
51
|
+
- app/mailers/order_mailer.rb
|
52
|
+
- app/mailers/shipment_mailer.rb
|
53
|
+
- app/models/models_decorator.rb
|
50
54
|
- app/models/store.rb
|
51
55
|
- app/views/admin/products/_index_headers.html.erb
|
52
56
|
- app/views/admin/products/_index_rows.html.erb
|
@@ -60,8 +64,20 @@ files:
|
|
60
64
|
- app/views/admin/trackers/_index_rows.html.erb
|
61
65
|
- app/views/admin/trackers/_store.html.erb
|
62
66
|
- app/views/shared/_google_analytics.html.erb
|
63
|
-
-
|
67
|
+
- config/locales/en.yml
|
64
68
|
- config/routes.rb
|
69
|
+
- lib/generators/spree_multi_domain/install_generator.rb
|
70
|
+
- lib/generators/templates/db/migrate/20091202122944_create_stores.rb
|
71
|
+
- lib/generators/templates/db/migrate/20091202123245_add_order_store.rb
|
72
|
+
- lib/generators/templates/db/migrate/20100114020535_add_store_to_tracker.rb
|
73
|
+
- lib/generators/templates/db/migrate/20100227175140_add_default_store.rb
|
74
|
+
- lib/generators/templates/db/migrate/20100227180338_create_products_stores.rb
|
75
|
+
- lib/generators/templates/db/migrate/20100616204303_store_id_for_taxonomies.rb
|
76
|
+
- lib/generators/templates/db/migrate/20110223141800_add_email_to_stores.rb
|
77
|
+
- lib/spree/search/multi_domain.rb
|
78
|
+
- lib/spree_multi_domain.rb
|
79
|
+
- lib/spree_multi_domain_hooks.rb
|
80
|
+
- spree_multi_domain.gemspec
|
65
81
|
has_rdoc: true
|
66
82
|
homepage: http://spreecommerce.com
|
67
83
|
licenses: []
|
data/db/seeds.rb
DELETED
@@ -1,154 +0,0 @@
|
|
1
|
-
require "spree_multi_domain"
|
2
|
-
|
3
|
-
module SpreeMultiDomain
|
4
|
-
|
5
|
-
class Engine < Rails::Engine
|
6
|
-
|
7
|
-
def self.activate
|
8
|
-
|
9
|
-
Spree::BaseController.class_eval do
|
10
|
-
helper_method :current_store
|
11
|
-
helper :products, :taxons
|
12
|
-
|
13
|
-
private
|
14
|
-
|
15
|
-
# Tell Rails to look in layouts/#{@store.code} whenever we're inside of a store (instead of the standard /layouts location)
|
16
|
-
def find_layout(layout, format, html_fallback=false) #:nodoc:
|
17
|
-
layout_dir = current_store ? "layouts/#{current_store.code.downcase}" : "layouts"
|
18
|
-
view_paths.find_template(layout.to_s =~ /\A\/|layouts\// ? layout : "#{layout_dir}/#{layout}", format, html_fallback)
|
19
|
-
rescue ActionView::MissingTemplate
|
20
|
-
raise if Mime::Type.lookup_by_extension(format.to_s).html?
|
21
|
-
end
|
22
|
-
|
23
|
-
def current_store
|
24
|
-
@current_store ||= ::Store.by_domain(request.env['SERVER_NAME']).first
|
25
|
-
@current_store ||= ::Store.default.first
|
26
|
-
end
|
27
|
-
|
28
|
-
def get_taxonomies
|
29
|
-
@taxonomies ||= Taxonomy.find(:all, :include => {:root => :children}, :conditions => ["store_id = ?", @site.id])
|
30
|
-
@taxonomies
|
31
|
-
end
|
32
|
-
|
33
|
-
end
|
34
|
-
|
35
|
-
Product.class_eval do
|
36
|
-
has_and_belongs_to_many :stores
|
37
|
-
scope :by_store, lambda {|store| joins(:stores).where("products_stores.store_id = ?", store)}
|
38
|
-
end
|
39
|
-
|
40
|
-
ProductsController.class_eval do
|
41
|
-
before_filter :can_show_product, :only => :show
|
42
|
-
|
43
|
-
private
|
44
|
-
def can_show_product
|
45
|
-
if @product.stores.empty? || @product.stores.include?(@site)
|
46
|
-
render :file => "public/404.html", :status => 404
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
#override search to make it multi-store aware
|
53
|
-
Spree::Search.module_eval do
|
54
|
-
def retrieve_products
|
55
|
-
# taxon might be already set if this method is called from TaxonsController#show
|
56
|
-
@taxon ||= Taxon.find_by_id(params[:taxon]) unless params[:taxon].blank?
|
57
|
-
# add taxon id to params for searcher
|
58
|
-
params[:taxon] = @taxon.id if @taxon
|
59
|
-
@keywords = params[:keywords]
|
60
|
-
|
61
|
-
per_page = params[:per_page].to_i
|
62
|
-
per_page = per_page > 0 ? per_page : Spree::Config[:products_per_page]
|
63
|
-
params[:per_page] = per_page
|
64
|
-
params[:page] = 1 if (params[:page].to_i <= 0)
|
65
|
-
|
66
|
-
# Prepare a search within the parameters
|
67
|
-
Spree::Config.searcher.prepare(params)
|
68
|
-
|
69
|
-
if !params[:order_by_price].blank?
|
70
|
-
@product_group = ProductGroup.new.from_route([params[:order_by_price]+"_by_master_price"])
|
71
|
-
elsif params[:product_group_name]
|
72
|
-
@cached_product_group = ProductGroup.find_by_permalink(params[:product_group_name])
|
73
|
-
@product_group = ProductGroup.new
|
74
|
-
elsif params[:product_group_query]
|
75
|
-
@product_group = ProductGroup.new.from_route(params[:product_group_query])
|
76
|
-
else
|
77
|
-
@product_group = ProductGroup.new
|
78
|
-
end
|
79
|
-
|
80
|
-
@product_group = @product_group.from_search(params[:search]) if params[:search]
|
81
|
-
|
82
|
-
base_scope = @cached_product_group ? @cached_product_group.products.active : Product.active
|
83
|
-
base_scope = base_scope.by_store(current_store.id) if current_store.present?
|
84
|
-
|
85
|
-
base_scope = base_scope.in_taxon(@taxon) unless @taxon.blank?
|
86
|
-
base_scope = base_scope.keywords(@keywords) unless @keywords.blank?
|
87
|
-
|
88
|
-
base_scope = base_scope.on_hand unless Spree::Config[:show_zero_stock_products]
|
89
|
-
@products_scope = @product_group.apply_on(base_scope)
|
90
|
-
|
91
|
-
curr_page = Spree::Config.searcher.manage_pagination ? 1 : params[:page]
|
92
|
-
@products = @products_scope.all.paginate({
|
93
|
-
:include => [:images, :master],
|
94
|
-
:per_page => per_page,
|
95
|
-
:page => curr_page
|
96
|
-
})
|
97
|
-
@products_count = @products_scope.count
|
98
|
-
|
99
|
-
return(@products)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
Admin::ProductsController.class_eval do
|
104
|
-
update.before << :set_stores
|
105
|
-
|
106
|
-
create.before << :add_to_all_stores
|
107
|
-
|
108
|
-
private
|
109
|
-
def set_stores
|
110
|
-
@product.store_ids = nil unless params[:product].key? :store_ids
|
111
|
-
end
|
112
|
-
|
113
|
-
def add_to_all_stores
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
Order.class_eval do
|
118
|
-
belongs_to :store
|
119
|
-
scope :by_store, lambda { |store| where(:store_id => store.id) }
|
120
|
-
end
|
121
|
-
|
122
|
-
Taxonomy.class_eval do
|
123
|
-
belongs_to :store
|
124
|
-
end
|
125
|
-
|
126
|
-
Tracker.class_eval do
|
127
|
-
belongs_to :store
|
128
|
-
|
129
|
-
def self.current
|
130
|
-
trackers = Tracker.find(:all, :conditions => {:active => true, :environment => ENV['RAILS_ENV']})
|
131
|
-
trackers.select { |t| t.store.name == Spree::Config[:site_name] }.first
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
135
|
-
|
136
|
-
config.autoload_paths += %W(#{config.root}/lib)
|
137
|
-
config.to_prepare &method(:activate).to_proc
|
138
|
-
|
139
|
-
end
|
140
|
-
|
141
|
-
end
|
142
|
-
|
143
|
-
|
144
|
-
Spree::CurrentOrder.module_eval do
|
145
|
-
def current_order_with_multi_domain(create_order_if_necessary = false)
|
146
|
-
current_order_without_multi_domain(create_order_if_necessary)
|
147
|
-
if @current_order and current_store and @current_order.store.nil?
|
148
|
-
@current_order.update_attribute(:store_id, current_store.id)
|
149
|
-
end
|
150
|
-
@current_order
|
151
|
-
end
|
152
|
-
alias_method_chain :current_order, :multi_domain
|
153
|
-
end
|
154
|
-
|
@@ -1,17 +0,0 @@
|
|
1
|
-
namespace :spree do
|
2
|
-
namespace :extensions do
|
3
|
-
namespace :site do
|
4
|
-
desc "Copies public assets of the Site to the instance public/ directory."
|
5
|
-
task :update => :environment do
|
6
|
-
is_svn_git_or_dir = proc {|path| path =~ /\.svn/ || path =~ /\.git/ || File.directory?(path) }
|
7
|
-
Dir[SiteExtension.root + "/public/**/*"].reject(&is_svn_git_or_dir).each do |file|
|
8
|
-
path = file.sub(SiteExtension.root, '')
|
9
|
-
directory = File.dirname(path)
|
10
|
-
puts "Copying #{path}..."
|
11
|
-
mkdir_p RAILS_ROOT + directory
|
12
|
-
cp file, RAILS_ROOT + path
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|