Project

General

Profile

Customization » History » Version 15

Phil Hodgson, 11/24/2014 07:33 AM

1 1 Phil Hodgson
h1. Customization
2
3 13 Phil Hodgson
h2. Configuration File Options
4
5
The settings of the @config/config.yml@ file can be set to override the settings of the @config/config.defaults.yml@ file.
6
7
h3. email_enrollment_submitted_notification
8
9
Set this variable to @true@ to send the email in @app/views/user_mailer/enrollment_submitted_notification.text.erb@. See below (in the section on Overriding Default Views) for instructions on how to safely alter the contents of this email.
10
11 6 Phil Hodgson
h2. Enabling and Disabling "Sections" of Tapestry
12
13
Tapestry has been divided into a handful of logical "sections". To date, they are:
14
15
* Section::SIGNUP
16 14 Phil Hodgson
17
bq. Removing this Section will make it impossible to create a new login account.
18
19
* Section::ENROLL
20
21
bq. Removing this Section will display the contents of the file @app/views/pages/_enrollment_disabled_notice.html.erb@ instead of allowing the user to go through the enrollment process.
22
23 6 Phil Hodgson
* Section::PUBLIC_DATA
24 14 Phil Hodgson
25
bq. Removing this Section will hide and disallow access to the various pages normally seen in the "Public Data" application menu.
26
27 8 Phil Hodgson
* Section::PUBLIC_PROFILE
28 14 Phil Hodgson
29
bq. Removing this Section will make all access to Public Profiles, by anyone disallowed, and links to these hidden.
30
31 6 Phil Hodgson
* Section::GOOGLE_SURVEYS
32 14 Phil Hodgson
33
bq. Removing this Section makes all mention of and access to the Google Surveys disappear.
34
35 6 Phil Hodgson
* Section::SAMPLES
36 14 Phil Hodgson
37
bq. Removing this Section specifically hides mention of and disallows access to the "Samples" part of Public Data.
38
39 9 Phil Hodgson
* Section::CCR
40 14 Phil Hodgson
41
bq. Removing this Section specifically hides mention of and disallows access to the functionality for uploading CCR XML files.
42 6 Phil Hodgson
43 15 Phil Hodgson
* Section::REAL_NAMES
44
45
bq. Enabling this section makes it possible for a user to add or remove the display of their Real Name from their Public Profile.
46
47
* Section::SHIPPING_ADDRESS
48
49
bq. Enabling this section makes it possible for a user to specify their Shipping Address.
50
51 6 Phil Hodgson
In your @config.yml@ file you can specify an array of these and assign it to the @enabled_sections@ config parameter. An example is in the @config.defaults.yml@, where only @Section::SIGNUP@ is enabled by default.
52
53
Furthermore, in your overridden views, partials, etc. (see section below) you can use embedded Ruby to access which sections are enabled with the @include_section?@ helper method. Search in the source code for examples.
54
55 12 Phil Hodgson
h2. Overriding Default Views, Partials, Templates, eMails etc.
56 2 Phil Hodgson
57
It is possible to override any Rails view in the application by mimicking the directory structure in @app/views@ but under another folder @site_specific/app/views@. For example, to use your own version of @_dashboard.html.erb@ in @app/views/pages@ you would put it in @site_specific/app/views/pages@.
58 1 Phil Hodgson
59 6 Phil Hodgson
You can override the @#{Rails.root}/site_specific@ folder itself with the environment variable @TAPESTRY_OVERRIDE_PATH@, so that the folder can be left entirely outside of the Tapestry code base.
60 2 Phil Hodgson
61
It is important to understand that including this folder, any subfolders, and all files is _optional_. If you do not wish to override a particular view, leave it out of the override folder.
62 3 Phil Hodgson
63
h3. Caveat
64
65
_This statement to be followed up after more investigation._
66
67
It is my impression that when using multiple paths that the technique of using @explicitly_unloadable_constants@ for having files reload without restarting the server will not work properly. This could mean that while developing these site-specific files that the server has to be restarted after each change.
68
69
h3. Overriding @lib@ Files
70
71
The same logic works for files in the override path under the @lib@ subfolder, i.e. either @#{Rails.root}/site_specific/lib@ or @#{ENV['TAPESTRY_OVERRIDE_PATH']}/lib@.
72
73
h2. Adding Custom Questions to the "Participation Consent" Form
74
75
Currently this text and form are found in @views/participation_consents/show.html.erb@. This currently saves the user's responses in the InformedConsentResponse model. There is in this model a field called "other_answers" that is a serialized Hash where any number of "dynamically defined" answers can be saved with keys of your choosing. To accomplish this you have to add form inputs that end up with a @name@ attribute that looks like (e.g. to record "age"): @other_answers[age]@ and it will be recorded in the "other_answers" Hash in the model under the :age key.
76
77
There is a view helper for creating radio boxes for the participation concept form using this "other_answers" field. Example:
78
79
<pre>
80
  <div class="consent-form-question">
