shopifydev 0.0.1
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 +17 -0
- data/.pryrc +3 -0
- data/.root.shopifydev.yaml.sample +21 -0
- data/.ruby-version +1 -0
- data/.shopifydev.yaml.sample +7 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/NEXTSTEPS.md +33 -0
- data/README.md +78 -0
- data/Rakefile +1 -0
- data/bin/shopify_console +15 -0
- data/bin/shopifydev +100 -0
- data/lib/rails/generators/shopifydev/shops_generator.rb +11 -0
- data/lib/rails/generators/shopifydev/templates/shops.rake +5 -0
- data/lib/rails/tasks/shops.rake +7 -0
- data/lib/shopifydev/asset.rb +58 -0
- data/lib/shopifydev/commands.rb +83 -0
- data/lib/shopifydev/config.rb +9 -0
- data/lib/shopifydev/generators/shop.rb +29 -0
- data/lib/shopifydev/generators/templates/Gemfile +10 -0
- data/lib/shopifydev/generators/templates/gitignore +1 -0
- data/lib/shopifydev/generators/templates/rvmrc +1 -0
- data/lib/shopifydev/generators/templates/shopify-tmbundle +21 -0
- data/lib/shopifydev/pry/commands.rb +194 -0
- data/lib/shopifydev/railtie.rb +11 -0
- data/lib/shopifydev/shop.rb +38 -0
- data/lib/shopifydev/template.rb +73 -0
- data/lib/shopifydev/version.rb +3 -0
- data/lib/shopifydev.rb +10 -0
- data/shopifydev.gemspec +35 -0
- data/spec/shopifydev/config_spec.rb +5 -0
- data/spec/shopifydev/generators/shopifydev/shopifydev_generator_spec.rb +5 -0
- data/spec/shopifydev/pry/commands_spec.rb +5 -0
- data/spec/shopifydev/railtie_spec.rb +5 -0
- data/templates/customers/order.liquid +109 -0
- data/templates/customers/register.liquid +42 -0
- data/templates/page.support.liquid +78 -0
- data/templates/page.verbose.liquid +18 -0
- data/templates/product.liquid +284 -0
- data/templates/search.liquid +63 -0
- data/test_driver.rb +31 -0
- metadata +275 -0
@@ -0,0 +1,194 @@
|
|
1
|
+
require 'term/ansicolor'
|
2
|
+
require 'oj'
|
3
|
+
class Color
|
4
|
+
if Pry.config.color
|
5
|
+
extend Term::ANSIColor
|
6
|
+
else
|
7
|
+
class << self
|
8
|
+
def method_missing
|
9
|
+
''
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
class LocalShopifyApp
|
16
|
+
attr_accessor :path
|
17
|
+
def initialize(path)
|
18
|
+
@path = path
|
19
|
+
end
|
20
|
+
|
21
|
+
def shops
|
22
|
+
json = `/bin/bash -l -c "unset BUNDLE_GEMFILE; cd #{path}; bundle exec rake shops 2>/dev/null"`
|
23
|
+
json = json.split("----snip----\n").last
|
24
|
+
Oj.load json
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
class ConfigMenu
|
30
|
+
|
31
|
+
attr_accessor :cfg
|
32
|
+
|
33
|
+
def initialize(cfg)
|
34
|
+
@cfg = cfg
|
35
|
+
@menu_choices = [:do_nothing]
|
36
|
+
@menu_display = []
|
37
|
+
end
|
38
|
+
def build
|
39
|
+
header("Test Shops")
|
40
|
+
cfg[:test_shops].keys.each do |k|
|
41
|
+
choice([:test_shops, k], k)
|
42
|
+
end
|
43
|
+
|
44
|
+
header("Local Apps")
|
45
|
+
cfg[:apps][:development].each do |k, path|
|
46
|
+
choice([:apps, :development, k], path)
|
47
|
+
end
|
48
|
+
|
49
|
+
header("Heroku Apps")
|
50
|
+
cfg[:apps][:heroku].each do |k, name|
|
51
|
+
choice([:apps, :heroku, k], name)
|
52
|
+
end
|
53
|
+
|
54
|
+
self
|
55
|
+
end
|
56
|
+
|
57
|
+
def print(output)
|
58
|
+
output.puts @menu_display.join("\n")
|
59
|
+
end
|
60
|
+
|
61
|
+
def header(label)
|
62
|
+
@menu_display << ''
|
63
|
+
@menu_display << Color.blue { label }
|
64
|
+
end
|
65
|
+
|
66
|
+
def choice(path, value)
|
67
|
+
ix = @menu_choices.length
|
68
|
+
@menu_display << Color.yellow{ ix.to_s } + '. ' + value.to_s
|
69
|
+
@menu_choices[ix] = path
|
70
|
+
end
|
71
|
+
|
72
|
+
def pick(ix)
|
73
|
+
if ix >= @menu_choices.length
|
74
|
+
nil
|
75
|
+
else
|
76
|
+
@menu_choices[ix]
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
def pick_config(ix)
|
81
|
+
path = pick(ix)
|
82
|
+
return :no_such_config if path.nil?
|
83
|
+
result = cfg
|
84
|
+
path.each do |x|
|
85
|
+
result = result[x]
|
86
|
+
end
|
87
|
+
|
88
|
+
[path, result]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
shopifydev_command_set = Pry::CommandSet.new do
|
93
|
+
create_command "switch" do
|
94
|
+
description "switch shops"
|
95
|
+
|
96
|
+
|
97
|
+
# opt is a Slop object, see https://github.com/injekt/slop/blob/master/README.md
|
98
|
+
def options(opt)
|
99
|
+
end
|
100
|
+
|
101
|
+
def process
|
102
|
+
print_current_shop
|
103
|
+
|
104
|
+
config_menu = ConfigMenu.new(Shopifydev::Config.config).build
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
case true
|
109
|
+
when args.empty?
|
110
|
+
config_menu.print(output)
|
111
|
+
when (args.length == 1)
|
112
|
+
ix = args.first.to_i
|
113
|
+
path, cfg = config_menu.pick_config(ix)
|
114
|
+
if path == :no_such_config
|
115
|
+
output.puts Color.red{ "I don't know about #{ix}" }
|
116
|
+
config_menu.print(output)
|
117
|
+
else
|
118
|
+
handle_choice(path, cfg)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def print_current_shop
|
124
|
+
current_shop = ShopifyAPI::Base.site || 'none'
|
125
|
+
output.puts Color.green{ "current shop:"} + " #{current_shop}"
|
126
|
+
end
|
127
|
+
|
128
|
+
def handle_choice(path, cfg)
|
129
|
+
case path.first.to_sym
|
130
|
+
when :test_shops
|
131
|
+
url = "https://#{cfg[:api_key]}:#{cfg[:password]}@#{cfg[:myshopify_domain]}/admin/"
|
132
|
+
ShopifyAPI::Base.site = url
|
133
|
+
print_current_shop
|
134
|
+
when :apps
|
135
|
+
case path[1].to_sym
|
136
|
+
when :development
|
137
|
+
output.puts "you picked #{path.join('.')}"
|
138
|
+
output.puts cfg.inspect
|
139
|
+
app = LocalShopifyApp.new(cfg)
|
140
|
+
output.puts Color.yellow{ app.shops.inspect }
|
141
|
+
when :heroku
|
142
|
+
output.puts "you picked #{path.join('.')}"
|
143
|
+
output.puts cfg.inspect
|
144
|
+
|
145
|
+
output.puts Color.yellow{ "but it's not ready yet!"}
|
146
|
+
else
|
147
|
+
output.puts "you picked #{path.join('.')}"
|
148
|
+
output.puts cfg.inspect
|
149
|
+
output.puts Color.red{ "AND I DON'T EVEN KNOW!"}
|
150
|
+
end
|
151
|
+
else
|
152
|
+
output.puts "you picked #{path.join('.')}"
|
153
|
+
output.puts cfg.inspect
|
154
|
+
output.puts Color.red{ "AND I DON'T EVEN KNOW!"}
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
def output_menu_choices(arr, ix=1)
|
160
|
+
my_ix = 0
|
161
|
+
arr.each do |item|
|
162
|
+
output.puts menu_choice(ix+my_ix, item.to_s)
|
163
|
+
my_ix +=1
|
164
|
+
end
|
165
|
+
my_ix
|
166
|
+
end
|
167
|
+
|
168
|
+
def menu_choice(ix, s)
|
169
|
+
Color.yellow{ ix.to_s } + '. ' + s.to_s
|
170
|
+
end
|
171
|
+
|
172
|
+
def menu_header(s)
|
173
|
+
Color.blue { s }
|
174
|
+
end
|
175
|
+
|
176
|
+
def write_menu(cfg)
|
177
|
+
ix = 1
|
178
|
+
# output.puts "Test Shops"
|
179
|
+
output.puts menu_header("Test Shops")
|
180
|
+
ix += output_menu_choices(cfg[:test_shops].keys.sort, ix)
|
181
|
+
|
182
|
+
output.puts
|
183
|
+
output.puts menu_header("Local Apps")
|
184
|
+
ix += output_menu_choices(cfg[:apps][:development].keys.sort, ix)
|
185
|
+
|
186
|
+
output.puts
|
187
|
+
output.puts menu_header("Heroku Apps")
|
188
|
+
ix += output_menu_choices(cfg[:apps][:heroku].keys.sort, ix)
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
end
|
193
|
+
|
194
|
+
Pry::Commands.import shopifydev_command_set
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require "logger"
|
2
|
+
require "shopify_api"
|
3
|
+
|
4
|
+
module Shopifydev
|
5
|
+
class Shop
|
6
|
+
attr_accessor :credentials, :logger, :project_root
|
7
|
+
|
8
|
+
def initialize(credentials)
|
9
|
+
@credentials = credentials
|
10
|
+
@logger = Logger.new(STDOUT)
|
11
|
+
|
12
|
+
ShopifyAPI::Base.site = "https://" +
|
13
|
+
credentials['api_key'] + ':' +
|
14
|
+
credentials['password'] + '@' +
|
15
|
+
credentials['url'] + '/admin'
|
16
|
+
logger.debug("set shopify site to #{ShopifyAPI::Base.site}")
|
17
|
+
end
|
18
|
+
|
19
|
+
def project_root
|
20
|
+
@project_root ||= ENV['PATCHIFY_ROOT'] || begin
|
21
|
+
if credentials['project_root_variable']
|
22
|
+
ENV[credentials['project_root_variable']] || credentials['project_root']
|
23
|
+
else
|
24
|
+
credentials['project_root']
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def template
|
30
|
+
@template ||= Template.new(self, project_root)
|
31
|
+
end
|
32
|
+
|
33
|
+
def asset(path)
|
34
|
+
Asset.new(self, path, project_root)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module Shopifydev
|
5
|
+
class Template
|
6
|
+
|
7
|
+
attr_accessor :shop, :project_root
|
8
|
+
|
9
|
+
def initialize(shop, project_root)
|
10
|
+
@shop = shop
|
11
|
+
@project_root = project_root
|
12
|
+
end
|
13
|
+
|
14
|
+
def download(root=nil)
|
15
|
+
root ||= FileUtils.pwd
|
16
|
+
shop.logger.info("Downloading all pages from #{shop.credentials['url']}")
|
17
|
+
|
18
|
+
begin
|
19
|
+
response = ShopifyAPI::Asset.find(:all) # get all them assets
|
20
|
+
get_list_of_assets(response).each {| key, file | write_local_copy(file) }
|
21
|
+
rescue SocketError => e
|
22
|
+
puts e.message
|
23
|
+
puts "Maybe check your internet connection?"
|
24
|
+
rescue NoMethodError => e
|
25
|
+
puts e.message
|
26
|
+
rescue ActiveResource::UnauthorizedAccess => e
|
27
|
+
puts e.message
|
28
|
+
puts "Make sure you have the right password set in .shopifydev.yaml"
|
29
|
+
rescue Exception => e
|
30
|
+
puts e.message
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def write_local_copy(file)
|
35
|
+
|
36
|
+
directory_path = Pathname.new(@project_root +
|
37
|
+
File::Separator +
|
38
|
+
file.dirname.to_path)
|
39
|
+
|
40
|
+
directory_path.mkpath unless (directory_path.exist?)
|
41
|
+
|
42
|
+
begin
|
43
|
+
puts "downloading #{file.basename}"
|
44
|
+
asset = get_asset(file.to_path)
|
45
|
+
rescue SocketError => e
|
46
|
+
puts e.message
|
47
|
+
puts "The connection was interupted while downloading #{file.to_path}."
|
48
|
+
end
|
49
|
+
|
50
|
+
# TODO maybe this should compare timestamps?
|
51
|
+
File.open((directory_path.realdirpath + file.basename).to_path, 'w') do |f|
|
52
|
+
puts "writing #{directory_path.to_path + File::Separator + file.basename.to_path}"
|
53
|
+
f.write(asset.value)
|
54
|
+
puts "---"
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def get_list_of_assets(response)
|
59
|
+
response.reverse.inject({}) do | list, asset_info |
|
60
|
+
pathname = Pathname.new(asset_info.attributes["key"])
|
61
|
+
path = pathname.to_path
|
62
|
+
|
63
|
+
list[path] = pathname unless list.keys.include?(path + '.liquid')
|
64
|
+
list
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def get_asset(key)
|
69
|
+
ShopifyAPI::Asset.find(key)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
data/lib/shopifydev.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
require_relative "shopifydev/version"
|
2
|
+
require_relative "shopifydev/config"
|
3
|
+
require_relative "shopifydev/shop"
|
4
|
+
require_relative "shopifydev/template"
|
5
|
+
require_relative "shopifydev/asset"
|
6
|
+
require_relative "shopifydev/commands"
|
7
|
+
require_relative "shopifydev/railtie" if defined?(Rails)
|
8
|
+
|
9
|
+
module Shopifydev
|
10
|
+
end
|
data/shopifydev.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'shopifydev/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "shopifydev"
|
8
|
+
gem.version = Shopifydev::VERSION
|
9
|
+
gem.authors = ["Michael Johnston"]
|
10
|
+
gem.email = ["lastobelus@mac.com"]
|
11
|
+
gem.description = %q{Tools for using SCM with shopify.}
|
12
|
+
gem.summary = %q{Abstract out and port to ruby the functionality of the shopify textmate bundle for use in other editors.}
|
13
|
+
gem.homepage = ""
|
14
|
+
|
15
|
+
gem.files = `git ls-files`.split($/)
|
16
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
17
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
18
|
+
gem.require_paths = ["lib"]
|
19
|
+
|
20
|
+
gem.add_dependency "shopify_api", ">= 3.0.0"
|
21
|
+
gem.add_dependency "ruby-filemagic", ">= 0.4.2"
|
22
|
+
gem.add_dependency "gli", ">= 2.5.2"
|
23
|
+
|
24
|
+
# for console
|
25
|
+
gem.add_dependency 'oj'
|
26
|
+
gem.add_dependency 'dalli'
|
27
|
+
gem.add_dependency 'shydra'
|
28
|
+
gem.add_dependency 'pry'
|
29
|
+
gem.add_dependency 'activesupport'
|
30
|
+
gem.add_dependency 'term-ansicolor'
|
31
|
+
|
32
|
+
# for generators
|
33
|
+
gem.add_dependency 'railties'
|
34
|
+
gem.add_development_dependency "rake"
|
35
|
+
end
|
@@ -0,0 +1,109 @@
|
|
1
|
+
{% layout settings.customer_layout %}
|
2
|
+
|
3
|
+
<div id="admin_header">
|
4
|
+
<h2 class="title">Order {{ order.name }}</h2>
|
5
|
+
</div>
|
6
|
+
|
7
|
+
{% if order.cancelled %}
|
8
|
+
<div id="order_cancelled" class="flash notice">
|
9
|
+
<h5 id="order_cancelled_title">Order Cancelled <span class="note">on {{ order.cancelled_at | date: "%B %d, %Y %I:%M%p" }}</span></h5>
|
10
|
+
<span class="note">{{ order.cancel_reason }}</span>
|
11
|
+
</div>
|
12
|
+
{% endif %}
|
13
|
+
|
14
|
+
<div class="note order_date">Placed on {{ order.created_at | date: "%B %d, %Y %I:%M%p" }}</div>
|
15
|
+
|
16
|
+
<div id="order_address" class="group">
|
17
|
+
<div id="order_payment">
|
18
|
+
<h3>Billing Address</h3>
|
19
|
+
<p><span class="note">Payment Status:</span> <span class="status_{{ order.financial_status }}">{{ order.financial_status }}</span></p>
|
20
|
+
<div class="address note">
|
21
|
+
<p>{{ order.billing_address.name }}</p>
|
22
|
+
<p>{{ order.billing_address.company }}</p>
|
23
|
+
<p>{{ order.billing_address.street }}</p>
|
24
|
+
<p>{{ order.billing_address.city }}, {{ order.billing_address.province }}</p>
|
25
|
+
<p>{{ order.billing_address.country }} {{ order.billing_address.zip }}</p>
|
26
|
+
<p>{{ order.billing_address.phone }}</p>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
{% if order.shipping_address %}
|
30
|
+
<div id="order_shipping">
|
31
|
+
<h3>Shipping Address</h3>
|
32
|
+
<p><span class="note">Fulfillment Status:</span> <span class="status_{{ order.fulfillment_status }}">{{ order.fulfillment_status }}</span></p>
|
33
|
+
<div class="address note">
|
34
|
+
<p>{{ order.shipping_address.name }}</p>
|
35
|
+
<p>{{ order.shipping_address.company }}</p>
|
36
|
+
<p>{{ order.shipping_address.street }}</p>
|
37
|
+
<p>{{ order.shipping_address.city }}, {{ order.shipping_address.province }}</p>
|
38
|
+
<p>{{ order.shipping_address.country }} {{ order.shipping_address.zip }}</p>
|
39
|
+
<p>{{ order.shipping_address.phone }}</p>
|
40
|
+
</div>
|
41
|
+
</div>
|
42
|
+
{% endif %}
|
43
|
+
</div>
|
44
|
+
|
45
|
+
<table id="order_details">
|
46
|
+
<thead>
|
47
|
+
<tr id="cart-heading">
|
48
|
+
<th class="cart-header first" id="product"><h3>Product</h3></th>
|
49
|
+
<th class="cart-header first" id="sku"><h3>SKU</h3></th>
|
50
|
+
<th class="cart-header first" id="price"><h3>Price</h3></th>
|
51
|
+
<th class="cart-header first" id="quantity"><h3>Quantity</h3></th>
|
52
|
+
<th class="cart-header first" id="total"><h3>Total</h3></th>
|
53
|
+
</tr>
|
54
|
+
</thead>
|
55
|
+
<tbody>
|
56
|
+
{% for line_item in order.line_items %}
|
57
|
+
<tr id="{{ line_item.id }}" class="order cart-item {% cycle 'odd', 'even' %}">
|
58
|
+
<td class="product">
|
59
|
+
{{ line_item.title | link_to: line_item.product.url }}
|
60
|
+
{% if line_item.fulfillment %}
|
61
|
+
<div class="note">
|
62
|
+
Fulfilled {{ line_item.fulfillment.created_at | date: "%b %d" }}
|
63
|
+
{% if line_item.fulfillment.tracking_number %}
|
64
|
+
<a href="{{ line_item.fulfillment.tracking_url }}">{{ line_item.fulfillment.tracking_company }} #{{ line_item.fulfillment.tracking_number}}</a>
|
65
|
+
{% endif %}
|
66
|
+
</div>
|
67
|
+
{% endif %}
|
68
|
+
</td>
|
69
|
+
<td class="sku note">{{ line_item.sku }}</td>
|
70
|
+
<td class="money">{{ line_item.price | money }}</td>
|
71
|
+
<td class="quantity cente">{{ line_item.quantity }}</td>
|
72
|
+
<td class="total money">{{ line_item.quantity | times: line_item.price | money }}</td>
|
73
|
+
</tr>
|
74
|
+
{% endfor %}
|
75
|
+
</tbody>
|
76
|
+
<tfoot>
|
77
|
+
<tr class="order_summary note">
|
78
|
+
<td class="label" colspan="4">Subtotal:</td>
|
79
|
+
<td class="total money">{{ order.subtotal_price | money }}</td>
|
80
|
+
</tr>
|
81
|
+
|
82
|
+
{% for discount in order.discounts %}
|
83
|
+
<tr class="order_summary discount">
|
84
|
+
<td class="label" colspan="4">{{ discount.code }} Discount:</td>
|
85
|
+
<td class="total money">{{ discount.savings | money }}</td>
|
86
|
+
</tr>
|
87
|
+
{% endfor %}
|
88
|
+
|
89
|
+
{% for shipping_method in order.shipping_methods %}
|
90
|
+
<tr class="order_summary note">
|
91
|
+
<td class="label" colspan="4">Shipping ({{ shipping_method.title }}):</td>
|
92
|
+
<td class="total money">{{ shipping_method.price | money }}</td>
|
93
|
+
</tr>
|
94
|
+
{% endfor %}
|
95
|
+
|
96
|
+
{% for tax_line in order.tax_lines %}
|
97
|
+
<tr class="order_summary note">
|
98
|
+
<td class="label" colspan="4">Tax ({{ tax_line.title }} {{ tax_line.rate | times: 100 }}%):</td>
|
99
|
+
<td class="total money">{{ tax_line.price | money }}</td>
|
100
|
+
</tr>
|
101
|
+
{% endfor %}
|
102
|
+
|
103
|
+
<tr class="order_summary order_total">
|
104
|
+
<td class="label" colspan="4">Total:</td>
|
105
|
+
<td class="total money">{{ order.total_price | money }} {{ order.currency }}</td>
|
106
|
+
</tr>
|
107
|
+
</tfoot>
|
108
|
+
</table>
|
109
|
+
|
@@ -0,0 +1,42 @@
|
|
1
|
+
{% layout settings.customer_layout %}
|
2
|
+
|
3
|
+
<div id="template">
|
4
|
+
<div id="customer">
|
5
|
+
<!-- Create Customer -->
|
6
|
+
<div id="create-customer">
|
7
|
+
<div class="template_header">
|
8
|
+
<h2 class="title">Create Account</h2>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
{% form 'create_customer' %}
|
12
|
+
{{ form.errors | default_errors }}
|
13
|
+
|
14
|
+
<div id="first_name" class="clearfix large_form">
|
15
|
+
<label for="first_name" class="login">First Name</label>
|
16
|
+
<input type="text" value="" name="customer[first_name]" id="first_name" class="large" size="30" />
|
17
|
+
</div>
|
18
|
+
|
19
|
+
<div id="last_name" class="clearfix large_form">
|
20
|
+
<label for="last_name" class="login">Last Name</label>
|
21
|
+
<input type="text" value="" name="customer[last_name]" id="last_name" class="large" size="30" />
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div id="email" class="clearfix large_form">
|
25
|
+
<label for="email" class="login">Email Address</label>
|
26
|
+
<input type="email" value="" name="customer[email]" id="email" class="large" size="30" />
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div id="password" class="clearfix large_form">
|
30
|
+
<label for="password" class="login">Password</label>
|
31
|
+
<input type="password" value="" name="customer[password]" id="password" class="large password" size="30" />
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div class="action_bottom">
|
35
|
+
<input class="btn" type="submit" value="Create" />
|
36
|
+
<span class="note"> {{ 'Login' | customer_login_link }}</span>
|
37
|
+
<span class="note">or <a href="{{ shop.url }}">Return to Store</a></span>
|
38
|
+
</div>
|
39
|
+
{% endform %}
|
40
|
+
</div><!-- /#create-customer -->
|
41
|
+
</div>
|
42
|
+
</div>
|
@@ -0,0 +1,78 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
<div id="page" class="clearfix">
|
6
|
+
|
7
|
+
<div id="header">
|
8
|
+
<div class="wrapper">
|
9
|
+
<p><h1>{{ page.title }}</h1></p>
|
10
|
+
</div>
|
11
|
+
</div>
|
12
|
+
|
13
|
+
<div class="content">
|
14
|
+
<div class="wrapper">
|
15
|
+
|
16
|
+
<div id="contact-menu">
|
17
|
+
{% for link in linklists['footer-support'].links %}
|
18
|
+
{% if link.title == page.title %}
|
19
|
+
<p><a href="{{ link.url }}" id="active"><h4>{{ link.title }}</h4></a></p>
|
20
|
+
{% else %}
|
21
|
+
<p><a href="{{ link.url }}"><h4>{{ link.title }}</h4></a></p>
|
22
|
+
{% endif %}
|
23
|
+
{% endfor %}
|
24
|
+
</div>
|
25
|
+
|
26
|
+
<div id="contact-form">
|
27
|
+
|
28
|
+
{% if page.title == "Contact" %}
|
29
|
+
|
30
|
+
{% form 'contact' %}
|
31
|
+
|
32
|
+
{% if form.posted_successfully? %}
|
33
|
+
Thanks for contacting us! We'll get back to you as soon as possible.
|
34
|
+
{% endif %}
|
35
|
+
|
36
|
+
{% if form.errors %}
|
37
|
+
{% for field in form.errors %}
|
38
|
+
<div>
|
39
|
+
<p id="error_message">{{ field }} - {{ form.errors.messages[field] }}</p>
|
40
|
+
</div>
|
41
|
+
{% endfor %}
|
42
|
+
{% endif %}
|
43
|
+
|
44
|
+
<div id="getintouch" style="float:left">
|
45
|
+
<h3>Get In Touch</h3>
|
46
|
+
<hr>
|
47
|
+
<small>* indicates a required field</small><br>
|
48
|
+
<input type="text" value="Full Name" name="contact[name]"> <br>
|
49
|
+
<input type="text" value="Email Address" name="contact[email]"> <span class="required"> *</span> <br>
|
50
|
+
<textarea cols="38" rows="5" type="text" name="contact[message]">your message</textarea>
|
51
|
+
<input type="image" src="{{ 'getintouch.png' | asset_url }}" class="submit">
|
52
|
+
</div>
|
53
|
+
{% endform %}
|
54
|
+
|
55
|
+
|
56
|
+
<div id="contact-info">
|
57
|
+
<h3>Visit Our Store</h3>
|
58
|
+
<hr>
|
59
|
+
<p>Suite A - 123 Something Street <br>
|
60
|
+
Vancouver, BC Postal Code <br>
|
61
|
+
Canada</p>
|
62
|
+
</div>
|
63
|
+
|
64
|
+
<div id="contact-info">
|
65
|
+
<h3>Customer Support</h3>
|
66
|
+
<hr>
|
67
|
+
<p>(800)123-1234 <br>
|
68
|
+
support@elroy.com</p>
|
69
|
+
</div>
|
70
|
+
{% else %}
|
71
|
+
{{ page.content }}
|
72
|
+
{% endif %}
|
73
|
+
|
74
|
+
</div>
|
75
|
+
|
76
|
+
</div>
|
77
|
+
</div>
|
78
|
+
</div> <!-- /#page -->
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div id="page" class="clearfix">
|
2
|
+
|
3
|
+
<div id="header">
|
4
|
+
<div class="wrapper">
|
5
|
+
<p><h1>{{ page.title }}</h1></p>
|
6
|
+
</div>
|
7
|
+
</div>
|
8
|
+
|
9
|
+
<div class="content">
|
10
|
+
<div class="wrapper">
|
11
|
+
|
12
|
+
<div id="contact-form">
|
13
|
+
{{ page.content }}
|
14
|
+
</div>
|
15
|
+
|
16
|
+
</div>
|
17
|
+
</div>
|
18
|
+
</div> <!-- /#page -->
|