radiant-forms-extension 2.0.1 → 3.1.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/README.md +85 -14
- data/VERSION +1 -1
- data/app/controllers/forms_controller.rb +34 -17
- data/app/models/form.rb +7 -1
- data/app/models/form_mail.rb +118 -0
- data/app/models/form_mailer.rb +16 -0
- data/app/models/response.rb +6 -1
- data/config/routes.rb +1 -1
- data/db/migrate/20100929150423_change_to_updated_by_id.rb +15 -0
- data/forms_extension.rb +12 -8
- data/lib/forms/config.rb +30 -0
- data/lib/forms/controllers/application_controller.rb +39 -0
- data/lib/forms/controllers/site_controller.rb +13 -0
- data/lib/forms/interface/forms.rb +25 -0
- data/lib/forms/models/extension.rb +25 -0
- data/lib/forms/models/page.rb +14 -0
- data/lib/forms/tags/core.rb +201 -0
- data/lib/forms/tags/helpers.rb +54 -0
- data/lib/forms/tags/responses.rb +58 -0
- data/radiant-forms-extension.gemspec +16 -12
- data/spec/controllers/forms_controller_spec.rb +13 -13
- data/spec/datasets/forms.rb +4 -4
- data/spec/lib/forms/tags_spec.rb +3 -14
- data/spec/models/response_spec.rb +2 -2
- metadata +29 -13
- data/lib/forms/addon_methods.rb +0 -14
- data/lib/forms/admin_ui.rb +0 -23
- data/lib/forms/application_controller_extensions.rb +0 -20
- data/lib/forms/page_extensions.rb +0 -6
- data/lib/forms/site_controller_extensions.rb +0 -19
- data/lib/forms/tags.rb +0 -277
- data/spec/lib/forms/addon_methods_spec.rb +0 -41
data/lib/forms/admin_ui.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Forms
|
2
|
-
module AdminUI
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.class_eval do
|
6
|
-
attr_accessor :form
|
7
|
-
alias_method :forms, :form
|
8
|
-
protected
|
9
|
-
def load_default_form_regions
|
10
|
-
returning OpenStruct.new do |form|
|
11
|
-
form.edit = Radiant::AdminUI::RegionSet.new do |edit|
|
12
|
-
edit.main.concat %w{edit_header edit_form}
|
13
|
-
edit.form.concat %w{edit_title edit_content}
|
14
|
-
edit.form_bottom.concat %w{edit_buttons edit_timestamp}
|
15
|
-
end
|
16
|
-
form.new = form.edit
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
end
|
23
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
module Forms
|
2
|
-
module ApplicationControllerExtensions
|
3
|
-
def self.included(base)
|
4
|
-
base.class_eval {
|
5
|
-
helper_method :current_response
|
6
|
-
|
7
|
-
def current_response
|
8
|
-
if request.session[:form_response]
|
9
|
-
@response = Response.find(request.session[:form_response])
|
10
|
-
else
|
11
|
-
@response = Response.create
|
12
|
-
request.session = @response.id
|
13
|
-
end
|
14
|
-
|
15
|
-
@response
|
16
|
-
end
|
17
|
-
}
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Forms
|
2
|
-
module SiteControllerExtensions
|
3
|
-
def self.included(base)
|
4
|
-
base.class_eval {
|
5
|
-
before_filter :find_response
|
6
|
-
|
7
|
-
def find_response
|
8
|
-
if request.session[:form_response]
|
9
|
-
@response = Response.find(request.session[:form_response])
|
10
|
-
else
|
11
|
-
@response = nil
|
12
|
-
end
|
13
|
-
|
14
|
-
@response
|
15
|
-
end
|
16
|
-
}
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
data/lib/forms/tags.rb
DELETED
@@ -1,277 +0,0 @@
|
|
1
|
-
module Forms
|
2
|
-
module Tags
|
3
|
-
include Radiant::Taggable
|
4
|
-
|
5
|
-
class TagError < StandardError; end
|
6
|
-
|
7
|
-
desc %{
|
8
|
-
Render a form and its contents
|
9
|
-
<pre><code><r:form name="object[key]" [method, url] /></code></pre>
|
10
|
-
|
11
|
-
* *name* the name of the form
|
12
|
-
* *method* url submission method [ post, get, delete, put ]
|
13
|
-
* *url* address to submit the form to
|
14
|
-
}
|
15
|
-
tag 'form' do |tag|
|
16
|
-
|
17
|
-
unless tag.attr['name'].blank?
|
18
|
-
if tag.locals.form = Form.find_by_title(tag.attr['name'])
|
19
|
-
tag.attr['id'] ||= 'form_' + tag.locals.form.title
|
20
|
-
tag.attr['method'] ||= 'post'
|
21
|
-
tag.attr['action'] ||= tag.locals.form.action.blank? ? "/forms/#{tag.locals.form.id}" : tag.locals.form.action
|
22
|
-
return render_form(tag.locals.form, tag)
|
23
|
-
else
|
24
|
-
raise TagError, "Could not find '#{tag.attr['name']}' form"
|
25
|
-
end
|
26
|
-
else
|
27
|
-
tag.expand
|
28
|
-
end
|
29
|
-
|
30
|
-
end
|
31
|
-
|
32
|
-
desc %{
|
33
|
-
Render a @<label />@ tag to be used inside a form
|
34
|
-
<pre><code><r:form:label for="object[key]" /></code></pre>
|
35
|
-
|
36
|
-
**Required**
|
37
|
-
* *for* the name of the field you are relating the tag to
|
38
|
-
|
39
|
-
_A label is a piece of text which activates its related input when clicked_
|
40
|
-
}
|
41
|
-
tag 'form:label' do |tag|
|
42
|
-
raise_error_if_missing 'form:label', tag.attr, 'for'
|
43
|
-
|
44
|
-
tag.attr['for'] = tag.attr['for'].gsub('[','_').gsub(']','') unless tag.attr['for'].nil?
|
45
|
-
|
46
|
-
%(<label #{form_attrs(tag)}>#{tag.expand}</label>)
|
47
|
-
end
|
48
|
-
|
49
|
-
%w(text password reset checkbox radio hidden file button).each do |type|
|
50
|
-
desc %{
|
51
|
-
Render a @<#{type}>...</#{type}>@ tag to be used in a form
|
52
|
-
<pre><code><r:form:#{type} name="object[key]" /></code></pre>
|
53
|
-
|
54
|
-
**Required**
|
55
|
-
* *name* the name of the data to be sent
|
56
|
-
|
57
|
-
**Optional**
|
58
|
-
* *class* css class names
|
59
|
-
* *placeholder* default text, which is cleared when clicked
|
60
|
-
* *maxlength* the maximum amount of characters
|
61
|
-
}
|
62
|
-
tag "form:#{type}" do |tag|
|
63
|
-
raise_error_if_missing "form:#{type}", tag.attr, 'name'
|
64
|
-
|
65
|
-
value = tag.attr['value']
|
66
|
-
tag.attr['type'] = type
|
67
|
-
|
68
|
-
%(<input type="#{type}" value="#{value}" #{form_attrs(tag)} />)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
|
-
desc %{
|
73
|
-
Renders a @<select>...</select>@ tag to be used in a form
|
74
|
-
|
75
|
-
<pre><code><r:form:select name="object[key]"><r:option value="text" /></r:form:select></code></pre>
|
76
|
-
|
77
|
-
**Required**
|
78
|
-
* *name* the name of the data to be sent
|
79
|
-
|
80
|
-
**Optional**
|
81
|
-
* *class* css class names
|
82
|
-
|
83
|
-
_@<r:option />@ tags may be nested inside the tag to automatically generate options_
|
84
|
-
}
|
85
|
-
tag 'form:select' do |tag|
|
86
|
-
raise_error_if_missing 'form:select', tag.attr, 'name'
|
87
|
-
|
88
|
-
tag.locals.parent_tag_name = tag.attr['name']
|
89
|
-
tag.locals.parent_tag_type = 'select'
|
90
|
-
|
91
|
-
%(<select #{form_attrs(tag)}>#{tag.expand}</select>)
|
92
|
-
end
|
93
|
-
|
94
|
-
desc %{
|
95
|
-
Renders a series of @<input type="radio"/>@ tags to be used in a form
|
96
|
-
|
97
|
-
<pre><code><r:form:radios name="object[value]" value="text"><r:option value="text" /></r:form:radios></code></pre>
|
98
|
-
|
99
|
-
**Required**
|
100
|
-
* *name* the name of the data to be sent
|
101
|
-
|
102
|
-
**Optional**
|
103
|
-
* *class* css class names
|
104
|
-
|
105
|
-
_@<r:option />@ tags may be nested inside the tag to automatically generate options_
|
106
|
-
}
|
107
|
-
tag 'form:radios' do |tag|
|
108
|
-
raise_error_if_missing 'form:radios', tag.attr, 'name'
|
109
|
-
|
110
|
-
tag.locals.parent_tag_name = tag.attr['name']
|
111
|
-
tag.locals.parent_tag_type = 'radios'
|
112
|
-
tag.expand
|
113
|
-
end
|
114
|
-
|
115
|
-
desc %{
|
116
|
-
Renders an @<option/>@ tag if the parent is a
|
117
|
-
@<r:form:select>...</r:form:select>@ or @<r:form:radios>...</r:form:radios>@
|
118
|
-
|
119
|
-
**Required**
|
120
|
-
* *value* the value you want to be sent if selected
|
121
|
-
}
|
122
|
-
tag 'form:option' do |tag|
|
123
|
-
value = tag.attr['value'] || tag.expand
|
124
|
-
|
125
|
-
if tag.locals.parent_tag_type == 'select'
|
126
|
-
text = tag.expand.length == 0 ? value : tag.expand
|
127
|
-
%(<option #{form_attrs(tag, { 'value' => value})}>#{text}</option>)
|
128
|
-
elsif tag.locals.parent_tag_type == 'radios'
|
129
|
-
name = tag.locals.parent_tag_type == 'radios' ? tag.locals.parent_tag_name : tag.attr['name']
|
130
|
-
id = name.gsub('[','_').gsub(']','') + '_' + value
|
131
|
-
%(<input #{form_attrs(tag, { 'id' => id, 'value' => value, 'name' => name, 'type' => 'radio' })} />)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
desc %{
|
136
|
-
Renders an @<input type="submit" />@ tag for a form.
|
137
|
-
|
138
|
-
**Optional**
|
139
|
-
* *value* the text on the submit
|
140
|
-
}
|
141
|
-
tag 'form:submit' do |tag|
|
142
|
-
value = tag.attr['value'] || 'submit'
|
143
|
-
|
144
|
-
%(<input #{form_attrs(tag, { 'value' => value, 'type' => 'submit', 'class' => 'submit', 'name' => 'submit' })} />)
|
145
|
-
end
|
146
|
-
|
147
|
-
desc %{
|
148
|
-
Allows access to the response of a submitted form
|
149
|
-
@<r:form:response>...<r:get /><r:clear />...</r:form:response>@
|
150
|
-
|
151
|
-
_Will not expand if a form has not been submitted or has been cleared_
|
152
|
-
}
|
153
|
-
tag 'form:response' do |tag|
|
154
|
-
tag.locals.form_response = find_form_response(tag)
|
155
|
-
|
156
|
-
tag.expand unless tag.locals.form_response.nil? or tag.locals.form_response.response.nil?
|
157
|
-
end
|
158
|
-
|
159
|
-
desc %{
|
160
|
-
Access the attributes of a submitted form.
|
161
|
-
|
162
|
-
@<r:form:get name=object[value]
|
163
|
-
}
|
164
|
-
tag 'form:response:clear' do |tag|
|
165
|
-
clear_form_response(tag)
|
166
|
-
|
167
|
-
return nil
|
168
|
-
end
|
169
|
-
|
170
|
-
desc %{
|
171
|
-
Access the attributes of a submitted form.
|
172
|
-
|
173
|
-
@<r:form:get name="object[value]" />@ an object which was submitted with the form
|
174
|
-
@<r:form:get name="mail_ext[value]" />@ a response to an extension which hooked the submission
|
175
|
-
|
176
|
-
_Refer to the readme on extensions to find out what they return_
|
177
|
-
}
|
178
|
-
tag 'form:response:get' do |tag|
|
179
|
-
raise_error_if_missing 'form:response:get', tag.attr, 'name'
|
180
|
-
|
181
|
-
results = hash_retrieve(tag.locals.form_response.result, tag.attr['name'])
|
182
|
-
end
|
183
|
-
|
184
|
-
# accessing data when processing a form
|
185
|
-
desc %{
|
186
|
-
Query the data from a submitted form
|
187
|
-
|
188
|
-
@<r:form:read name="object[value]" />@ access the object which was submitted
|
189
|
-
|
190
|
-
_This can only be used in the content section of a form, use @<r:form:get />@ in pages_
|
191
|
-
}
|
192
|
-
tag 'form:read' do |tag|
|
193
|
-
raise_error_if_missing 'form:read', tag.attr, 'name'
|
194
|
-
|
195
|
-
data = hash_retrieve(tag.locals.page.data, tag.attr['name']).to_s
|
196
|
-
end
|
197
|
-
|
198
|
-
protected
|
199
|
-
|
200
|
-
def form_attrs(tag, extras={})
|
201
|
-
@id = tag.attr['name'] || extras['name']
|
202
|
-
@id = @id || tag.attr['for'] + '_label' if tag.attr['for']
|
203
|
-
@id = @id.gsub('[','_').gsub(']','') unless @id.nil?
|
204
|
-
|
205
|
-
attrs = {
|
206
|
-
'id' => @id,
|
207
|
-
'class' => tag.attr['type'],
|
208
|
-
'name' => nil,
|
209
|
-
'for' => nil,
|
210
|
-
'method' => nil,
|
211
|
-
'action' => nil,
|
212
|
-
'placeholder' => nil,
|
213
|
-
'value' => nil,
|
214
|
-
'maxlength' => nil
|
215
|
-
}.merge(extras)
|
216
|
-
|
217
|
-
result = attrs.collect do |k,v|
|
218
|
-
v = (tag.attr[k] || v)
|
219
|
-
next if v.blank?
|
220
|
-
%(#{k}="#{v}")
|
221
|
-
end.reject{|e| e.blank?}
|
222
|
-
|
223
|
-
result.join(' ')
|
224
|
-
end
|
225
|
-
|
226
|
-
def prior_value(tag, tag_name=tag.attr['name'])
|
227
|
-
#TODO make work with hash_retrieve
|
228
|
-
end
|
229
|
-
|
230
|
-
def render_form(form, tag)
|
231
|
-
string = %(<form enctype="multipart/form-data" #{form_attrs(tag)}>\n)
|
232
|
-
string << %(<input type="hidden" name="page_id" value="#{tag.locals.page.id}" />\n)
|
233
|
-
string << %(<input type="hidden" name="form_id" value="#{tag.locals.form.id.to_s}" />\n)
|
234
|
-
string << "<r:form>"
|
235
|
-
string << form.body
|
236
|
-
string << "</r:form>"
|
237
|
-
string << %(</form>)
|
238
|
-
|
239
|
-
text = parse(string)
|
240
|
-
end
|
241
|
-
|
242
|
-
def raise_error_if_missing(tag_name, tag_attr, name)
|
243
|
-
raise "'#{tag_name}' tag requires a '#{name}' attribute" if tag_attr[name].blank?
|
244
|
-
end
|
245
|
-
|
246
|
-
def find_form_response(tag)
|
247
|
-
if tag.locals.form_response
|
248
|
-
tag.locals.form_response
|
249
|
-
elsif request.session[:form_response]
|
250
|
-
Response.find(request.session[:form_response])
|
251
|
-
else
|
252
|
-
nil
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
|
-
def clear_form_response(tag)
|
257
|
-
tag.locals.form_response.update_attribute('result', nil)
|
258
|
-
end
|
259
|
-
|
260
|
-
# takes object[key] or value
|
261
|
-
# Accesses the hash as hash[object][value]
|
262
|
-
# Accesses the value as hash[value]
|
263
|
-
def hash_retrieve(hash, array)
|
264
|
-
result = nil
|
265
|
-
|
266
|
-
unless hash.nil? or hash.empty?
|
267
|
-
data = array.gsub("[","|").gsub("]","").split("|") rescue nil
|
268
|
-
|
269
|
-
result = hash.fetch(data[0]) unless data.nil?
|
270
|
-
result = result.fetch(data[1]) unless data.nil? or data[1].nil?
|
271
|
-
end
|
272
|
-
|
273
|
-
result
|
274
|
-
end
|
275
|
-
|
276
|
-
end
|
277
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
-
|
3
|
-
describe Forms::AddonMethods do
|
4
|
-
dataset :forms, :pages
|
5
|
-
|
6
|
-
before :each do
|
7
|
-
@page = pages(:home)
|
8
|
-
@form = forms(:test)
|
9
|
-
end
|
10
|
-
|
11
|
-
context 'initializer' do
|
12
|
-
|
13
|
-
it 'should expect a form and page object' do
|
14
|
-
lambda { FormsTestController.new(@form, @page) }.should_not raise_error
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
context 'instance variables' do
|
20
|
-
|
21
|
-
before :each do
|
22
|
-
@forms_test = FormsTestController.new(@form, @page)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'should have a forms attribute' do
|
26
|
-
@forms_test.form.should be_an_instance_of(Form)
|
27
|
-
@forms_test.form.should == @form
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should have a page attribute' do
|
31
|
-
@forms_test.page.should be_an_instance_of(Page)
|
32
|
-
@forms_test.page.should == @page
|
33
|
-
end
|
34
|
-
|
35
|
-
it 'should have a data attribute' do
|
36
|
-
@forms_test.data.should == @page.data
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|