81
    <p>
82
      Would you judge yourself to be sane?
83
      <%= radio_answers( 'sanity', [['0', 'No'],
84
                                    ['1', 'Sometimes'],
85
                                    ['2', 'Yes']] ) %>
86
    </p>
87
  </div>
88
</pre>
89
90 4 Phil Hodgson
There are also helpers for text areas (@text_area_answer@) and standard input texts (@text_field_answer@). For example:
91 3 Phil Hodgson
92 4 Phil Hodgson
<pre>
93
  <div class="consent-form-question">
94
    <p>
95
      If sane only sometimes, please explain when and for what reason this occurs:
96
    </p>
97
    <p>
98
      <%= text_area_answer 'reason_sometimes_sane', { :cols => 60, :rows => 3 } %>
99
    </p>
100
  </div>
101
</pre>
102
103
104 3 Phil Hodgson
h3. Adding Custom Validation of Your Custom Question
105 1 Phil Hodgson
106 4 Phil Hodgson
This is done by adding a site-specific validations file in the @lib@ "override" folder, in the @lib/site_specific/validations.rb@ module. First place the following code in the file:
107 3 Phil Hodgson
108 1 Phil Hodgson
<pre>
109 4 Phil Hodgson
module SiteSpecific
110
  module Validations
111
    extend ActiveSupport::Concern
112
113
    # *Do not remove this +included+ block!* It is what works the magic.
114
    included do
115
      method_name = "#{self.name.to_s.underscore}_validations"
116
      validate method_name if method_defined? method_name
117
    end
118
119
  end
120
end
121
</pre>
122
123
Then after this insert a method called @informed_consent_response_validations@ (after the name of the model relevant to the Participation Consent form). You can check @other_answers@ and add errors in the standard ActiveRecord way. For example:
124
125
<pre>
126 1 Phil Hodgson
    def informed_consent_response_validations
127 4 Phil Hodgson
      case self.other_answers[:sanity]
128
      when '2'
129 1 Phil Hodgson
        errors.add( :other_answers, :sanity_not_permitted)
130 4 Phil Hodgson
      when '1'
131
        if self.other_answers[:reason_sometimes_sane].blank?
132
          errors.add( :other_answers, :explain_occasional_sanity )
133
        end
134 3 Phil Hodgson
      end
135 1 Phil Hodgson
    end
136 3 Phil Hodgson
</pre>
137
138 4 Phil Hodgson
The messages should be placed in your locale file under:
139 3 Phil Hodgson
140
<pre>
141
en:
142
  activerecord:
143
    errors:
144 1 Phil Hodgson
      models:
145
        informed_consent_response:
146
          attributes:
147
            other_answers:
148 4 Phil Hodgson
              sanity_not_permitted:
149
                You are not permitted to be sane.
150
              explain_occasional_sanity:
151
                Please explain when and why you are sometimes sane.
152 3 Phil Hodgson
</pre>
153 4 Phil Hodgson
154 1 Phil Hodgson
See the documentation on [[Internationalization]] for where to put this.
155 6 Phil Hodgson
156
h2. Overriding the Validations on Any Model
157
158
The above section explaining how to override validations for the @InformedConsentResponse@ model can serve as an example for the general case. There is only one change required to the Tapestry source code base. In general, this is discouraged, so you should consider contacting the Tapestry development team and letting them know that you've found a need to override validation on a particular model, but the change is slight and easy to deal with in future merges. Basically, you must insert, _after any model validations_, the following line:
159
160
<pre>
161
  include SiteSpecific::Validations rescue {}
162
</pre>
163
164
If you do not insert this line after any of the model validations already present in the model class, you will not be able to override them. An example is already in the model for ShippingAddress (@app/models/shipping_address.rb@), where a site may want to allow specifying "State" to be optional:
165
166
<pre>
167
  validates_presence_of     :user_id
168
  validates_presence_of     :address_line_1
169
  validates_presence_of     :city
170
  validates_presence_of     :state
171
  validates_presence_of     :zip
172
  validates_presence_of     :phone
173
174
  include SiteSpecific::Validations rescue {}
175
</pre>
176
177
Note that the @include@ is _after_ the list of @validates_presence_of@ directives. This allows any of those validations to be effectively reversed. So, in your site-specific override folder, in your @lib/site_specific/validations.rb@ file (also see example above for Consent Questions), you would simply add the following method:
178
179
<pre>
180
    def shipping_address_validations
181
      # allow invalid "state" field
182
      errors.delete(:state)
183
    end
184
</pre>
185 5 Phil Hodgson
186 7 Phil Hodgson
To remove the State field from the user interface entirely you'l also want to remove it from the relevant view, which for ShippingAddress is the partial in your site-override folder under @app/views/shipping_addresses/_form.html.erb@. Simply copy the @_form.html.erb@ file from the original source code tree and then *remove* the following lines:
187
188
<pre>
189
  <div class="field">
190
    <span style="color: red"> * </span><%= f.label :state %><br />
191
    <%= f.state_select(:state, 'US', {:include_blank => "Select a State", :selected => @shipping_address.state }, { :style => "width: 230px;"}) -%>
192
  </div>
193
</pre>
194
195
Or remove the @<span style="color: red"> * </span>@ to show it as non-mandatory. (For information on the @state_select@ method, see the documentation for the @carmen@ gem.)
196
197 5 Phil Hodgson
h4. Automatic Reloading of the Validations Override During Development
198
199
As shown in the @development.rb.example@ file, you can add the following line to your @development.rb@ to have validation override changes automatically reload without having to restart your Rails server:
200
201
<pre>
202
ActiveSupport::Dependencies.explicitly_unloadable_constants << 'SiteSpecific::Validations'
203
</pre>
204 11 Phil Hodgson
205
h2. Custom Validation of Postal Codes ("Zip" Codes)
206
207
Currently for the "Geographic Information Survey" and the "Residency Response" question there are input for a Postal Code. There is a central validation for these Postal Codes. To change it, in your config.yml you can override the config.defaults.yml file key with your own regular expression. Note that you should leave the YAML data type directive in, and also the single quotes (although if they get in the way there are many different ways to do quoting in YAML: check the specifications at http://www.yaml.org/
208
209
<pre>
210
  zip_validation: !ruby/regexp '/^[A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d$/'
211
</pre>
212
213
Next you'll want to change the validation error message. For the "Geographic Information Survey", the Postal Code is saved in the @User@ model in the @zip@ attribute, and this message is currently meant to be used as the default and central message for any Postal Code validation problems. To override, in the locales file location described in [[Internationalization]] add the following key:
214
215
<pre>
216
en:
217
  activerecord:
218
    errors:
219
      models:
220
        user:
221
          attributes:
222
            zip:
223
              invalid:
224
                'should be in Canadian Postal Code format (A1A-1A1)'
225
</pre>