danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * This module provides a simple way to create forms and questionnaires.
|
danielebarchiesi@0
|
5 *
|
danielebarchiesi@0
|
6 * The initial development of this module was sponsered by ÅF Industri AB, Open
|
danielebarchiesi@0
|
7 * Source City and Karlstad University Library. Continued development sponsored
|
danielebarchiesi@0
|
8 * by Lullabot.
|
danielebarchiesi@0
|
9 *
|
danielebarchiesi@0
|
10 * @author Nathan Haug <nate@lullabot.com>
|
danielebarchiesi@0
|
11 */
|
danielebarchiesi@0
|
12
|
danielebarchiesi@0
|
13 /**
|
danielebarchiesi@0
|
14 * Implements hook_help().
|
danielebarchiesi@0
|
15 */
|
danielebarchiesi@0
|
16 function webform_help($section = 'admin/help#webform', $arg = NULL) {
|
danielebarchiesi@0
|
17 $output = '';
|
danielebarchiesi@0
|
18 switch ($section) {
|
danielebarchiesi@0
|
19 case 'admin/config/content/webform':
|
danielebarchiesi@0
|
20 module_load_include('inc', 'webform', 'includes/webform.admin');
|
danielebarchiesi@0
|
21 $type_list = webform_admin_type_list();
|
danielebarchiesi@0
|
22 $output = t('Webform enables nodes to have attached forms and questionnaires.');
|
danielebarchiesi@0
|
23 if ($type_list) {
|
danielebarchiesi@0
|
24 $output .= ' ' . t('To add one, create a !types piece of content.', array('!types' => $type_list));
|
danielebarchiesi@0
|
25 }
|
danielebarchiesi@0
|
26 else {
|
danielebarchiesi@0
|
27 $output .= ' <strong>' . t('Webform is currently not enabled on any content types.') . '</strong> ' . t('To use Webform, please enable it on at least one content type on this page.');
|
danielebarchiesi@0
|
28 }
|
danielebarchiesi@0
|
29 $output = '<p>' . $output . '</p>';
|
danielebarchiesi@0
|
30 break;
|
danielebarchiesi@0
|
31 case 'admin/content/webform':
|
danielebarchiesi@0
|
32 $output = '<p>' . t('This page lists all of the content on the site that may have a webform attached to it.') . '</p>';
|
danielebarchiesi@0
|
33 break;
|
danielebarchiesi@0
|
34 case 'admin/help#webform':
|
danielebarchiesi@0
|
35 module_load_include('inc', 'webform', 'includes/webform.admin');
|
danielebarchiesi@0
|
36 $types = webform_admin_type_list();
|
danielebarchiesi@0
|
37 if (empty($types)) {
|
danielebarchiesi@0
|
38 $types = t('Webform-enabled piece of content');
|
danielebarchiesi@0
|
39 $types_message = t('Webform is currently not enabled on any content types.') . ' ' . t('Visit the <a href="!url">Webform settings</a> page and enable Webform on at least one content type.', array('!url' => url('admin/config/content/webform')));
|
danielebarchiesi@0
|
40 }
|
danielebarchiesi@0
|
41 else {
|
danielebarchiesi@0
|
42 $types_message = t('Optional: Enable Webform on multiple types by visiting the <a href="!url">Webform settings</a> page.', array('!url' => url('admin/config/content/webform')));
|
danielebarchiesi@0
|
43 }
|
danielebarchiesi@0
|
44 $output = t("<p>This module lets you create forms or questionnaires and define their content. Submissions from these forms are stored in the database and optionally also sent by e-mail to a predefined address.</p>
|
danielebarchiesi@0
|
45 <p>Here is how to create one:</p>
|
danielebarchiesi@0
|
46 <ul>
|
danielebarchiesi@0
|
47 <li>!webform-types-message</li>
|
danielebarchiesi@0
|
48 <li>Go to <a href=\"!create-content\">Create content</a> and add a !types piece of content.</li>
|
danielebarchiesi@0
|
49 <li>After saving the new content, you will be redirected to the main field list of the form that will be created. Add the fields you would like on your form.</li>
|
danielebarchiesi@0
|
50 <li>Once finished adding fields, you may want to send e-mails to administrators or back to the user who filled out the form. Click on the <em>Emails</em> sub-tab underneath the <em>Webform</em> tab on the piece of content.</li>
|
danielebarchiesi@0
|
51 <li>Finally, visit the <em>Form settings</em> sub-tab under the <em>Webform</em> tab to configure remaining configurations options for your form.
|
danielebarchiesi@0
|
52 <ul>
|
danielebarchiesi@0
|
53 <li>Add a confirmation message and/or redirect URL that is to be displayed after successful submission.</li>
|
danielebarchiesi@0
|
54 <li>Set a submission limit.</li>
|
danielebarchiesi@0
|
55 <li>Determine which roles may submit the form.</li>
|
danielebarchiesi@0
|
56 <li>Advanced configuration options such as allowing drafts or show users a message indicating how they can edit their submissions.</li>
|
danielebarchiesi@0
|
57 </ul>
|
danielebarchiesi@0
|
58 </li>
|
danielebarchiesi@0
|
59 <li>Your form is now ready for viewing. After receiving submissions, you can check the results users have submitted by visiting the <em>Results</em> tab on the piece of content.</li>
|
danielebarchiesi@0
|
60 </ul>
|
danielebarchiesi@0
|
61 <p>Help on adding and configuring the components will be shown after you add your first component.</p>
|
danielebarchiesi@0
|
62 ", array('!webform-types-message' => $types_message, '!create-content' => url('node/add'), '!types' => $types));
|
danielebarchiesi@0
|
63 break;
|
danielebarchiesi@0
|
64 case 'node/%/webform/components':
|
danielebarchiesi@0
|
65 $output .= '<p>' . t('This page displays all the components currently configured for this webform node. You may add any number of components to the form, even multiple of the same type. To add a new component, fill in a name and select a type from the fields at the bottom of the table. Submit the form to create the new component or update any changed form values.') . '</p>';
|
danielebarchiesi@0
|
66 $output .= '<p>' . t('Click on any existing component\'s name to edit its settings.') . '</p>';
|
danielebarchiesi@0
|
67 break;
|
danielebarchiesi@0
|
68 case 'node/%/submission/%/resend':
|
danielebarchiesi@0
|
69 $output .= '<p>' . t('This form may be used to resend e-mails configured for this webform. Check the e-mails that need to be sent and click <em>Resend e-mails</em> to send these e-mails again.') . '</p>';
|
danielebarchiesi@0
|
70 break;
|
danielebarchiesi@0
|
71 }
|
danielebarchiesi@0
|
72
|
danielebarchiesi@0
|
73 return $output;
|
danielebarchiesi@0
|
74 }
|
danielebarchiesi@0
|
75
|
danielebarchiesi@0
|
76 /**
|
danielebarchiesi@0
|
77 * Implements hook_menu().
|
danielebarchiesi@0
|
78 */
|
danielebarchiesi@0
|
79 function webform_menu() {
|
danielebarchiesi@0
|
80 $items = array();
|
danielebarchiesi@0
|
81
|
danielebarchiesi@0
|
82 // Submissions listing.
|
danielebarchiesi@0
|
83 $items['admin/content/webform'] = array(
|
danielebarchiesi@0
|
84 'title' => 'Webforms',
|
danielebarchiesi@0
|
85 'page callback' => 'webform_admin_content',
|
danielebarchiesi@0
|
86 'access callback' => 'user_access',
|
danielebarchiesi@0
|
87 'access arguments' => array('access all webform results'),
|
danielebarchiesi@0
|
88 'description' => 'View and edit all the available webforms on your site.',
|
danielebarchiesi@0
|
89 'file' => 'includes/webform.admin.inc',
|
danielebarchiesi@0
|
90 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
91 );
|
danielebarchiesi@0
|
92
|
danielebarchiesi@0
|
93 // Admin Settings.
|
danielebarchiesi@0
|
94 $items['admin/config/content/webform'] = array(
|
danielebarchiesi@0
|
95 'title' => 'Webform settings',
|
danielebarchiesi@0
|
96 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
97 'page arguments' => array('webform_admin_settings'),
|
danielebarchiesi@0
|
98 'access callback' => 'user_access',
|
danielebarchiesi@0
|
99 'access arguments' => array('administer site configuration'),
|
danielebarchiesi@0
|
100 'description' => 'Global configuration of webform functionality.',
|
danielebarchiesi@0
|
101 'file' => 'includes/webform.admin.inc',
|
danielebarchiesi@0
|
102 'type' => MENU_NORMAL_ITEM,
|
danielebarchiesi@0
|
103 );
|
danielebarchiesi@0
|
104
|
danielebarchiesi@0
|
105 // Node page tabs.
|
danielebarchiesi@0
|
106 $items['node/%webform_menu/done'] = array(
|
danielebarchiesi@0
|
107 'title' => 'Webform confirmation',
|
danielebarchiesi@0
|
108 'page callback' => '_webform_confirmation',
|
danielebarchiesi@0
|
109 'page arguments' => array(1),
|
danielebarchiesi@0
|
110 'access callback' => 'node_access',
|
danielebarchiesi@0
|
111 'access arguments' => array('view', 1),
|
danielebarchiesi@0
|
112 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
113 );
|
danielebarchiesi@0
|
114 $items['node/%webform_menu/webform'] = array(
|
danielebarchiesi@0
|
115 'title' => 'Webform',
|
danielebarchiesi@0
|
116 'page callback' => 'webform_components_page',
|
danielebarchiesi@0
|
117 'page arguments' => array(1),
|
danielebarchiesi@0
|
118 'access callback' => 'node_access',
|
danielebarchiesi@0
|
119 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
120 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
121 'weight' => 1,
|
danielebarchiesi@0
|
122 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
123 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
|
danielebarchiesi@0
|
124 );
|
danielebarchiesi@0
|
125 $items['node/%webform_menu/webform/components'] = array(
|
danielebarchiesi@0
|
126 'title' => 'Form components',
|
danielebarchiesi@0
|
127 'page callback' => 'webform_components_page',
|
danielebarchiesi@0
|
128 'page arguments' => array(1),
|
danielebarchiesi@0
|
129 'access callback' => 'node_access',
|
danielebarchiesi@0
|
130 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
131 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
132 'weight' => 0,
|
danielebarchiesi@0
|
133 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@0
|
134 );
|
danielebarchiesi@0
|
135 $items['node/%webform_menu/webform/configure'] = array(
|
danielebarchiesi@0
|
136 'title' => 'Form settings',
|
danielebarchiesi@0
|
137 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
138 'page arguments' => array('webform_configure_form', 1),
|
danielebarchiesi@0
|
139 'access callback' => 'node_access',
|
danielebarchiesi@0
|
140 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
141 'file' => 'includes/webform.pages.inc',
|
danielebarchiesi@0
|
142 'weight' => 2,
|
danielebarchiesi@0
|
143 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
144 );
|
danielebarchiesi@0
|
145
|
danielebarchiesi@0
|
146 // Node e-mail forms.
|
danielebarchiesi@0
|
147 $items['node/%webform_menu/webform/emails'] = array(
|
danielebarchiesi@0
|
148 'title' => 'E-mails',
|
danielebarchiesi@0
|
149 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
150 'page arguments' => array('webform_emails_form', 1),
|
danielebarchiesi@0
|
151 'access callback' => 'node_access',
|
danielebarchiesi@0
|
152 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
153 'file' => 'includes/webform.emails.inc',
|
danielebarchiesi@0
|
154 'weight' => 1,
|
danielebarchiesi@0
|
155 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
156 );
|
danielebarchiesi@0
|
157 $items['node/%webform_menu/webform/emails/%webform_menu_email'] = array(
|
danielebarchiesi@0
|
158 'title' => 'Edit e-mail settings',
|
danielebarchiesi@0
|
159 'load arguments' => array(1),
|
danielebarchiesi@0
|
160 'page arguments' => array('webform_email_edit_form', 1, 4),
|
danielebarchiesi@0
|
161 'access callback' => 'node_access',
|
danielebarchiesi@0
|
162 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
163 'file' => 'includes/webform.emails.inc',
|
danielebarchiesi@0
|
164 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
165 );
|
danielebarchiesi@0
|
166 $items['node/%webform_menu/webform/emails/%webform_menu_email/delete'] = array(
|
danielebarchiesi@0
|
167 'title' => 'Delete e-mail settings',
|
danielebarchiesi@0
|
168 'load arguments' => array(1),
|
danielebarchiesi@0
|
169 'page arguments' => array('webform_email_delete_form', 1, 4),
|
danielebarchiesi@0
|
170 'access callback' => 'node_access',
|
danielebarchiesi@0
|
171 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
172 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
173 );
|
danielebarchiesi@0
|
174
|
danielebarchiesi@0
|
175 // Node component forms.
|
danielebarchiesi@0
|
176 $items['node/%webform_menu/webform/components/%webform_menu_component'] = array(
|
danielebarchiesi@0
|
177 'load arguments' => array(1, 5),
|
danielebarchiesi@0
|
178 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
179 'page arguments' => array('webform_component_edit_form', 1, 4, FALSE),
|
danielebarchiesi@0
|
180 'access callback' => 'node_access',
|
danielebarchiesi@0
|
181 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
182 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
183 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
184 );
|
danielebarchiesi@0
|
185 $items['node/%webform_menu/webform/components/%webform_menu_component/clone'] = array(
|
danielebarchiesi@0
|
186 'load arguments' => array(1, 5),
|
danielebarchiesi@0
|
187 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
188 'page arguments' => array('webform_component_edit_form', 1, 4, TRUE),
|
danielebarchiesi@0
|
189 'access callback' => 'node_access',
|
danielebarchiesi@0
|
190 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
191 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
192 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
193 );
|
danielebarchiesi@0
|
194 $items['node/%webform_menu/webform/components/%webform_menu_component/delete'] = array(
|
danielebarchiesi@0
|
195 'load arguments' => array(1, 5),
|
danielebarchiesi@0
|
196 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
197 'page arguments' => array('webform_component_delete_form', 1, 4),
|
danielebarchiesi@0
|
198 'access callback' => 'node_access',
|
danielebarchiesi@0
|
199 'access arguments' => array('update', 1),
|
danielebarchiesi@0
|
200 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
201 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
202 );
|
danielebarchiesi@0
|
203
|
danielebarchiesi@0
|
204 // AJAX callback for loading select list options.
|
danielebarchiesi@0
|
205 $items['webform/ajax/options/%webform_menu'] = array(
|
danielebarchiesi@0
|
206 'load arguments' => array(3),
|
danielebarchiesi@0
|
207 'page callback' => 'webform_select_options_ajax',
|
danielebarchiesi@0
|
208 'access callback' => 'node_access',
|
danielebarchiesi@0
|
209 'access arguments' => array('update', 3),
|
danielebarchiesi@0
|
210 'file' => 'components/select.inc',
|
danielebarchiesi@0
|
211 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
212 );
|
danielebarchiesi@0
|
213
|
danielebarchiesi@0
|
214 // Node webform results.
|
danielebarchiesi@0
|
215 $items['node/%webform_menu/webform-results'] = array(
|
danielebarchiesi@0
|
216 'title' => 'Results',
|
danielebarchiesi@0
|
217 'page callback' => 'webform_results_submissions',
|
danielebarchiesi@0
|
218 'page arguments' => array(1, FALSE, '50'),
|
danielebarchiesi@0
|
219 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
220 'access arguments' => array(1),
|
danielebarchiesi@0
|
221 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
222 'weight' => 2,
|
danielebarchiesi@0
|
223 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
224 'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
|
danielebarchiesi@0
|
225 );
|
danielebarchiesi@0
|
226 $items['node/%webform_menu/webform-results/submissions'] = array(
|
danielebarchiesi@0
|
227 'title' => 'Submissions',
|
danielebarchiesi@0
|
228 'page callback' => 'webform_results_submissions',
|
danielebarchiesi@0
|
229 'page arguments' => array(1, FALSE, '50'),
|
danielebarchiesi@0
|
230 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
231 'access arguments' => array(1),
|
danielebarchiesi@0
|
232 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
233 'weight' => 4,
|
danielebarchiesi@0
|
234 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@0
|
235 );
|
danielebarchiesi@0
|
236 $items['node/%webform_menu/webform-results/analysis'] = array(
|
danielebarchiesi@0
|
237 'title' => 'Analysis',
|
danielebarchiesi@0
|
238 'page callback' => 'webform_results_analysis',
|
danielebarchiesi@0
|
239 'page arguments' => array(1),
|
danielebarchiesi@0
|
240 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
241 'access arguments' => array(1),
|
danielebarchiesi@0
|
242 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
243 'weight' => 5,
|
danielebarchiesi@0
|
244 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
245 );
|
danielebarchiesi@0
|
246 $items['node/%webform_menu/webform-results/analysis/%webform_menu_component'] = array(
|
danielebarchiesi@0
|
247 'title' => 'Analysis',
|
danielebarchiesi@0
|
248 'load arguments' => array(1, 4),
|
danielebarchiesi@0
|
249 'page callback' => 'webform_results_analysis',
|
danielebarchiesi@0
|
250 'page arguments' => array(1, array(), 4),
|
danielebarchiesi@0
|
251 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
252 'access arguments' => array(1),
|
danielebarchiesi@0
|
253 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
254 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
255 );
|
danielebarchiesi@0
|
256 $items['node/%webform_menu/webform-results/table'] = array(
|
danielebarchiesi@0
|
257 'title' => 'Table',
|
danielebarchiesi@0
|
258 'page callback' => 'webform_results_table',
|
danielebarchiesi@0
|
259 'page arguments' => array(1, '50'),
|
danielebarchiesi@0
|
260 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
261 'access arguments' => array(1),
|
danielebarchiesi@0
|
262 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
263 'weight' => 6,
|
danielebarchiesi@0
|
264 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
265 );
|
danielebarchiesi@0
|
266 $items['node/%webform_menu/webform-results/download'] = array(
|
danielebarchiesi@0
|
267 'title' => 'Download',
|
danielebarchiesi@0
|
268 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
269 'page arguments' => array('webform_results_download_form', 1),
|
danielebarchiesi@0
|
270 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
271 'access arguments' => array(1),
|
danielebarchiesi@0
|
272 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
273 'weight' => 7,
|
danielebarchiesi@0
|
274 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
275 );
|
danielebarchiesi@0
|
276 $items['node/%webform_menu/webform-results/clear'] = array(
|
danielebarchiesi@0
|
277 'title' => 'Clear',
|
danielebarchiesi@0
|
278 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
279 'page arguments' => array('webform_results_clear_form', 1),
|
danielebarchiesi@0
|
280 'access callback' => 'webform_results_clear_access',
|
danielebarchiesi@0
|
281 'access arguments' => array(1),
|
danielebarchiesi@0
|
282 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
283 'weight' => 8,
|
danielebarchiesi@0
|
284 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
285 );
|
danielebarchiesi@0
|
286
|
danielebarchiesi@0
|
287 // Node submissions.
|
danielebarchiesi@0
|
288 $items['node/%webform_menu/submissions'] = array(
|
danielebarchiesi@0
|
289 'title' => 'Submissions',
|
danielebarchiesi@0
|
290 'page callback' => 'webform_results_submissions',
|
danielebarchiesi@0
|
291 'page arguments' => array(1, TRUE, '50'),
|
danielebarchiesi@0
|
292 'access callback' => 'webform_submission_access',
|
danielebarchiesi@0
|
293 'access arguments' => array(1, NULL, 'list'),
|
danielebarchiesi@0
|
294 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
295 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
296 );
|
danielebarchiesi@0
|
297 $items['node/%webform_menu/submission/%webform_menu_submission'] = array(
|
danielebarchiesi@0
|
298 'title' => 'Webform submission',
|
danielebarchiesi@0
|
299 'load arguments' => array(1),
|
danielebarchiesi@0
|
300 'page callback' => 'webform_submission_page',
|
danielebarchiesi@0
|
301 'page arguments' => array(1, 3, 'html'),
|
danielebarchiesi@0
|
302 'title callback' => 'webform_submission_title',
|
danielebarchiesi@0
|
303 'title arguments' => array(1, 3),
|
danielebarchiesi@0
|
304 'access callback' => 'webform_submission_access',
|
danielebarchiesi@0
|
305 'access arguments' => array(1, 3, 'view'),
|
danielebarchiesi@0
|
306 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
307 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
308 );
|
danielebarchiesi@0
|
309 $items['node/%webform_menu/submission/%webform_menu_submission/view'] = array(
|
danielebarchiesi@0
|
310 'title' => 'View',
|
danielebarchiesi@0
|
311 'load arguments' => array(1),
|
danielebarchiesi@0
|
312 'page callback' => 'webform_submission_page',
|
danielebarchiesi@0
|
313 'page arguments' => array(1, 3, 'html'),
|
danielebarchiesi@0
|
314 'access callback' => 'webform_submission_access',
|
danielebarchiesi@0
|
315 'access arguments' => array(1, 3, 'view'),
|
danielebarchiesi@0
|
316 'weight' => 0,
|
danielebarchiesi@0
|
317 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
318 'type' => MENU_DEFAULT_LOCAL_TASK,
|
danielebarchiesi@0
|
319 );
|
danielebarchiesi@0
|
320 $items['node/%webform_menu/submission/%webform_menu_submission/edit'] = array(
|
danielebarchiesi@0
|
321 'title' => 'Edit',
|
danielebarchiesi@0
|
322 'load arguments' => array(1),
|
danielebarchiesi@0
|
323 'page callback' => 'webform_submission_page',
|
danielebarchiesi@0
|
324 'page arguments' => array(1, 3, 'form'),
|
danielebarchiesi@0
|
325 'access callback' => 'webform_submission_access',
|
danielebarchiesi@0
|
326 'access arguments' => array(1, 3, 'edit'),
|
danielebarchiesi@0
|
327 'weight' => 1,
|
danielebarchiesi@0
|
328 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
329 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
330 );
|
danielebarchiesi@0
|
331 $items['node/%webform_menu/submission/%webform_menu_submission/delete'] = array(
|
danielebarchiesi@0
|
332 'title' => 'Delete',
|
danielebarchiesi@0
|
333 'load arguments' => array(1),
|
danielebarchiesi@0
|
334 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
335 'page arguments' => array('webform_submission_delete_form', 1, 3),
|
danielebarchiesi@0
|
336 'access callback' => 'webform_submission_access',
|
danielebarchiesi@0
|
337 'access arguments' => array(1, 3, 'delete'),
|
danielebarchiesi@0
|
338 'weight' => 2,
|
danielebarchiesi@0
|
339 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
340 'type' => MENU_LOCAL_TASK,
|
danielebarchiesi@0
|
341 );
|
danielebarchiesi@0
|
342 $items['node/%webform_menu/submission/%webform_menu_submission/resend'] = array(
|
danielebarchiesi@0
|
343 'title' => 'Resend e-mails',
|
danielebarchiesi@0
|
344 'load arguments' => array(1),
|
danielebarchiesi@0
|
345 'page callback' => 'drupal_get_form',
|
danielebarchiesi@0
|
346 'page arguments' => array('webform_submission_resend', 1, 3),
|
danielebarchiesi@0
|
347 'access callback' => 'webform_results_access',
|
danielebarchiesi@0
|
348 'access arguments' => array(1),
|
danielebarchiesi@0
|
349 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
350 'type' => MENU_CALLBACK,
|
danielebarchiesi@0
|
351 );
|
danielebarchiesi@0
|
352
|
danielebarchiesi@0
|
353 return $items;
|
danielebarchiesi@0
|
354 }
|
danielebarchiesi@0
|
355
|
danielebarchiesi@0
|
356 /**
|
danielebarchiesi@0
|
357 * Menu loader callback. Load a webform node if the given nid is a webform.
|
danielebarchiesi@0
|
358 */
|
danielebarchiesi@0
|
359 function webform_menu_load($nid) {
|
danielebarchiesi@0
|
360 if (!is_numeric($nid)) {
|
danielebarchiesi@0
|
361 return FALSE;
|
danielebarchiesi@0
|
362 }
|
danielebarchiesi@0
|
363 $node = node_load($nid);
|
danielebarchiesi@0
|
364 if (!isset($node->type) || !in_array($node->type, webform_variable_get('webform_node_types'))) {
|
danielebarchiesi@0
|
365 return FALSE;
|
danielebarchiesi@0
|
366 }
|
danielebarchiesi@0
|
367 return $node;
|
danielebarchiesi@0
|
368 }
|
danielebarchiesi@0
|
369
|
danielebarchiesi@0
|
370 /**
|
danielebarchiesi@0
|
371 * Menu loader callback. Load a webform submission if the given sid is a valid.
|
danielebarchiesi@0
|
372 */
|
danielebarchiesi@0
|
373 function webform_menu_submission_load($sid, $nid) {
|
danielebarchiesi@0
|
374 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
375 $submission = webform_get_submission($nid, $sid);
|
danielebarchiesi@0
|
376 return empty($submission) ? FALSE : $submission;
|
danielebarchiesi@0
|
377 }
|
danielebarchiesi@0
|
378
|
danielebarchiesi@0
|
379 /**
|
danielebarchiesi@0
|
380 * Menu loader callback. Load a webform component if the given cid is a valid.
|
danielebarchiesi@0
|
381 */
|
danielebarchiesi@0
|
382 function webform_menu_component_load($cid, $nid, $type) {
|
danielebarchiesi@0
|
383 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
384 if ($cid == 'new') {
|
danielebarchiesi@0
|
385 $components = webform_components();
|
danielebarchiesi@0
|
386 $component = in_array($type, array_keys($components)) ? array('type' => $type, 'nid' => $nid, 'name' => $_GET['name'], 'mandatory' => $_GET['mandatory'], 'pid' => $_GET['pid'], 'weight' => $_GET['weight']) : FALSE;
|
danielebarchiesi@0
|
387 }
|
danielebarchiesi@0
|
388 else {
|
danielebarchiesi@0
|
389 $node = node_load($nid);
|
danielebarchiesi@0
|
390 $component = isset($node->webform['components'][$cid]) ? $node->webform['components'][$cid] : FALSE;
|
danielebarchiesi@0
|
391 }
|
danielebarchiesi@0
|
392 if ($component) {
|
danielebarchiesi@0
|
393 webform_component_defaults($component);
|
danielebarchiesi@0
|
394 }
|
danielebarchiesi@0
|
395 return $component;
|
danielebarchiesi@0
|
396 }
|
danielebarchiesi@0
|
397
|
danielebarchiesi@0
|
398
|
danielebarchiesi@0
|
399 /**
|
danielebarchiesi@0
|
400 * Menu loader callback. Load a webform e-mail if the given eid is a valid.
|
danielebarchiesi@0
|
401 */
|
danielebarchiesi@0
|
402 function webform_menu_email_load($eid, $nid) {
|
danielebarchiesi@0
|
403 module_load_include('inc', 'webform', 'includes/webform.emails');
|
danielebarchiesi@0
|
404 $node = node_load($nid);
|
danielebarchiesi@0
|
405 $email = webform_email_load($eid, $nid);
|
danielebarchiesi@0
|
406 if ($eid == 'new') {
|
danielebarchiesi@0
|
407 if (isset($_GET['option']) && isset($_GET['email'])) {
|
danielebarchiesi@0
|
408 $type = $_GET['option'];
|
danielebarchiesi@0
|
409 if ($type == 'custom') {
|
danielebarchiesi@0
|
410 $email['email'] = $_GET['email'];
|
danielebarchiesi@0
|
411 }
|
danielebarchiesi@0
|
412 elseif ($type == 'component' && isset($node->webform['components'][$_GET['email']])) {
|
danielebarchiesi@0
|
413 $email['email'] = $_GET['email'];
|
danielebarchiesi@0
|
414 }
|
danielebarchiesi@0
|
415 }
|
danielebarchiesi@0
|
416 }
|
danielebarchiesi@0
|
417
|
danielebarchiesi@0
|
418 return $email;
|
danielebarchiesi@0
|
419 }
|
danielebarchiesi@0
|
420
|
danielebarchiesi@0
|
421 function webform_submission_access($node, $submission, $op = 'view', $account = NULL) {
|
danielebarchiesi@0
|
422 global $user;
|
danielebarchiesi@0
|
423 $account = isset($account) ? $account : $user;
|
danielebarchiesi@0
|
424
|
danielebarchiesi@0
|
425 $access_all = user_access('access all webform results', $account);
|
danielebarchiesi@0
|
426 $access_own_submission = isset($submission) && user_access('access own webform submissions', $account) && (($account->uid && $account->uid == $submission->uid) || isset($_SESSION['webform_submission'][$submission->sid]));
|
danielebarchiesi@0
|
427 $access_node_submissions = user_access('access own webform results', $account) && $account->uid == $node->uid;
|
danielebarchiesi@0
|
428
|
danielebarchiesi@0
|
429 $general_access = $access_all || $access_own_submission || $access_node_submissions;
|
danielebarchiesi@0
|
430
|
danielebarchiesi@0
|
431 // Disable the page cache for anonymous users in this access callback,
|
danielebarchiesi@0
|
432 // otherwise the "Access denied" page gets cached.
|
danielebarchiesi@0
|
433 if (!$account->uid && user_access('access own webform submissions', $account)) {
|
danielebarchiesi@0
|
434 webform_disable_page_cache();
|
danielebarchiesi@0
|
435 }
|
danielebarchiesi@0
|
436
|
danielebarchiesi@0
|
437 $module_access = count(array_filter(module_invoke_all('webform_submission_access', $node, $submission, $op, $account))) > 0;
|
danielebarchiesi@0
|
438
|
danielebarchiesi@0
|
439 switch ($op) {
|
danielebarchiesi@0
|
440 case 'view':
|
danielebarchiesi@0
|
441 return $module_access || $general_access;
|
danielebarchiesi@0
|
442 case 'edit':
|
danielebarchiesi@0
|
443 return $module_access || ($general_access && (user_access('edit all webform submissions', $account) || (user_access('edit own webform submissions', $account) && $account->uid == $submission->uid)));
|
danielebarchiesi@0
|
444 case 'delete':
|
danielebarchiesi@0
|
445 return $module_access || ($general_access && (user_access('delete all webform submissions', $account) || (user_access('delete own webform submissions', $account) && $account->uid == $submission->uid)));
|
danielebarchiesi@0
|
446 case 'list':
|
danielebarchiesi@0
|
447 return $module_access || user_access('access all webform results', $account) || (user_access('access own webform submissions', $account) && ($account->uid || isset($_SESSION['webform_submission']))) || (user_access('access own webform results', $account) && $account->uid == $node->uid);
|
danielebarchiesi@0
|
448 }
|
danielebarchiesi@0
|
449 }
|
danielebarchiesi@0
|
450
|
danielebarchiesi@0
|
451 /**
|
danielebarchiesi@0
|
452 * Menu access callback. Ensure a user both access and node 'view' permission.
|
danielebarchiesi@0
|
453 */
|
danielebarchiesi@0
|
454 function webform_results_access($node, $account = NULL) {
|
danielebarchiesi@0
|
455 global $user;
|
danielebarchiesi@0
|
456 $account = isset($account) ? $account : $user;
|
danielebarchiesi@0
|
457
|
danielebarchiesi@0
|
458 $module_access = count(array_filter(module_invoke_all('webform_results_access', $node, $account))) > 0;
|
danielebarchiesi@0
|
459
|
danielebarchiesi@0
|
460 return node_access('view', $node, $account) && ($module_access || user_access('access all webform results', $account) || (user_access('access own webform results', $account) && $account->uid == $node->uid));
|
danielebarchiesi@0
|
461 }
|
danielebarchiesi@0
|
462
|
danielebarchiesi@0
|
463 function webform_results_clear_access($node, $account = NULL) {
|
danielebarchiesi@0
|
464 global $user;
|
danielebarchiesi@0
|
465 $account = isset($account) ? $account : $user;
|
danielebarchiesi@0
|
466
|
danielebarchiesi@0
|
467 $module_access = count(array_filter(module_invoke_all('webform_results_clear_access', $node, $account))) > 0;
|
danielebarchiesi@0
|
468
|
danielebarchiesi@0
|
469 return webform_results_access($node, $account) && ($module_access || user_access('delete all webform submissions', $account));
|
danielebarchiesi@0
|
470 }
|
danielebarchiesi@0
|
471
|
danielebarchiesi@0
|
472 /**
|
danielebarchiesi@0
|
473 * Implements hook_admin_paths().
|
danielebarchiesi@0
|
474 */
|
danielebarchiesi@0
|
475 function webform_admin_paths() {
|
danielebarchiesi@0
|
476 if (variable_get('node_admin_theme')) {
|
danielebarchiesi@0
|
477 return array(
|
danielebarchiesi@0
|
478 'node/*/webform' => TRUE,
|
danielebarchiesi@0
|
479 'node/*/webform/*' => TRUE,
|
danielebarchiesi@0
|
480 'node/*/webform-results' => TRUE,
|
danielebarchiesi@0
|
481 'node/*/webform-results/*' => TRUE,
|
danielebarchiesi@0
|
482 'node/*/submission/*' => TRUE,
|
danielebarchiesi@0
|
483 );
|
danielebarchiesi@0
|
484 }
|
danielebarchiesi@0
|
485 }
|
danielebarchiesi@0
|
486
|
danielebarchiesi@0
|
487 /**
|
danielebarchiesi@0
|
488 * Implements hook_perm().
|
danielebarchiesi@0
|
489 */
|
danielebarchiesi@0
|
490 function webform_permission() {
|
danielebarchiesi@0
|
491 return array(
|
danielebarchiesi@0
|
492 'access all webform results' => array(
|
danielebarchiesi@0
|
493 'title' => t('Access all webform results'),
|
danielebarchiesi@0
|
494 'description' => t('Grants access to the "Results" tab on all webform content. Generally an administrative permission.'),
|
danielebarchiesi@0
|
495 ),
|
danielebarchiesi@0
|
496 'access own webform results' => array(
|
danielebarchiesi@0
|
497 'title' => t('Access own webform results'),
|
danielebarchiesi@0
|
498 'description' => t('Grants access to the "Results" tab to the author of webform content they have created.'),
|
danielebarchiesi@0
|
499 ),
|
danielebarchiesi@0
|
500 'edit all webform submissions' => array(
|
danielebarchiesi@0
|
501 'title' => t('Edit all webform submissions'),
|
danielebarchiesi@0
|
502 'description' => t('Allows editing of any webform submission by any user. Generally an administrative permission.'),
|
danielebarchiesi@0
|
503 ),
|
danielebarchiesi@0
|
504 'delete all webform submissions' => array(
|
danielebarchiesi@0
|
505 'title' => t('Delete all webform submissions'),
|
danielebarchiesi@0
|
506 'description' => t('Allows deleting of any webform submission by any user. Generally an administrative permission.'),
|
danielebarchiesi@0
|
507 ),
|
danielebarchiesi@0
|
508 'access own webform submissions' => array(
|
danielebarchiesi@0
|
509 'title' => t('Access own webform submissions'),
|
danielebarchiesi@0
|
510 ),
|
danielebarchiesi@0
|
511 'edit own webform submissions' => array(
|
danielebarchiesi@0
|
512 'title' => t('Edit own webform submissions'),
|
danielebarchiesi@0
|
513 ),
|
danielebarchiesi@0
|
514 'delete own webform submissions' => array(
|
danielebarchiesi@0
|
515 'title' => t('Delete own webform submissions'),
|
danielebarchiesi@0
|
516 ),
|
danielebarchiesi@0
|
517 );
|
danielebarchiesi@0
|
518 }
|
danielebarchiesi@0
|
519
|
danielebarchiesi@0
|
520 /**
|
danielebarchiesi@0
|
521 * Implements hook_theme().
|
danielebarchiesi@0
|
522 */
|
danielebarchiesi@0
|
523 function webform_theme() {
|
danielebarchiesi@0
|
524 $theme = array(
|
danielebarchiesi@0
|
525 // webform.module.
|
danielebarchiesi@0
|
526 'webform_view' => array(
|
danielebarchiesi@0
|
527 'render element' => 'webform',
|
danielebarchiesi@0
|
528 ),
|
danielebarchiesi@0
|
529 'webform_view_messages' => array(
|
danielebarchiesi@0
|
530 'variables' => array('node' => NULL, 'teaser' => NULL, 'page' => NULL, 'submission_count' => NULL, 'user_limit_exceeded' => NULL, 'total_limit_exceeded' => NULL, 'allowed_roles' => NULL, 'closed' => NULL, 'cached' => NULL),
|
danielebarchiesi@0
|
531 ),
|
danielebarchiesi@0
|
532 'webform_form' => array(
|
danielebarchiesi@0
|
533 'render element' => 'form',
|
danielebarchiesi@0
|
534 'template' => 'templates/webform-form',
|
danielebarchiesi@0
|
535 'pattern' => 'webform_form_[0-9]+',
|
danielebarchiesi@0
|
536 ),
|
danielebarchiesi@0
|
537 'webform_confirmation' => array(
|
danielebarchiesi@0
|
538 'variables' => array('node' => NULL, 'sid' => NULL),
|
danielebarchiesi@0
|
539 'template' => 'templates/webform-confirmation',
|
danielebarchiesi@0
|
540 'pattern' => 'webform_confirmation_[0-9]+',
|
danielebarchiesi@0
|
541 ),
|
danielebarchiesi@0
|
542 'webform_element' => array(
|
danielebarchiesi@0
|
543 'render element' => 'element',
|
danielebarchiesi@0
|
544 ),
|
danielebarchiesi@0
|
545 'webform_element_text' => array(
|
danielebarchiesi@0
|
546 'render element' => 'element',
|
danielebarchiesi@0
|
547 ),
|
danielebarchiesi@0
|
548 'webform_inline_radio' => array(
|
danielebarchiesi@0
|
549 'render element' => 'element',
|
danielebarchiesi@0
|
550 ),
|
danielebarchiesi@0
|
551 'webform_mail_message' => array(
|
danielebarchiesi@0
|
552 'variables' => array('node' => NULL, 'submission' => NULL, 'email' => NULL),
|
danielebarchiesi@0
|
553 'template' => 'templates/webform-mail',
|
danielebarchiesi@0
|
554 'pattern' => 'webform_mail(_[0-9]+)?',
|
danielebarchiesi@0
|
555 ),
|
danielebarchiesi@0
|
556 'webform_mail_headers' => array(
|
danielebarchiesi@0
|
557 'variables' => array('node' => NULL, 'submission' => NULL, 'email' => NULL),
|
danielebarchiesi@0
|
558 'pattern' => 'webform_mail_headers_[0-9]+',
|
danielebarchiesi@0
|
559 ),
|
danielebarchiesi@0
|
560 'webform_token_help' => array(
|
danielebarchiesi@0
|
561 'variables' => array('groups' => array()),
|
danielebarchiesi@0
|
562 ),
|
danielebarchiesi@0
|
563 // webform.admin.inc.
|
danielebarchiesi@0
|
564 'webform_admin_settings' => array(
|
danielebarchiesi@0
|
565 'render element' => 'form',
|
danielebarchiesi@0
|
566 'file' => 'includes/webform.admin.inc',
|
danielebarchiesi@0
|
567 ),
|
danielebarchiesi@0
|
568 'webform_admin_content' => array(
|
danielebarchiesi@0
|
569 'variables' => array('nodes' => NULL),
|
danielebarchiesi@0
|
570 'file' => 'includes/webform.admin.inc',
|
danielebarchiesi@0
|
571 ),
|
danielebarchiesi@0
|
572 // webform.emails.inc.
|
danielebarchiesi@0
|
573 'webform_emails_form' => array(
|
danielebarchiesi@0
|
574 'render element' => 'form',
|
danielebarchiesi@0
|
575 'file' => 'includes/webform.emails.inc',
|
danielebarchiesi@0
|
576 ),
|
danielebarchiesi@0
|
577 'webform_email_add_form' => array(
|
danielebarchiesi@0
|
578 'render element' => 'form',
|
danielebarchiesi@0
|
579 'file' => 'includes/webform.emails.inc',
|
danielebarchiesi@0
|
580 ),
|
danielebarchiesi@0
|
581 'webform_email_edit_form' => array(
|
danielebarchiesi@0
|
582 'render element' => 'form',
|
danielebarchiesi@0
|
583 'file' => 'includes/webform.emails.inc',
|
danielebarchiesi@0
|
584 ),
|
danielebarchiesi@0
|
585 // webform.components.inc.
|
danielebarchiesi@0
|
586 'webform_components_page' => array(
|
danielebarchiesi@0
|
587 'variables' => array('node' => NULL, 'form' => NULL),
|
danielebarchiesi@0
|
588 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
589 ),
|
danielebarchiesi@0
|
590 'webform_components_form' => array(
|
danielebarchiesi@0
|
591 'render element' => 'form',
|
danielebarchiesi@0
|
592 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
593 ),
|
danielebarchiesi@0
|
594 'webform_component_select' => array(
|
danielebarchiesi@0
|
595 'render element' => 'element',
|
danielebarchiesi@0
|
596 'file' => 'includes/webform.components.inc',
|
danielebarchiesi@0
|
597 ),
|
danielebarchiesi@0
|
598 // webform.pages.inc.
|
danielebarchiesi@0
|
599 'webform_advanced_redirection_form' => array(
|
danielebarchiesi@0
|
600 'render element' => 'form',
|
danielebarchiesi@0
|
601 'file' => 'includes/webform.pages.inc',
|
danielebarchiesi@0
|
602 ),
|
danielebarchiesi@0
|
603 'webform_advanced_submit_limit_form' => array(
|
danielebarchiesi@0
|
604 'render element' => 'form',
|
danielebarchiesi@0
|
605 'file' => 'includes/webform.pages.inc',
|
danielebarchiesi@0
|
606 ),
|
danielebarchiesi@0
|
607 'webform_advanced_total_submit_limit_form' => array(
|
danielebarchiesi@0
|
608 'render element' => 'form',
|
danielebarchiesi@0
|
609 'file' => 'includes/webform.pages.inc',
|
danielebarchiesi@0
|
610 ),
|
danielebarchiesi@0
|
611 // webform.report.inc.
|
danielebarchiesi@0
|
612 'webform_results_per_page' => array(
|
danielebarchiesi@0
|
613 'variables' => array('total_count' => NULL, 'pager_count' => NULL),
|
danielebarchiesi@0
|
614 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
615 ),
|
danielebarchiesi@0
|
616 'webform_results_submissions_header' => array(
|
danielebarchiesi@0
|
617 'variables' => array('node' => NULL),
|
danielebarchiesi@0
|
618 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
619 ),
|
danielebarchiesi@0
|
620 'webform_results_submissions' => array(
|
danielebarchiesi@0
|
621 'render element' => 'element',
|
danielebarchiesi@0
|
622 'template' => 'templates/webform-results-submissions',
|
danielebarchiesi@0
|
623 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
624 ),
|
danielebarchiesi@0
|
625 'webform_results_table_header' => array(
|
danielebarchiesi@0
|
626 'variables' => array('node' => NULL),
|
danielebarchiesi@0
|
627 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
628 ),
|
danielebarchiesi@0
|
629 'webform_results_table' => array(
|
danielebarchiesi@0
|
630 'variables' => array('node' => NULL, 'components' => NULL, 'submissions' => NULL, 'node' => NULL, 'total_count' => NULL, 'pager_count' => NULL),
|
danielebarchiesi@0
|
631 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
632 ),
|
danielebarchiesi@0
|
633 'webform_results_download_range' => array(
|
danielebarchiesi@0
|
634 'render element' => 'element',
|
danielebarchiesi@0
|
635 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
636 ),
|
danielebarchiesi@0
|
637 'webform_results_download_select_format' => array(
|
danielebarchiesi@0
|
638 'render element' => 'element',
|
danielebarchiesi@0
|
639 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
640 ),
|
danielebarchiesi@0
|
641 'webform_results_analysis' => array(
|
danielebarchiesi@0
|
642 'variables' => array('node' => NULL, 'data' => NULL, 'sids' => array(), 'component' => NULL),
|
danielebarchiesi@0
|
643 'file' => 'includes/webform.report.inc',
|
danielebarchiesi@0
|
644 ),
|
danielebarchiesi@0
|
645 // webform.submissions.inc
|
danielebarchiesi@0
|
646 'webform_submission' => array(
|
danielebarchiesi@0
|
647 'render element' => 'renderable',
|
danielebarchiesi@0
|
648 'template' => 'templates/webform-submission',
|
danielebarchiesi@0
|
649 'pattern' => 'webform_submission_[0-9]+',
|
danielebarchiesi@0
|
650 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
651 ),
|
danielebarchiesi@0
|
652 'webform_submission_page' => array(
|
danielebarchiesi@0
|
653 'variables' => array('node' => NULL, 'submission' => NULL, 'submission_content' => NULL, 'submission_navigation' => NULL, 'submission_information' => NULL, 'submission_actions' => NULL, 'mode' => NULL),
|
danielebarchiesi@0
|
654 'template' => 'templates/webform-submission-page',
|
danielebarchiesi@0
|
655 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
656 ),
|
danielebarchiesi@0
|
657 'webform_submission_information' => array(
|
danielebarchiesi@0
|
658 'variables' => array('node' => NULL, 'submission' => NULL, 'mode' => 'display'),
|
danielebarchiesi@0
|
659 'template' => 'templates/webform-submission-information',
|
danielebarchiesi@0
|
660 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
661 ),
|
danielebarchiesi@0
|
662 'webform_submission_navigation' => array(
|
danielebarchiesi@0
|
663 'variables' => array('node' => NULL, 'submission' => NULL, 'mode' => NULL),
|
danielebarchiesi@0
|
664 'template' => 'templates/webform-submission-navigation',
|
danielebarchiesi@0
|
665 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
666 ),
|
danielebarchiesi@0
|
667 'webform_submission_resend' => array(
|
danielebarchiesi@0
|
668 'render element' => 'form',
|
danielebarchiesi@0
|
669 'file' => 'includes/webform.submissions.inc',
|
danielebarchiesi@0
|
670 ),
|
danielebarchiesi@0
|
671 );
|
danielebarchiesi@0
|
672
|
danielebarchiesi@0
|
673 // Theme functions in all components.
|
danielebarchiesi@0
|
674 $components = webform_components(TRUE);
|
danielebarchiesi@0
|
675 foreach ($components as $type => $component) {
|
danielebarchiesi@0
|
676 if ($theme_additions = webform_component_invoke($type, 'theme')) {
|
danielebarchiesi@0
|
677 $theme = array_merge($theme, $theme_additions);
|
danielebarchiesi@0
|
678 }
|
danielebarchiesi@0
|
679 }
|
danielebarchiesi@0
|
680 return $theme;
|
danielebarchiesi@0
|
681 }
|
danielebarchiesi@0
|
682
|
danielebarchiesi@0
|
683 /**
|
danielebarchiesi@0
|
684 * Implements hook_library().
|
danielebarchiesi@0
|
685 */
|
danielebarchiesi@0
|
686 function webform_library() {
|
danielebarchiesi@0
|
687 $module_path = drupal_get_path('module', 'webform');
|
danielebarchiesi@0
|
688
|
danielebarchiesi@0
|
689 // Webform administration.
|
danielebarchiesi@0
|
690 $libraries['admin'] = array(
|
danielebarchiesi@0
|
691 'title' => 'Webform: Administration',
|
danielebarchiesi@0
|
692 'website' => 'http://drupal.org/project/webform',
|
danielebarchiesi@0
|
693 'version' => '1.0',
|
danielebarchiesi@0
|
694 'js' => array(
|
danielebarchiesi@0
|
695 $module_path . '/js/webform-admin.js' => array('group' => JS_DEFAULT),
|
danielebarchiesi@0
|
696 ),
|
danielebarchiesi@0
|
697 'css' => array(
|
danielebarchiesi@0
|
698 $module_path . '/css/webform-admin.css' => array('group' => CSS_DEFAULT, 'weight' => 1),
|
danielebarchiesi@0
|
699 ),
|
danielebarchiesi@0
|
700 );
|
danielebarchiesi@0
|
701
|
danielebarchiesi@0
|
702 return $libraries;
|
danielebarchiesi@0
|
703 }
|
danielebarchiesi@0
|
704
|
danielebarchiesi@0
|
705 /**
|
danielebarchiesi@0
|
706 * Implements hook_element_info().
|
danielebarchiesi@0
|
707 */
|
danielebarchiesi@0
|
708 function webform_element_info() {
|
danielebarchiesi@0
|
709 // A few of our components need to be defined here because Drupal does not
|
danielebarchiesi@0
|
710 // provide these components natively. Because this hook fires on every page
|
danielebarchiesi@0
|
711 // load (even on non-webform pages), we don't put this in the component .inc
|
danielebarchiesi@0
|
712 // files because of the unnecessary loading that it would require.
|
danielebarchiesi@0
|
713 $elements['webform_time'] = array('#input' => 'TRUE');
|
danielebarchiesi@0
|
714 $elements['webform_grid'] = array('#input' => 'TRUE');
|
danielebarchiesi@0
|
715
|
danielebarchiesi@0
|
716 $elements['webform_email'] = array(
|
danielebarchiesi@0
|
717 '#input' => TRUE,
|
danielebarchiesi@0
|
718 '#theme' => 'webform_email',
|
danielebarchiesi@0
|
719 '#size' => 60,
|
danielebarchiesi@0
|
720 );
|
danielebarchiesi@0
|
721 $elements['webform_number'] = array(
|
danielebarchiesi@0
|
722 '#input' => TRUE,
|
danielebarchiesi@0
|
723 '#theme' => 'webform_number',
|
danielebarchiesi@0
|
724 '#min' => NULL,
|
danielebarchiesi@0
|
725 '#max' => NULL,
|
danielebarchiesi@0
|
726 '#step' => NULL,
|
danielebarchiesi@0
|
727 );
|
danielebarchiesi@0
|
728
|
danielebarchiesi@0
|
729 return $elements;
|
danielebarchiesi@0
|
730 }
|
danielebarchiesi@0
|
731
|
danielebarchiesi@0
|
732 /**
|
danielebarchiesi@0
|
733 * Implements hook_webform_component_info().
|
danielebarchiesi@0
|
734 */
|
danielebarchiesi@0
|
735 function webform_webform_component_info() {
|
danielebarchiesi@0
|
736 $component_info = array(
|
danielebarchiesi@0
|
737 'date' => array(
|
danielebarchiesi@0
|
738 'label' => t('Date'),
|
danielebarchiesi@0
|
739 'description' => t('Presents month, day, and year fields.'),
|
danielebarchiesi@0
|
740 'features' => array(
|
danielebarchiesi@0
|
741 'conditional' => FALSE,
|
danielebarchiesi@0
|
742 ),
|
danielebarchiesi@0
|
743 'file' => 'components/date.inc',
|
danielebarchiesi@0
|
744 ),
|
danielebarchiesi@0
|
745 'email' => array(
|
danielebarchiesi@0
|
746 'label' => t('E-mail'),
|
danielebarchiesi@0
|
747 'description' => t('A special textfield that accepts e-mail addresses.'),
|
danielebarchiesi@0
|
748 'file' => 'components/email.inc',
|
danielebarchiesi@0
|
749 'features' => array(
|
danielebarchiesi@0
|
750 'email_address' => TRUE,
|
danielebarchiesi@0
|
751 'spam_analysis' => TRUE,
|
danielebarchiesi@0
|
752 ),
|
danielebarchiesi@0
|
753 ),
|
danielebarchiesi@0
|
754 'fieldset' => array(
|
danielebarchiesi@0
|
755 'label' => t('Fieldset'),
|
danielebarchiesi@0
|
756 'description' => t('Fieldsets allow you to organize multiple fields into groups.'),
|
danielebarchiesi@0
|
757 'features' => array(
|
danielebarchiesi@0
|
758 'csv' => FALSE,
|
danielebarchiesi@0
|
759 'default_value' => FALSE,
|
danielebarchiesi@0
|
760 'required' => FALSE,
|
danielebarchiesi@0
|
761 'conditional' => FALSE,
|
danielebarchiesi@0
|
762 'group' => TRUE,
|
danielebarchiesi@0
|
763 'title_inline' => FALSE,
|
danielebarchiesi@0
|
764 ),
|
danielebarchiesi@0
|
765 'file' => 'components/fieldset.inc',
|
danielebarchiesi@0
|
766 ),
|
danielebarchiesi@0
|
767 'grid' => array(
|
danielebarchiesi@0
|
768 'label' => t('Grid'),
|
danielebarchiesi@0
|
769 'description' => t('Allows creation of grid questions, denoted by radio buttons.'),
|
danielebarchiesi@0
|
770 'features' => array(
|
danielebarchiesi@0
|
771 'conditional' => FALSE,
|
danielebarchiesi@0
|
772 'default_value' => FALSE,
|
danielebarchiesi@0
|
773 'title_inline' => FALSE,
|
danielebarchiesi@0
|
774 ),
|
danielebarchiesi@0
|
775 'file' => 'components/grid.inc',
|
danielebarchiesi@0
|
776 ),
|
danielebarchiesi@0
|
777 'hidden' => array(
|
danielebarchiesi@0
|
778 'label' => t('Hidden'),
|
danielebarchiesi@0
|
779 'description' => t('A field which is not visible to the user, but is recorded with the submission.'),
|
danielebarchiesi@0
|
780 'file' => 'components/hidden.inc',
|
danielebarchiesi@0
|
781 'features' => array(
|
danielebarchiesi@0
|
782 'required' => FALSE,
|
danielebarchiesi@0
|
783 'description' => FALSE,
|
danielebarchiesi@0
|
784 'email_address' => TRUE,
|
danielebarchiesi@0
|
785 'email_name' => TRUE,
|
danielebarchiesi@0
|
786 'title_display' => FALSE,
|
danielebarchiesi@0
|
787 'private' => FALSE,
|
danielebarchiesi@0
|
788 ),
|
danielebarchiesi@0
|
789 ),
|
danielebarchiesi@0
|
790 'markup' => array(
|
danielebarchiesi@0
|
791 'label' => t('Markup'),
|
danielebarchiesi@0
|
792 'description' => t('Displays text as HTML in the form; does not render a field.'),
|
danielebarchiesi@0
|
793 'features' => array(
|
danielebarchiesi@0
|
794 'csv' => FALSE,
|
danielebarchiesi@0
|
795 'default_value' => FALSE,
|
danielebarchiesi@0
|
796 'description' => FALSE,
|
danielebarchiesi@0
|
797 'email' => FALSE,
|
danielebarchiesi@0
|
798 'required' => FALSE,
|
danielebarchiesi@0
|
799 'conditional' => FALSE,
|
danielebarchiesi@0
|
800 'title_display' => FALSE,
|
danielebarchiesi@0
|
801 'private' => FALSE,
|
danielebarchiesi@0
|
802 ),
|
danielebarchiesi@0
|
803 'file' => 'components/markup.inc',
|
danielebarchiesi@0
|
804 ),
|
danielebarchiesi@0
|
805 'number' => array(
|
danielebarchiesi@0
|
806 'label' => t('Number'),
|
danielebarchiesi@0
|
807 'description' => t('A numeric input field (either as textfield or select list).'),
|
danielebarchiesi@0
|
808 'features' => array(
|
danielebarchiesi@0
|
809 ),
|
danielebarchiesi@0
|
810 'file' => 'components/number.inc',
|
danielebarchiesi@0
|
811 ),
|
danielebarchiesi@0
|
812 'pagebreak' => array(
|
danielebarchiesi@0
|
813 'label' => t('Page break'),
|
danielebarchiesi@0
|
814 'description' => t('Organize forms into multiple pages.'),
|
danielebarchiesi@0
|
815 'features' => array(
|
danielebarchiesi@0
|
816 'csv' => FALSE,
|
danielebarchiesi@0
|
817 'default_value' => FALSE,
|
danielebarchiesi@0
|
818 'description' => FALSE,
|
danielebarchiesi@0
|
819 'private' => FALSE,
|
danielebarchiesi@0
|
820 'required' => FALSE,
|
danielebarchiesi@0
|
821 'title_display' => FALSE,
|
danielebarchiesi@0
|
822 ),
|
danielebarchiesi@0
|
823 'file' => 'components/pagebreak.inc',
|
danielebarchiesi@0
|
824 ),
|
danielebarchiesi@0
|
825 'select' => array(
|
danielebarchiesi@0
|
826 'label' => t('Select options'),
|
danielebarchiesi@0
|
827 'description' => t('Allows creation of checkboxes, radio buttons, or select menus.'),
|
danielebarchiesi@0
|
828 'file' => 'components/select.inc',
|
danielebarchiesi@0
|
829 'features' => array(
|
danielebarchiesi@0
|
830 'default_value' => FALSE,
|
danielebarchiesi@0
|
831 'email_address' => TRUE,
|
danielebarchiesi@0
|
832 'email_name' => TRUE,
|
danielebarchiesi@0
|
833 ),
|
danielebarchiesi@0
|
834 ),
|
danielebarchiesi@0
|
835 'textarea' => array(
|
danielebarchiesi@0
|
836 'label' => t('Textarea'),
|
danielebarchiesi@0
|
837 'description' => t('A large text area that allows for multiple lines of input.'),
|
danielebarchiesi@0
|
838 'file' => 'components/textarea.inc',
|
danielebarchiesi@0
|
839 'features' => array(
|
danielebarchiesi@0
|
840 'spam_analysis' => TRUE,
|
danielebarchiesi@0
|
841 'title_inline' => FALSE,
|
danielebarchiesi@0
|
842 ),
|
danielebarchiesi@0
|
843 ),
|
danielebarchiesi@0
|
844 'textfield' => array(
|
danielebarchiesi@0
|
845 'label' => t('Textfield'),
|
danielebarchiesi@0
|
846 'description' => t('Basic textfield type.'),
|
danielebarchiesi@0
|
847 'file' => 'components/textfield.inc',
|
danielebarchiesi@0
|
848 'features' => array(
|
danielebarchiesi@0
|
849 'email_name' => TRUE,
|
danielebarchiesi@0
|
850 'spam_analysis' => TRUE,
|
danielebarchiesi@0
|
851 ),
|
danielebarchiesi@0
|
852 ),
|
danielebarchiesi@0
|
853 'time' => array(
|
danielebarchiesi@0
|
854 'label' => t('Time'),
|
danielebarchiesi@0
|
855 'description' => t('Presents the user with hour and minute fields. Optional am/pm fields.'),
|
danielebarchiesi@0
|
856 'features' => array(
|
danielebarchiesi@0
|
857 'conditional' => FALSE,
|
danielebarchiesi@0
|
858 ),
|
danielebarchiesi@0
|
859 'file' => 'components/time.inc',
|
danielebarchiesi@0
|
860 ),
|
danielebarchiesi@0
|
861 );
|
danielebarchiesi@0
|
862
|
danielebarchiesi@0
|
863 if (module_exists('file')) {
|
danielebarchiesi@0
|
864 $component_info['file'] = array(
|
danielebarchiesi@0
|
865 'label' => t('File'),
|
danielebarchiesi@0
|
866 'description' => t('Allow users to upload files of configurable types.'),
|
danielebarchiesi@0
|
867 'features' => array(
|
danielebarchiesi@0
|
868 'conditional' => FALSE,
|
danielebarchiesi@0
|
869 'default_value' => FALSE,
|
danielebarchiesi@0
|
870 'attachment' => TRUE,
|
danielebarchiesi@0
|
871 ),
|
danielebarchiesi@0
|
872 'file' => 'components/file.inc',
|
danielebarchiesi@0
|
873 );
|
danielebarchiesi@0
|
874 }
|
danielebarchiesi@0
|
875
|
danielebarchiesi@0
|
876 return $component_info;
|
danielebarchiesi@0
|
877 }
|
danielebarchiesi@0
|
878
|
danielebarchiesi@0
|
879 /**
|
danielebarchiesi@0
|
880 * Implements hook_forms().
|
danielebarchiesi@0
|
881 *
|
danielebarchiesi@0
|
882 * All webform_client_form forms share the same form handler
|
danielebarchiesi@0
|
883 */
|
danielebarchiesi@0
|
884 function webform_forms($form_id) {
|
danielebarchiesi@0
|
885 $forms = array();
|
danielebarchiesi@0
|
886 if (strpos($form_id, 'webform_client_form_') === 0) {
|
danielebarchiesi@0
|
887 $forms[$form_id]['callback'] = 'webform_client_form';
|
danielebarchiesi@0
|
888 }
|
danielebarchiesi@0
|
889 return $forms;
|
danielebarchiesi@0
|
890 }
|
danielebarchiesi@0
|
891
|
danielebarchiesi@0
|
892 /**
|
danielebarchiesi@0
|
893 * Implements hook_webform_select_options_info().
|
danielebarchiesi@0
|
894 */
|
danielebarchiesi@0
|
895 function webform_webform_select_options_info() {
|
danielebarchiesi@0
|
896 module_load_include('inc', 'webform', 'includes/webform.options');
|
danielebarchiesi@0
|
897 return _webform_options_info();
|
danielebarchiesi@0
|
898 }
|
danielebarchiesi@0
|
899
|
danielebarchiesi@0
|
900 /**
|
danielebarchiesi@0
|
901 * Implements hook_webform_webform_submission_actions().
|
danielebarchiesi@0
|
902 */
|
danielebarchiesi@0
|
903 function webform_webform_submission_actions($node, $submission) {
|
danielebarchiesi@0
|
904 $actions = array();
|
danielebarchiesi@0
|
905 $destination = drupal_get_destination();
|
danielebarchiesi@0
|
906
|
danielebarchiesi@0
|
907 if (module_exists('print_pdf') && user_access('access PDF version')) {
|
danielebarchiesi@0
|
908 $actions['printpdf'] = array(
|
danielebarchiesi@0
|
909 'title' => t('Download PDF'),
|
danielebarchiesi@0
|
910 'href' => 'printpdf/' . $node->nid . '/submission/' . $submission->sid,
|
danielebarchiesi@0
|
911 'query' => $destination,
|
danielebarchiesi@0
|
912 );
|
danielebarchiesi@0
|
913 }
|
danielebarchiesi@0
|
914
|
danielebarchiesi@0
|
915 if (module_exists('print') && user_access('access print')) {
|
danielebarchiesi@0
|
916 $actions['print'] = array(
|
danielebarchiesi@0
|
917 'title' => t('Print'),
|
danielebarchiesi@0
|
918 'href' => 'print/' . $node->nid . '/submission/' . $submission->sid,
|
danielebarchiesi@0
|
919 );
|
danielebarchiesi@0
|
920 }
|
danielebarchiesi@0
|
921
|
danielebarchiesi@0
|
922 if (webform_results_access($node) && count($node->webform['emails'])) {
|
danielebarchiesi@0
|
923 $actions['resend'] = array(
|
danielebarchiesi@0
|
924 'title' => t('Resend e-mails'),
|
danielebarchiesi@0
|
925 'href' => 'node/' . $node->nid . '/submission/' . $submission->sid . '/resend',
|
danielebarchiesi@0
|
926 'query' => drupal_get_destination(),
|
danielebarchiesi@0
|
927 );
|
danielebarchiesi@0
|
928 }
|
danielebarchiesi@0
|
929
|
danielebarchiesi@0
|
930 return $actions;
|
danielebarchiesi@0
|
931 }
|
danielebarchiesi@0
|
932
|
danielebarchiesi@0
|
933 /**
|
danielebarchiesi@0
|
934 * Implements hook_webform_submission_update().
|
danielebarchiesi@0
|
935 *
|
danielebarchiesi@0
|
936 * We implement our own hook here to facilitate the File component, which needs
|
danielebarchiesi@0
|
937 * to clean up manage file usage records and delete files from submissions that
|
danielebarchiesi@0
|
938 * have been edited if necessary.
|
danielebarchiesi@0
|
939 */
|
danielebarchiesi@0
|
940 function webform_webform_submission_presave($node, &$submission) {
|
danielebarchiesi@0
|
941 // Check if there are any file components in this submission and if any of
|
danielebarchiesi@0
|
942 // them currently contain files.
|
danielebarchiesi@0
|
943 $has_file_components = FALSE;
|
danielebarchiesi@0
|
944 $new_fids = array();
|
danielebarchiesi@0
|
945 $old_fids = array();
|
danielebarchiesi@0
|
946
|
danielebarchiesi@0
|
947 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
948 if ($component['type'] == 'file') {
|
danielebarchiesi@0
|
949 $has_file_components = TRUE;
|
danielebarchiesi@0
|
950 if (!empty($submission->data[$cid]['value'])) {
|
danielebarchiesi@0
|
951 $new_fids = array_merge($new_fids, $submission->data[$cid]['value']);
|
danielebarchiesi@0
|
952 }
|
danielebarchiesi@0
|
953 }
|
danielebarchiesi@0
|
954 }
|
danielebarchiesi@0
|
955
|
danielebarchiesi@0
|
956 if ($has_file_components) {
|
danielebarchiesi@0
|
957 // If we're updating a submission, build a list of previous files.
|
danielebarchiesi@0
|
958 if (isset($submission->sid)) {
|
danielebarchiesi@0
|
959 $old_submission = webform_get_submission($node->nid, $submission->sid, TRUE);
|
danielebarchiesi@0
|
960
|
danielebarchiesi@0
|
961 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
962 if ($component['type'] == 'file') {
|
danielebarchiesi@0
|
963 if (!empty($old_submission->data[$cid]['value'])) {
|
danielebarchiesi@0
|
964 $old_fids = array_merge($old_fids, $old_submission->data[$cid]['value']);
|
danielebarchiesi@0
|
965 }
|
danielebarchiesi@0
|
966 }
|
danielebarchiesi@0
|
967 }
|
danielebarchiesi@0
|
968 }
|
danielebarchiesi@0
|
969
|
danielebarchiesi@0
|
970 // Save the list of added or removed files so we can add usage in
|
danielebarchiesi@0
|
971 // hook_webform_submission_insert() or _update().
|
danielebarchiesi@0
|
972 $submission->file_usage = array(
|
danielebarchiesi@0
|
973 // Diff the old against new to determine what files were deleted.
|
danielebarchiesi@0
|
974 'deleted_fids' => array_diff($old_fids, $new_fids),
|
danielebarchiesi@0
|
975 // Diff the new files against old to determine new uploads.
|
danielebarchiesi@0
|
976 'added_fids' => array_diff($new_fids, $old_fids)
|
danielebarchiesi@0
|
977 );
|
danielebarchiesi@0
|
978 }
|
danielebarchiesi@0
|
979 }
|
danielebarchiesi@0
|
980
|
danielebarchiesi@0
|
981 /**
|
danielebarchiesi@0
|
982 * Implements hook_webform_submission_insert().
|
danielebarchiesi@0
|
983 */
|
danielebarchiesi@0
|
984 function webform_webform_submission_insert($node, $submission) {
|
danielebarchiesi@0
|
985 if (isset($submission->file_usage)) {
|
danielebarchiesi@0
|
986 webform_component_include('file');
|
danielebarchiesi@0
|
987 webform_file_usage_adjust($submission);
|
danielebarchiesi@0
|
988 }
|
danielebarchiesi@0
|
989 }
|
danielebarchiesi@0
|
990
|
danielebarchiesi@0
|
991 /**
|
danielebarchiesi@0
|
992 * Implements hook_webform_submission_update().
|
danielebarchiesi@0
|
993 */
|
danielebarchiesi@0
|
994 function webform_webform_submission_update($node, $submission) {
|
danielebarchiesi@0
|
995 if (isset($submission->file_usage)) {
|
danielebarchiesi@0
|
996 webform_component_include('file');
|
danielebarchiesi@0
|
997 webform_file_usage_adjust($submission);
|
danielebarchiesi@0
|
998 }
|
danielebarchiesi@0
|
999 }
|
danielebarchiesi@0
|
1000
|
danielebarchiesi@0
|
1001 /**
|
danielebarchiesi@0
|
1002 * Implements hook_webform_submission_render_alter().
|
danielebarchiesi@0
|
1003 */
|
danielebarchiesi@0
|
1004 function webform_webform_submission_render_alter(&$renderable) {
|
danielebarchiesi@0
|
1005 // If displaying a submission to end-users who are viewing their own
|
danielebarchiesi@0
|
1006 // submissions (and not through an e-mail), do not show hidden values.
|
danielebarchiesi@0
|
1007 // This needs to be implemented at the level of the entire submission, since
|
danielebarchiesi@0
|
1008 // individual components do not get contextual information about where they
|
danielebarchiesi@0
|
1009 // are being displayed.
|
danielebarchiesi@0
|
1010 $node = $renderable['#node'];
|
danielebarchiesi@0
|
1011 $is_admin = webform_results_access($node);
|
danielebarchiesi@0
|
1012 if (empty($renderable['#email']) && !$is_admin) {
|
danielebarchiesi@0
|
1013 // Find and hide the display of all hidden components.
|
danielebarchiesi@0
|
1014 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
1015 if ($component['type'] == 'hidden') {
|
danielebarchiesi@0
|
1016 $parents = webform_component_parent_keys($node, $component);
|
danielebarchiesi@0
|
1017 $element = &$renderable;
|
danielebarchiesi@0
|
1018 foreach ($parents as $pid) {
|
danielebarchiesi@0
|
1019 $element = &$element[$pid];
|
danielebarchiesi@0
|
1020 }
|
danielebarchiesi@0
|
1021 $element['#access'] = FALSE;
|
danielebarchiesi@0
|
1022 }
|
danielebarchiesi@0
|
1023 }
|
danielebarchiesi@0
|
1024 }
|
danielebarchiesi@0
|
1025 }
|
danielebarchiesi@0
|
1026
|
danielebarchiesi@0
|
1027 /**
|
danielebarchiesi@0
|
1028 * Implements hook_file_download().
|
danielebarchiesi@0
|
1029 *
|
danielebarchiesi@0
|
1030 * Only allow users with view webform submissions to download files.
|
danielebarchiesi@0
|
1031 */
|
danielebarchiesi@0
|
1032 function webform_file_download($uri) {
|
danielebarchiesi@0
|
1033 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
1034
|
danielebarchiesi@0
|
1035 // Determine whether this file was a webform upload.
|
danielebarchiesi@0
|
1036 $row = db_query("SELECT fu.id as sid, f.fid FROM {file_managed} f LEFT JOIN {file_usage} fu ON f.fid = fu.fid AND fu.module = :webform AND fu.type = :submission WHERE f.uri = :uri", array('uri' => $uri, ':webform' => 'webform', ':submission' => 'submission'))->fetchObject();
|
danielebarchiesi@0
|
1037 if ($row) {
|
danielebarchiesi@0
|
1038 $file = file_load($row->fid);
|
danielebarchiesi@0
|
1039 }
|
danielebarchiesi@0
|
1040 if (!empty($row->sid)) {
|
danielebarchiesi@0
|
1041 $submissions = webform_get_submissions(array('sid' => $row->sid));
|
danielebarchiesi@0
|
1042 $submission = reset($submissions);
|
danielebarchiesi@0
|
1043 }
|
danielebarchiesi@0
|
1044
|
danielebarchiesi@0
|
1045 // Grant access based on access to the submission.
|
danielebarchiesi@0
|
1046 if (!empty($submission)) {
|
danielebarchiesi@0
|
1047 $node = node_load($submission->nid);
|
danielebarchiesi@0
|
1048 if (webform_submission_access($node, $submission)) {
|
danielebarchiesi@0
|
1049 return file_get_content_headers($file);
|
danielebarchiesi@0
|
1050 }
|
danielebarchiesi@0
|
1051 }
|
danielebarchiesi@0
|
1052 // Grant access to files uploaded by a user before the submission is saved.
|
danielebarchiesi@0
|
1053 elseif (!empty($file) && !empty($_SESSION['webform_files'][$file->fid])) {
|
danielebarchiesi@0
|
1054 return file_get_content_headers($file);
|
danielebarchiesi@0
|
1055 }
|
danielebarchiesi@0
|
1056 }
|
danielebarchiesi@0
|
1057
|
danielebarchiesi@0
|
1058 /**
|
danielebarchiesi@0
|
1059 * Implements hook_node_type().
|
danielebarchiesi@0
|
1060 *
|
danielebarchiesi@0
|
1061 * Not a real hook in Drupal 7. Re-used for consistency with the D6 version.
|
danielebarchiesi@0
|
1062 */
|
danielebarchiesi@0
|
1063 function webform_node_type($op, $info) {
|
danielebarchiesi@0
|
1064 $webform_types = webform_variable_get('webform_node_types');
|
danielebarchiesi@0
|
1065 $affected_type = isset($info->old_type) ? $info->old_type : $info->type;
|
danielebarchiesi@0
|
1066 $key = array_search($affected_type, $webform_types);
|
danielebarchiesi@0
|
1067 if ($key !== FALSE) {
|
danielebarchiesi@0
|
1068 if ($op == 'update') {
|
danielebarchiesi@0
|
1069 $webform_types[$key] = $info->type;
|
danielebarchiesi@0
|
1070 }
|
danielebarchiesi@0
|
1071 if ($op == 'delete') {
|
danielebarchiesi@0
|
1072 unset($webform_types[$key]);
|
danielebarchiesi@0
|
1073 }
|
danielebarchiesi@0
|
1074 variable_set('webform_node_types', $webform_types);
|
danielebarchiesi@0
|
1075 }
|
danielebarchiesi@0
|
1076 }
|
danielebarchiesi@0
|
1077
|
danielebarchiesi@0
|
1078 /**
|
danielebarchiesi@0
|
1079 * Implements hook_node_type_update().
|
danielebarchiesi@0
|
1080 */
|
danielebarchiesi@0
|
1081 function webform_node_type_update($info) {
|
danielebarchiesi@0
|
1082 webform_node_type('update', $info);
|
danielebarchiesi@0
|
1083 }
|
danielebarchiesi@0
|
1084
|
danielebarchiesi@0
|
1085 /**
|
danielebarchiesi@0
|
1086 * Implements hook_node_type_delete().
|
danielebarchiesi@0
|
1087 */
|
danielebarchiesi@0
|
1088 function webform_node_type_delete($info) {
|
danielebarchiesi@0
|
1089 webform_node_type('delete', $info);
|
danielebarchiesi@0
|
1090 }
|
danielebarchiesi@0
|
1091
|
danielebarchiesi@0
|
1092 /**
|
danielebarchiesi@0
|
1093 * Implements hook_node_insert().
|
danielebarchiesi@0
|
1094 */
|
danielebarchiesi@0
|
1095 function webform_node_insert($node) {
|
danielebarchiesi@0
|
1096 if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
|
danielebarchiesi@0
|
1097 return;
|
danielebarchiesi@0
|
1098 }
|
danielebarchiesi@0
|
1099
|
danielebarchiesi@0
|
1100 // If added directly through node_save(), set defaults for the node.
|
danielebarchiesi@0
|
1101 if (!isset($node->webform)) {
|
danielebarchiesi@0
|
1102 $node->webform = webform_node_defaults();
|
danielebarchiesi@0
|
1103 }
|
danielebarchiesi@0
|
1104
|
danielebarchiesi@0
|
1105 // Do not make an entry if this node does not have any Webform settings.
|
danielebarchiesi@0
|
1106 if ($node->webform == webform_node_defaults() && !in_array($node->type, webform_variable_get('webform_node_types_primary'))) {
|
danielebarchiesi@0
|
1107 return;
|
danielebarchiesi@0
|
1108 }
|
danielebarchiesi@0
|
1109
|
danielebarchiesi@0
|
1110 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
1111 module_load_include('inc', 'webform', 'includes/webform.emails');
|
danielebarchiesi@0
|
1112
|
danielebarchiesi@0
|
1113 // Insert the webform.
|
danielebarchiesi@0
|
1114 $node->webform['nid'] = $node->nid;
|
danielebarchiesi@0
|
1115 $node->webform['record_exists'] = (bool) drupal_write_record('webform', $node->webform);
|
danielebarchiesi@0
|
1116
|
danielebarchiesi@0
|
1117 // Insert the components into the database. Used with clone.module.
|
danielebarchiesi@0
|
1118 if (isset($node->webform['components']) && !empty($node->webform['components'])) {
|
danielebarchiesi@0
|
1119 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
1120 $component['nid'] = $node->nid; // Required for clone.module.
|
danielebarchiesi@0
|
1121 webform_component_insert($component);
|
danielebarchiesi@0
|
1122 }
|
danielebarchiesi@0
|
1123 }
|
danielebarchiesi@0
|
1124
|
danielebarchiesi@0
|
1125 // Insert emails. Also used with clone.module.
|
danielebarchiesi@0
|
1126 if (isset($node->webform['emails']) && !empty($node->webform['emails'])) {
|
danielebarchiesi@0
|
1127 foreach ($node->webform['emails'] as $eid => $email) {
|
danielebarchiesi@0
|
1128 $email['nid'] = $node->nid;
|
danielebarchiesi@0
|
1129 webform_email_insert($email);
|
danielebarchiesi@0
|
1130 }
|
danielebarchiesi@0
|
1131 }
|
danielebarchiesi@0
|
1132
|
danielebarchiesi@0
|
1133 // Set the per-role submission access control.
|
danielebarchiesi@0
|
1134 foreach (array_filter($node->webform['roles']) as $rid) {
|
danielebarchiesi@0
|
1135 db_insert('webform_roles')->fields(array('nid' => $node->nid, 'rid' => $rid))->execute();
|
danielebarchiesi@0
|
1136 }
|
danielebarchiesi@0
|
1137 }
|
danielebarchiesi@0
|
1138
|
danielebarchiesi@0
|
1139 /**
|
danielebarchiesi@0
|
1140 * Implements hook_node_update().
|
danielebarchiesi@0
|
1141 */
|
danielebarchiesi@0
|
1142 function webform_node_update($node) {
|
danielebarchiesi@0
|
1143 if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
|
danielebarchiesi@0
|
1144 return;
|
danielebarchiesi@0
|
1145 }
|
danielebarchiesi@0
|
1146
|
danielebarchiesi@0
|
1147 // Check if this node needs a webform record at all. If it matches the
|
danielebarchiesi@0
|
1148 // defaults, any existing record will be deleted.
|
danielebarchiesi@0
|
1149 webform_check_record($node);
|
danielebarchiesi@0
|
1150
|
danielebarchiesi@0
|
1151 // If a webform row doesn't even exist, we can assume it needs to be inserted.
|
danielebarchiesi@0
|
1152 // If the the webform matches the defaults, no row will be inserted.
|
danielebarchiesi@0
|
1153 if (!$node->webform['record_exists']) {
|
danielebarchiesi@0
|
1154 webform_node_insert($node);
|
danielebarchiesi@0
|
1155 return;
|
danielebarchiesi@0
|
1156 }
|
danielebarchiesi@0
|
1157
|
danielebarchiesi@0
|
1158 // Update the webform entry.
|
danielebarchiesi@0
|
1159 $node->webform['nid'] = $node->nid;
|
danielebarchiesi@0
|
1160 drupal_write_record('webform', $node->webform, array('nid'));
|
danielebarchiesi@0
|
1161
|
danielebarchiesi@0
|
1162 // Compare the webform components and don't do anything if it's not needed.
|
danielebarchiesi@0
|
1163 // The internal cache needs to be reset here so that the cached node entity
|
danielebarchiesi@0
|
1164 // does not get loaded and invalidate the comparisons.
|
danielebarchiesi@0
|
1165 $original = node_load($node->nid, NULL, TRUE);
|
danielebarchiesi@0
|
1166
|
danielebarchiesi@0
|
1167 if ($original->webform['components'] != $node->webform['components']) {
|
danielebarchiesi@0
|
1168 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
1169
|
danielebarchiesi@0
|
1170 $original_cids = array_keys($original->webform['components']);
|
danielebarchiesi@0
|
1171 $current_cids = array_keys($node->webform['components']);
|
danielebarchiesi@0
|
1172
|
danielebarchiesi@0
|
1173 $all_cids = array_unique(array_merge($original_cids, $current_cids));
|
danielebarchiesi@0
|
1174 $deleted_cids = array_diff($original_cids, $current_cids);
|
danielebarchiesi@0
|
1175 $inserted_cids = array_diff($current_cids, $original_cids);
|
danielebarchiesi@0
|
1176
|
danielebarchiesi@0
|
1177 foreach ($all_cids as $cid) {
|
danielebarchiesi@0
|
1178 if (in_array($cid, $inserted_cids)) {
|
danielebarchiesi@0
|
1179 webform_component_insert($node->webform['components'][$cid]);
|
danielebarchiesi@0
|
1180 }
|
danielebarchiesi@0
|
1181 elseif (in_array($cid, $deleted_cids)) {
|
danielebarchiesi@0
|
1182 webform_component_delete($node, $original->webform['components'][$cid]);
|
danielebarchiesi@0
|
1183 }
|
danielebarchiesi@0
|
1184 elseif ($node->webform['components'][$cid] != $original->webform['components'][$cid]) {
|
danielebarchiesi@0
|
1185 $node->webform['components'][$cid]['nid'] = $node->nid;
|
danielebarchiesi@0
|
1186 webform_component_update($node->webform['components'][$cid]);
|
danielebarchiesi@0
|
1187 }
|
danielebarchiesi@0
|
1188 }
|
danielebarchiesi@0
|
1189 }
|
danielebarchiesi@0
|
1190
|
danielebarchiesi@0
|
1191 // Compare the webform e-mails and don't do anything if it's not needed.
|
danielebarchiesi@0
|
1192 if ($original->webform['emails'] != $node->webform['emails']) {
|
danielebarchiesi@0
|
1193 module_load_include('inc', 'webform', 'includes/webform.emails');
|
danielebarchiesi@0
|
1194
|
danielebarchiesi@0
|
1195 $original_eids = array_keys($original->webform['emails']);
|
danielebarchiesi@0
|
1196 $current_eids = array_keys($node->webform['emails']);
|
danielebarchiesi@0
|
1197
|
danielebarchiesi@0
|
1198 $all_eids = array_unique(array_merge($original_eids, $current_eids));
|
danielebarchiesi@0
|
1199 $deleted_eids = array_diff($original_eids, $current_eids);
|
danielebarchiesi@0
|
1200 $inserted_eids = array_diff($current_eids, $original_eids);
|
danielebarchiesi@0
|
1201
|
danielebarchiesi@0
|
1202 foreach ($all_eids as $eid) {
|
danielebarchiesi@0
|
1203 if (in_array($eid, $inserted_eids)) {
|
danielebarchiesi@0
|
1204 webform_email_insert($node->webform['emails'][$eid]);
|
danielebarchiesi@0
|
1205 }
|
danielebarchiesi@0
|
1206 elseif (in_array($eid, $deleted_eids)) {
|
danielebarchiesi@0
|
1207 webform_email_delete($node, $original->webform['emails'][$eid]);
|
danielebarchiesi@0
|
1208 }
|
danielebarchiesi@0
|
1209 elseif ($node->webform['emails'][$eid] != $original->webform['emails'][$eid]) {
|
danielebarchiesi@0
|
1210 $node->webform['emails'][$eid]['nid'] = $node->nid;
|
danielebarchiesi@0
|
1211 webform_email_update($node->webform['emails'][$eid]);
|
danielebarchiesi@0
|
1212 }
|
danielebarchiesi@0
|
1213 }
|
danielebarchiesi@0
|
1214 }
|
danielebarchiesi@0
|
1215
|
danielebarchiesi@0
|
1216 // Just delete and re-insert roles if they've changed.
|
danielebarchiesi@0
|
1217 if ($original->webform['roles'] != $node->webform['roles']) {
|
danielebarchiesi@0
|
1218 db_delete('webform_roles')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1219 foreach (array_filter($node->webform['roles']) as $rid) {
|
danielebarchiesi@0
|
1220 db_insert('webform_roles')->fields(array('nid' => $node->nid, 'rid' => $rid))->execute();
|
danielebarchiesi@0
|
1221 }
|
danielebarchiesi@0
|
1222 }
|
danielebarchiesi@0
|
1223 }
|
danielebarchiesi@0
|
1224
|
danielebarchiesi@0
|
1225 /**
|
danielebarchiesi@0
|
1226 * Implements hook_delete().
|
danielebarchiesi@0
|
1227 */
|
danielebarchiesi@0
|
1228 function webform_node_delete($node) {
|
danielebarchiesi@0
|
1229 if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
|
danielebarchiesi@0
|
1230 return;
|
danielebarchiesi@0
|
1231 }
|
danielebarchiesi@0
|
1232
|
danielebarchiesi@0
|
1233 // Allow components clean up extra data, such as uploaded files.
|
danielebarchiesi@0
|
1234 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
1235 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
1236 webform_component_delete($node, $component);
|
danielebarchiesi@0
|
1237 }
|
danielebarchiesi@0
|
1238
|
danielebarchiesi@0
|
1239 // Remove any trace of webform data from the database.
|
danielebarchiesi@0
|
1240 db_delete('webform')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1241 db_delete('webform_component')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1242 db_delete('webform_emails')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1243 db_delete('webform_roles')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1244 db_delete('webform_submissions')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1245 db_delete('webform_submitted_data')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1246 db_delete('webform_last_download')->condition('nid', $node->nid)->execute();
|
danielebarchiesi@0
|
1247 }
|
danielebarchiesi@0
|
1248
|
danielebarchiesi@0
|
1249 /**
|
danielebarchiesi@0
|
1250 * Default settings for a newly created webform node.
|
danielebarchiesi@0
|
1251 */
|
danielebarchiesi@0
|
1252 function webform_node_defaults() {
|
danielebarchiesi@0
|
1253 $defaults = array(
|
danielebarchiesi@0
|
1254 'confirmation' => '',
|
danielebarchiesi@0
|
1255 'confirmation_format' => NULL,
|
danielebarchiesi@0
|
1256 'redirect_url' => '<confirmation>',
|
danielebarchiesi@0
|
1257 'teaser' => '0',
|
danielebarchiesi@0
|
1258 'block' => '0',
|
danielebarchiesi@0
|
1259 'allow_draft' => '0',
|
danielebarchiesi@0
|
1260 'auto_save' => '0',
|
danielebarchiesi@0
|
1261 'submit_notice' => '1',
|
danielebarchiesi@0
|
1262 'submit_text' => '',
|
danielebarchiesi@0
|
1263 'submit_limit' => '-1',
|
danielebarchiesi@0
|
1264 'submit_interval' => '-1',
|
danielebarchiesi@0
|
1265 'total_submit_limit' => '-1',
|
danielebarchiesi@0
|
1266 'total_submit_interval' => '-1',
|
danielebarchiesi@0
|
1267 'status' => '1',
|
danielebarchiesi@0
|
1268 'record_exists' => FALSE,
|
danielebarchiesi@0
|
1269 'roles' => array('1', '2'),
|
danielebarchiesi@0
|
1270 'emails' => array(),
|
danielebarchiesi@0
|
1271 'components' => array(),
|
danielebarchiesi@0
|
1272 );
|
danielebarchiesi@0
|
1273 drupal_alter('webform_node_defaults', $defaults);
|
danielebarchiesi@0
|
1274 return $defaults;
|
danielebarchiesi@0
|
1275 }
|
danielebarchiesi@0
|
1276
|
danielebarchiesi@0
|
1277 /**
|
danielebarchiesi@0
|
1278 * Implements hook_node_prepare().
|
danielebarchiesi@0
|
1279 */
|
danielebarchiesi@0
|
1280 function webform_node_prepare($node) {
|
danielebarchiesi@0
|
1281 $webform_types = webform_variable_get('webform_node_types');
|
danielebarchiesi@0
|
1282 if (in_array($node->type, $webform_types) && !isset($node->webform)) {
|
danielebarchiesi@0
|
1283 $node->webform = webform_node_defaults();
|
danielebarchiesi@0
|
1284 }
|
danielebarchiesi@0
|
1285 }
|
danielebarchiesi@0
|
1286
|
danielebarchiesi@0
|
1287
|
danielebarchiesi@0
|
1288 /**
|
danielebarchiesi@0
|
1289 * Implements hook_node_load().
|
danielebarchiesi@0
|
1290 */
|
danielebarchiesi@0
|
1291 function webform_node_load($nodes, $types) {
|
danielebarchiesi@0
|
1292 // Quick check to see if we need to do anything at all for these nodes.
|
danielebarchiesi@0
|
1293 $webform_types = webform_variable_get('webform_node_types');
|
danielebarchiesi@0
|
1294 if (count(array_intersect($types, $webform_types)) == 0) {
|
danielebarchiesi@0
|
1295 return;
|
danielebarchiesi@0
|
1296 }
|
danielebarchiesi@0
|
1297
|
danielebarchiesi@0
|
1298 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
1299
|
danielebarchiesi@0
|
1300 // Select all webforms that match these node IDs.
|
danielebarchiesi@0
|
1301 $result = db_select('webform')
|
danielebarchiesi@0
|
1302 ->fields('webform')
|
danielebarchiesi@0
|
1303 ->condition('nid', array_keys($nodes), 'IN')
|
danielebarchiesi@0
|
1304 ->execute()
|
danielebarchiesi@0
|
1305 ->fetchAllAssoc('nid', PDO::FETCH_ASSOC);
|
danielebarchiesi@0
|
1306
|
danielebarchiesi@0
|
1307 foreach ($result as $nid => $webform) {
|
danielebarchiesi@0
|
1308 // Load the basic information for each node.
|
danielebarchiesi@0
|
1309 $nodes[$nid]->webform = $webform;
|
danielebarchiesi@0
|
1310 $nodes[$nid]->webform['record_exists'] = TRUE;
|
danielebarchiesi@0
|
1311 }
|
danielebarchiesi@0
|
1312
|
danielebarchiesi@0
|
1313 // Load the components, emails, and defaults for all webform-enabled nodes.
|
danielebarchiesi@0
|
1314 // TODO: Increase efficiency here by pulling in all information all at once
|
danielebarchiesi@0
|
1315 // instead of individual queries.
|
danielebarchiesi@0
|
1316 foreach ($nodes as $nid => $node) {
|
danielebarchiesi@0
|
1317 if (!in_array($node->type, $webform_types)) {
|
danielebarchiesi@0
|
1318 continue;
|
danielebarchiesi@0
|
1319 }
|
danielebarchiesi@0
|
1320
|
danielebarchiesi@0
|
1321 // If a webform record doesn't exist, just return the defaults.
|
danielebarchiesi@0
|
1322 if (!isset($nodes[$nid]->webform)) {
|
danielebarchiesi@0
|
1323 $nodes[$nid]->webform = webform_node_defaults();
|
danielebarchiesi@0
|
1324 continue;
|
danielebarchiesi@0
|
1325 }
|
danielebarchiesi@0
|
1326
|
danielebarchiesi@0
|
1327 $nodes[$nid]->webform['roles'] = db_select('webform_roles')
|
danielebarchiesi@0
|
1328 ->fields('webform_roles', array('rid'))
|
danielebarchiesi@0
|
1329 ->condition('nid', $nid)
|
danielebarchiesi@0
|
1330 ->execute()
|
danielebarchiesi@0
|
1331 ->fetchCol();
|
danielebarchiesi@0
|
1332 $nodes[$nid]->webform['emails'] = db_select('webform_emails')
|
danielebarchiesi@0
|
1333 ->fields('webform_emails')
|
danielebarchiesi@0
|
1334 ->condition('nid', $nid)
|
danielebarchiesi@0
|
1335 ->execute()
|
danielebarchiesi@0
|
1336 ->fetchAllAssoc('eid', PDO::FETCH_ASSOC);
|
danielebarchiesi@0
|
1337
|
danielebarchiesi@0
|
1338 // Unserialize the exclude component list for e-mails.
|
danielebarchiesi@0
|
1339 foreach ($nodes[$nid]->webform['emails'] as $eid => $email) {
|
danielebarchiesi@0
|
1340 $nodes[$nid]->webform['emails'][$eid]['excluded_components'] = array_filter(explode(',', $email['excluded_components']));
|
danielebarchiesi@0
|
1341 if (variable_get('webform_format_override', 0)) {
|
danielebarchiesi@0
|
1342 $nodes[$nid]->webform['emails'][$eid]['html'] = variable_get('webform_default_format', 0);
|
danielebarchiesi@0
|
1343 }
|
danielebarchiesi@0
|
1344 }
|
danielebarchiesi@0
|
1345
|
danielebarchiesi@0
|
1346 // Load components for each node.
|
danielebarchiesi@0
|
1347 $nodes[$nid]->webform['components'] = db_select('webform_component')
|
danielebarchiesi@0
|
1348 ->fields('webform_component')
|
danielebarchiesi@0
|
1349 ->condition('nid', $nid)
|
danielebarchiesi@0
|
1350 ->orderBy('weight')
|
danielebarchiesi@0
|
1351 ->orderBy('name')
|
danielebarchiesi@0
|
1352 ->execute()
|
danielebarchiesi@0
|
1353 ->fetchAllAssoc('cid', PDO::FETCH_ASSOC);
|
danielebarchiesi@0
|
1354
|
danielebarchiesi@0
|
1355 // Do a little cleanup on each component.
|
danielebarchiesi@0
|
1356 foreach ($nodes[$nid]->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
1357 $nodes[$nid]->webform['components'][$cid]['nid'] = $nid;
|
danielebarchiesi@0
|
1358 $nodes[$nid]->webform['components'][$cid]['extra'] = unserialize($component['extra']);
|
danielebarchiesi@0
|
1359 webform_component_defaults($nodes[$nid]->webform['components'][$cid]);
|
danielebarchiesi@0
|
1360 }
|
danielebarchiesi@0
|
1361
|
danielebarchiesi@0
|
1362 // Organize the components into a fieldset-based order.
|
danielebarchiesi@0
|
1363 if (!empty($nodes[$nid]->webform['components'])) {
|
danielebarchiesi@0
|
1364 $component_tree = array();
|
danielebarchiesi@0
|
1365 $page_count = 1;
|
danielebarchiesi@0
|
1366 _webform_components_tree_build($nodes[$nid]->webform['components'], $component_tree, 0, $page_count);
|
danielebarchiesi@0
|
1367 $nodes[$nid]->webform['components'] = _webform_components_tree_flatten($component_tree['children']);
|
danielebarchiesi@0
|
1368 }
|
danielebarchiesi@0
|
1369 }
|
danielebarchiesi@0
|
1370 }
|
danielebarchiesi@0
|
1371
|
danielebarchiesi@0
|
1372 /**
|
danielebarchiesi@0
|
1373 * Implements hook_link().
|
danielebarchiesi@0
|
1374 * Always add a "view form" link.
|
danielebarchiesi@0
|
1375 */
|
danielebarchiesi@0
|
1376 function webform_link($type, $node = NULL, $teaser = FALSE) {
|
danielebarchiesi@0
|
1377 $links = array();
|
danielebarchiesi@0
|
1378 if (isset($node->type) && $node->type === 'webform') {
|
danielebarchiesi@0
|
1379 if ($teaser && !$node->webform['teaser']) {
|
danielebarchiesi@0
|
1380 $links['webform_goto'] = array(
|
danielebarchiesi@0
|
1381 'title' => t('Go to form'),
|
danielebarchiesi@0
|
1382 'href' => 'node/' . $node->nid,
|
danielebarchiesi@0
|
1383 'attributes' => array('title' => t('View this form.'), 'class' => array('read-more'))
|
danielebarchiesi@0
|
1384 );
|
danielebarchiesi@0
|
1385 }
|
danielebarchiesi@0
|
1386 }
|
danielebarchiesi@0
|
1387 return $links;
|
danielebarchiesi@0
|
1388 }
|
danielebarchiesi@0
|
1389
|
danielebarchiesi@0
|
1390 /**
|
danielebarchiesi@0
|
1391 * Implements hook_form_alter().
|
danielebarchiesi@0
|
1392 */
|
danielebarchiesi@0
|
1393 function webform_form_alter(&$form, $form_state, $form_id) {
|
danielebarchiesi@0
|
1394 $matches = array();
|
danielebarchiesi@0
|
1395 if (isset($form['#node']->type) && $form_id == $form['#node']->type . '_node_form' && in_array($form['#node']->type, webform_variable_get('webform_node_types'))) {
|
danielebarchiesi@0
|
1396 $node = $form['#node'];
|
danielebarchiesi@0
|
1397 // Preserve all Webform options currently set on the node.
|
danielebarchiesi@0
|
1398 $form['webform'] = array(
|
danielebarchiesi@0
|
1399 '#type' => 'value',
|
danielebarchiesi@0
|
1400 '#value' => $node->webform,
|
danielebarchiesi@0
|
1401 );
|
danielebarchiesi@0
|
1402
|
danielebarchiesi@0
|
1403 // If a new node, redirect the user to the components form after save.
|
danielebarchiesi@0
|
1404 if (empty($node->nid) && in_array($node->type, webform_variable_get('webform_node_types_primary'))) {
|
danielebarchiesi@0
|
1405 $form['actions']['submit']['#submit'][] = 'webform_form_submit';
|
danielebarchiesi@0
|
1406 }
|
danielebarchiesi@0
|
1407 }
|
danielebarchiesi@0
|
1408 }
|
danielebarchiesi@0
|
1409
|
danielebarchiesi@0
|
1410 /**
|
danielebarchiesi@0
|
1411 * Submit handler for the webform node form.
|
danielebarchiesi@0
|
1412 *
|
danielebarchiesi@0
|
1413 * Redirect the user to the components form on new node inserts. Note that this
|
danielebarchiesi@0
|
1414 * fires after the hook_submit() function above.
|
danielebarchiesi@0
|
1415 */
|
danielebarchiesi@0
|
1416 function webform_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
1417 drupal_set_message(t('The new webform %title has been created. Add new fields to your webform with the form below.', array('%title' => $form_state['values']['title'])));
|
danielebarchiesi@0
|
1418 $form_state['redirect'] = 'node/' . $form_state['nid'] . '/webform/components';
|
danielebarchiesi@0
|
1419 }
|
danielebarchiesi@0
|
1420
|
danielebarchiesi@0
|
1421 /**
|
danielebarchiesi@0
|
1422 * Implements hook_node_view().
|
danielebarchiesi@0
|
1423 */
|
danielebarchiesi@0
|
1424 function webform_node_view($node, $view_mode) {
|
danielebarchiesi@0
|
1425 global $user;
|
danielebarchiesi@0
|
1426
|
danielebarchiesi@0
|
1427 if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
|
danielebarchiesi@0
|
1428 return;
|
danielebarchiesi@0
|
1429 }
|
danielebarchiesi@0
|
1430
|
danielebarchiesi@0
|
1431 // Set teaser and page variables a la Drupal 6.
|
danielebarchiesi@0
|
1432 $teaser = $view_mode == 'teaser';
|
danielebarchiesi@0
|
1433 $page = arg(0) == 'node' && arg(1) == $node->nid;
|
danielebarchiesi@0
|
1434
|
danielebarchiesi@0
|
1435 // If empty, a teaser, or a new node (during preview) do not display.
|
danielebarchiesi@0
|
1436 if (empty($node->webform['components']) || ($teaser && !$node->webform['teaser']) || empty($node->nid)) {
|
danielebarchiesi@0
|
1437 return;
|
danielebarchiesi@0
|
1438 }
|
danielebarchiesi@0
|
1439
|
danielebarchiesi@0
|
1440 // Do not include the form in the search index if indexing is disabled.
|
danielebarchiesi@0
|
1441 if (module_exists('search') && $view_mode == 'search_index' && !variable_get('webform_search_index', 1)) {
|
danielebarchiesi@0
|
1442 return;
|
danielebarchiesi@0
|
1443 }
|
danielebarchiesi@0
|
1444
|
danielebarchiesi@0
|
1445 $info = array();
|
danielebarchiesi@0
|
1446 $submission = array();
|
danielebarchiesi@0
|
1447 $submission_count = 0;
|
danielebarchiesi@0
|
1448 $enabled = TRUE;
|
danielebarchiesi@0
|
1449 $logging_in = FALSE;
|
danielebarchiesi@0
|
1450 $total_limit_exceeded = FALSE;
|
danielebarchiesi@0
|
1451 $user_limit_exceeded = FALSE;
|
danielebarchiesi@0
|
1452 $closed = FALSE;
|
danielebarchiesi@0
|
1453 $allowed_roles = array();
|
danielebarchiesi@0
|
1454
|
danielebarchiesi@0
|
1455 // If a teaser, tell the form to load subsequent pages on the node page.
|
danielebarchiesi@0
|
1456 if ($teaser && !isset($node->webform['action'])) {
|
danielebarchiesi@0
|
1457 $query = array_diff_key($_GET, array('q' => ''));
|
danielebarchiesi@0
|
1458 $node->webform['action'] = url('node/' . $node->nid, array('query' => $query));
|
danielebarchiesi@0
|
1459 }
|
danielebarchiesi@0
|
1460
|
danielebarchiesi@0
|
1461 // When logging in using a form on the same page as a webform node, suppress
|
danielebarchiesi@0
|
1462 // output messages so that they don't show up after the user has logged in.
|
danielebarchiesi@0
|
1463 // See http://drupal.org/node/239343.
|
danielebarchiesi@0
|
1464 if (isset($_POST['op']) && isset($_POST['name']) && isset($_POST['pass'])) {
|
danielebarchiesi@0
|
1465 $logging_in = TRUE;
|
danielebarchiesi@0
|
1466 }
|
danielebarchiesi@0
|
1467
|
danielebarchiesi@0
|
1468 if ($node->webform['status'] == 0) {
|
danielebarchiesi@0
|
1469 $closed = TRUE;
|
danielebarchiesi@0
|
1470 $enabled = FALSE;
|
danielebarchiesi@0
|
1471 }
|
danielebarchiesi@0
|
1472 else {
|
danielebarchiesi@0
|
1473 // Check if the user's role can submit this webform.
|
danielebarchiesi@0
|
1474 if (variable_get('webform_submission_access_control', 1)) {
|
danielebarchiesi@0
|
1475 foreach ($node->webform['roles'] as $rid) {
|
danielebarchiesi@0
|
1476 $allowed_roles[$rid] = isset($user->roles[$rid]) ? TRUE : FALSE;
|
danielebarchiesi@0
|
1477 }
|
danielebarchiesi@0
|
1478 if (array_search(TRUE, $allowed_roles) === FALSE && $user->uid != 1) {
|
danielebarchiesi@0
|
1479 $enabled = FALSE;
|
danielebarchiesi@0
|
1480 }
|
danielebarchiesi@0
|
1481 }
|
danielebarchiesi@0
|
1482 else {
|
danielebarchiesi@0
|
1483 // If not using Webform submission access control, allow for all roles.
|
danielebarchiesi@0
|
1484 $allowed_roles = array_keys(user_roles());
|
danielebarchiesi@0
|
1485 }
|
danielebarchiesi@0
|
1486 }
|
danielebarchiesi@0
|
1487
|
danielebarchiesi@0
|
1488 // Get a count of previous submissions by this user. Note that the
|
danielebarchiesi@0
|
1489 // webform_submission_access() function may disable the page cache for
|
danielebarchiesi@0
|
1490 // anonymous users if they are allowed to edit their own submissions!
|
danielebarchiesi@0
|
1491 if ($page && webform_submission_access($node, NULL, 'list')) {
|
danielebarchiesi@0
|
1492 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
1493 $submission_count = webform_get_submission_count($node->nid, $user->uid);
|
danielebarchiesi@0
|
1494 }
|
danielebarchiesi@0
|
1495
|
danielebarchiesi@0
|
1496 // Check if this page is cached or not.
|
danielebarchiesi@0
|
1497 $cached = $user->uid == 0 && (variable_get('cache', 0) || drupal_page_is_cacheable() === FALSE);
|
danielebarchiesi@0
|
1498
|
danielebarchiesi@0
|
1499 // Check if the user can add another submission.
|
danielebarchiesi@0
|
1500 if ($node->webform['submit_limit'] != -1) { // -1: Submissions are never throttled.
|
danielebarchiesi@0
|
1501 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
1502
|
danielebarchiesi@0
|
1503 // Disable the form if the limit is exceeded and page cache is not active.
|
danielebarchiesi@0
|
1504 if (($user_limit_exceeded = _webform_submission_user_limit_check($node)) && !$cached) {
|
danielebarchiesi@0
|
1505 $enabled = FALSE;
|
danielebarchiesi@0
|
1506 }
|
danielebarchiesi@0
|
1507 }
|
danielebarchiesi@0
|
1508
|
danielebarchiesi@0
|
1509 // Check if the user can add another submission if there is a limit on total
|
danielebarchiesi@0
|
1510 // submissions.
|
danielebarchiesi@0
|
1511 if ($node->webform['total_submit_limit'] != -1) { // -1: Submissions are never throttled.
|
danielebarchiesi@0
|
1512 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
1513
|
danielebarchiesi@0
|
1514 // Disable the form if the limit is exceeded and page cache is not active.
|
danielebarchiesi@0
|
1515 if (($total_limit_exceeded = _webform_submission_total_limit_check($node)) && !$cached) {
|
danielebarchiesi@0
|
1516 $enabled = FALSE;
|
danielebarchiesi@0
|
1517 }
|
danielebarchiesi@0
|
1518 }
|
danielebarchiesi@0
|
1519
|
danielebarchiesi@0
|
1520 // Check if this user has a draft for this webform.
|
danielebarchiesi@0
|
1521 $is_draft = FALSE;
|
danielebarchiesi@0
|
1522 if (($node->webform['allow_draft'] || $node->webform['auto_save']) && $user->uid != 0) {
|
danielebarchiesi@0
|
1523 // Draft found - display form with draft data for further editing.
|
danielebarchiesi@0
|
1524 if ($draft_sid = _webform_fetch_draft_sid($node->nid, $user->uid)) {
|
danielebarchiesi@0
|
1525 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
1526 $submission = webform_get_submission($node->nid, $draft_sid);
|
danielebarchiesi@0
|
1527 $enabled = TRUE;
|
danielebarchiesi@0
|
1528 $is_draft = TRUE;
|
danielebarchiesi@0
|
1529 }
|
danielebarchiesi@0
|
1530 }
|
danielebarchiesi@0
|
1531
|
danielebarchiesi@0
|
1532 // Render the form and generate the output.
|
danielebarchiesi@0
|
1533 $form = !empty($node->webform['components']) ? drupal_get_form('webform_client_form_' . $node->nid, $node, $submission, $is_draft) : '';
|
danielebarchiesi@0
|
1534
|
danielebarchiesi@0
|
1535 // Remove the surrounding <form> tag if this is a preview.
|
danielebarchiesi@0
|
1536 if (!empty($node->in_preview)) {
|
danielebarchiesi@0
|
1537 $form['#type'] = 'markup';
|
danielebarchiesi@0
|
1538 }
|
danielebarchiesi@0
|
1539
|
danielebarchiesi@0
|
1540 // Print out messages for the webform.
|
danielebarchiesi@0
|
1541 if (empty($node->in_preview) && !isset($node->webform_block) && !$logging_in) {
|
danielebarchiesi@0
|
1542 theme('webform_view_messages', array('node' => $node, 'teaser' => $teaser, 'page' => $page, 'submission_count' => $submission_count, 'user_limit_exceeded' => $user_limit_exceeded, 'total_limit_exceeded' => $total_limit_exceeded, 'allowed_roles' => $allowed_roles, 'closed' => $closed, 'cached' => $cached));
|
danielebarchiesi@0
|
1543 }
|
danielebarchiesi@0
|
1544
|
danielebarchiesi@0
|
1545 // Add the output to the node.
|
danielebarchiesi@0
|
1546 $node->content['webform'] = array(
|
danielebarchiesi@0
|
1547 '#theme' => 'webform_view',
|
danielebarchiesi@0
|
1548 '#node' => $node,
|
danielebarchiesi@0
|
1549 '#teaser' => $teaser,
|
danielebarchiesi@0
|
1550 '#page' => $page,
|
danielebarchiesi@0
|
1551 '#form' => $form,
|
danielebarchiesi@0
|
1552 '#enabled' => $enabled,
|
danielebarchiesi@0
|
1553 '#weight' => 10,
|
danielebarchiesi@0
|
1554 );
|
danielebarchiesi@0
|
1555 }
|
danielebarchiesi@0
|
1556
|
danielebarchiesi@0
|
1557 /**
|
danielebarchiesi@0
|
1558 * Output the Webform into the node content.
|
danielebarchiesi@0
|
1559 *
|
danielebarchiesi@0
|
1560 * @param $node
|
danielebarchiesi@0
|
1561 * The webform node object.
|
danielebarchiesi@0
|
1562 * @param $teaser
|
danielebarchiesi@0
|
1563 * If this webform is being displayed as the teaser view of the node.
|
danielebarchiesi@0
|
1564 * @param $page
|
danielebarchiesi@0
|
1565 * If this webform node is being viewed as the main content of the page.
|
danielebarchiesi@0
|
1566 * @param $form
|
danielebarchiesi@0
|
1567 * The rendered form.
|
danielebarchiesi@0
|
1568 * @param $enabled
|
danielebarchiesi@0
|
1569 * If the form allowed to be completed by the current user.
|
danielebarchiesi@0
|
1570 */
|
danielebarchiesi@0
|
1571 function theme_webform_view($variables) {
|
danielebarchiesi@0
|
1572 // Only show the form if this user is allowed access.
|
danielebarchiesi@0
|
1573 if ($variables['webform']['#enabled']) {
|
danielebarchiesi@0
|
1574 return drupal_render($variables['webform']['#form']);
|
danielebarchiesi@0
|
1575 }
|
danielebarchiesi@0
|
1576 }
|
danielebarchiesi@0
|
1577
|
danielebarchiesi@0
|
1578 /**
|
danielebarchiesi@0
|
1579 * Display a message to a user if they are not allowed to fill out a form.
|
danielebarchiesi@0
|
1580 *
|
danielebarchiesi@0
|
1581 * @param $node
|
danielebarchiesi@0
|
1582 * The webform node object.
|
danielebarchiesi@0
|
1583 * @param $teaser
|
danielebarchiesi@0
|
1584 * If this webform is being displayed as the teaser view of the node.
|
danielebarchiesi@0
|
1585 * @param $page
|
danielebarchiesi@0
|
1586 * If this webform node is being viewed as the main content of the page.
|
danielebarchiesi@0
|
1587 * @param $submission_count
|
danielebarchiesi@0
|
1588 * The number of submissions this user has already submitted. Not calculated
|
danielebarchiesi@0
|
1589 * for anonymous users.
|
danielebarchiesi@0
|
1590 * @param $user_limit_exceeded
|
danielebarchiesi@0
|
1591 * Boolean value if the submission limit for this user has been exceeded.
|
danielebarchiesi@0
|
1592 * @param $total_limit_exceeded
|
danielebarchiesi@0
|
1593 * Boolean value if the total submission limit has been exceeded.
|
danielebarchiesi@0
|
1594 * @param $allowed_roles
|
danielebarchiesi@0
|
1595 * A list of user roles that are allowed to submit this webform.
|
danielebarchiesi@0
|
1596 * @param $closed
|
danielebarchiesi@0
|
1597 * Boolean value if submissions are closed.
|
danielebarchiesi@0
|
1598 */
|
danielebarchiesi@0
|
1599 function theme_webform_view_messages($variables) {
|
danielebarchiesi@0
|
1600 global $user;
|
danielebarchiesi@0
|
1601
|
danielebarchiesi@0
|
1602 $node = $variables['node'];
|
danielebarchiesi@0
|
1603 $teaser = $variables['teaser'];
|
danielebarchiesi@0
|
1604 $page = $variables['page'];
|
danielebarchiesi@0
|
1605 $submission_count = $variables['submission_count'];
|
danielebarchiesi@0
|
1606 $user_limit_exceeded = $variables['user_limit_exceeded'];
|
danielebarchiesi@0
|
1607 $total_limit_exceeded = $variables['total_limit_exceeded'];
|
danielebarchiesi@0
|
1608 $allowed_roles = $variables['allowed_roles'];
|
danielebarchiesi@0
|
1609 $closed = $variables['closed'];
|
danielebarchiesi@0
|
1610 $cached = $variables['cached'];
|
danielebarchiesi@0
|
1611
|
danielebarchiesi@0
|
1612 $type = 'status';
|
danielebarchiesi@0
|
1613
|
danielebarchiesi@0
|
1614 if ($closed) {
|
danielebarchiesi@0
|
1615 $message = t('Submissions for this form are closed.');
|
danielebarchiesi@0
|
1616 }
|
danielebarchiesi@0
|
1617 // If open and not allowed to submit the form, give an explanation.
|
danielebarchiesi@0
|
1618 elseif (array_search(TRUE, $allowed_roles) === FALSE && $user->uid != 1) {
|
danielebarchiesi@0
|
1619 if (empty($allowed_roles)) {
|
danielebarchiesi@0
|
1620 // No roles are allowed to submit the form.
|
danielebarchiesi@0
|
1621 $message = t('Submissions for this form are closed.');
|
danielebarchiesi@0
|
1622 }
|
danielebarchiesi@0
|
1623 elseif (isset($allowed_roles[2])) {
|
danielebarchiesi@0
|
1624 // The "authenticated user" role is allowed to submit and the user is currently logged-out.
|
danielebarchiesi@0
|
1625 $login = url('user/login', array('query' => drupal_get_destination()));
|
danielebarchiesi@0
|
1626 $register = url('user/register', array('query' => drupal_get_destination()));
|
danielebarchiesi@0
|
1627 if (variable_get('user_register', 1) == 0) {
|
danielebarchiesi@0
|
1628 $message = t('You must <a href="!login">login</a> to view this form.', array('!login' => $login));
|
danielebarchiesi@0
|
1629 }
|
danielebarchiesi@0
|
1630 else {
|
danielebarchiesi@0
|
1631 $message = t('You must <a href="!login">login</a> or <a href="!register">register</a> to view this form.', array('!login' => $login, '!register' => $register));
|
danielebarchiesi@0
|
1632 }
|
danielebarchiesi@0
|
1633 }
|
danielebarchiesi@0
|
1634 else {
|
danielebarchiesi@0
|
1635 // The user must be some other role to submit.
|
danielebarchiesi@0
|
1636 $message = t('You do not have permission to view this form.');
|
danielebarchiesi@0
|
1637 }
|
danielebarchiesi@0
|
1638 }
|
danielebarchiesi@0
|
1639
|
danielebarchiesi@0
|
1640 // If the user has exceeded the limit of submissions, explain the limit.
|
danielebarchiesi@0
|
1641 elseif ($user_limit_exceeded && !$cached) {
|
danielebarchiesi@0
|
1642 if ($node->webform['submit_interval'] == -1 && $node->webform['submit_limit'] > 1) {
|
danielebarchiesi@0
|
1643 $message = t('You have submitted this form the maximum number of times (@count).', array('@count' => $node->webform['submit_limit']));
|
danielebarchiesi@0
|
1644 }
|
danielebarchiesi@0
|
1645 elseif ($node->webform['submit_interval'] == -1 && $node->webform['submit_limit'] == 1) {
|
danielebarchiesi@0
|
1646 $message = t('You have already submitted this form.');
|
danielebarchiesi@0
|
1647 }
|
danielebarchiesi@0
|
1648 else {
|
danielebarchiesi@0
|
1649 $message = t('You may not submit another entry at this time.');
|
danielebarchiesi@0
|
1650 }
|
danielebarchiesi@0
|
1651 $type = 'error';
|
danielebarchiesi@0
|
1652 }
|
danielebarchiesi@0
|
1653 elseif ($total_limit_exceeded && !$cached) {
|
danielebarchiesi@0
|
1654 if ($node->webform['total_submit_interval'] == -1 && $node->webform['total_submit_limit'] > 1) {
|
danielebarchiesi@0
|
1655 $message = t('This form has received the maximum number of entries.');
|
danielebarchiesi@0
|
1656 }
|
danielebarchiesi@0
|
1657 else {
|
danielebarchiesi@0
|
1658 $message = t('You may not submit another entry at this time.');
|
danielebarchiesi@0
|
1659 }
|
danielebarchiesi@0
|
1660 }
|
danielebarchiesi@0
|
1661
|
danielebarchiesi@0
|
1662 // If the user has submitted before, give them a link to their submissions.
|
danielebarchiesi@0
|
1663 if ($submission_count > 0 && $node->webform['submit_notice'] == 1 && !$cached) {
|
danielebarchiesi@0
|
1664 if (empty($message)) {
|
danielebarchiesi@0
|
1665 $message = t('You have already submitted this form.') . ' ' . t('<a href="!url">View your previous submissions</a>.', array('!url' => url('node/' . $node->nid . '/submissions')));
|
danielebarchiesi@0
|
1666 }
|
danielebarchiesi@0
|
1667 else {
|
danielebarchiesi@0
|
1668 $message .= ' ' . t('<a href="!url">View your previous submissions</a>.', array('!url' => url('node/' . $node->nid . '/submissions')));
|
danielebarchiesi@0
|
1669 }
|
danielebarchiesi@0
|
1670 }
|
danielebarchiesi@0
|
1671
|
danielebarchiesi@0
|
1672 if ($page && isset($message)) {
|
danielebarchiesi@0
|
1673 drupal_set_message($message, $type, FALSE);
|
danielebarchiesi@0
|
1674 }
|
danielebarchiesi@0
|
1675 }
|
danielebarchiesi@0
|
1676
|
danielebarchiesi@0
|
1677 /**
|
danielebarchiesi@0
|
1678 * Implements hook_mail().
|
danielebarchiesi@0
|
1679 */
|
danielebarchiesi@0
|
1680 function webform_mail($key, &$message, $params) {
|
danielebarchiesi@0
|
1681 $message['headers'] = array_merge($message['headers'], $params['headers']);
|
danielebarchiesi@0
|
1682 $message['subject'] = $params['subject'];
|
danielebarchiesi@0
|
1683 $message['body'][] = $params['message'];
|
danielebarchiesi@0
|
1684 }
|
danielebarchiesi@0
|
1685
|
danielebarchiesi@0
|
1686 /**
|
danielebarchiesi@0
|
1687 * Implements hook_block_info().
|
danielebarchiesi@0
|
1688 */
|
danielebarchiesi@0
|
1689 function webform_block_info() {
|
danielebarchiesi@0
|
1690 $blocks = array();
|
danielebarchiesi@0
|
1691 $webform_node_types = webform_variable_get('webform_node_types');
|
danielebarchiesi@0
|
1692 if (!empty($webform_node_types)) {
|
danielebarchiesi@0
|
1693 $query = db_select('webform', 'w')->fields('w')->fields('n', array('title'));
|
danielebarchiesi@0
|
1694 $query->leftJoin('node', 'n', 'w.nid = n.nid');
|
danielebarchiesi@0
|
1695 $query->condition('w.block', 1);
|
danielebarchiesi@0
|
1696 $query->condition('n.type', $webform_node_types, 'IN');
|
danielebarchiesi@0
|
1697 $result = $query->execute();
|
danielebarchiesi@0
|
1698 foreach ($result as $data) {
|
danielebarchiesi@0
|
1699 $blocks['client-block-' . $data->nid] = array(
|
danielebarchiesi@0
|
1700 'info' => t('Webform: !title', array('!title' => $data->title)),
|
danielebarchiesi@0
|
1701 'cache' => DRUPAL_NO_CACHE,
|
danielebarchiesi@0
|
1702 );
|
danielebarchiesi@0
|
1703 }
|
danielebarchiesi@0
|
1704 }
|
danielebarchiesi@0
|
1705 return $blocks;
|
danielebarchiesi@0
|
1706 }
|
danielebarchiesi@0
|
1707
|
danielebarchiesi@0
|
1708 /**
|
danielebarchiesi@0
|
1709 * Implements hook_block_view().
|
danielebarchiesi@0
|
1710 */
|
danielebarchiesi@0
|
1711 function webform_block_view($delta = '') {
|
danielebarchiesi@0
|
1712 global $user;
|
danielebarchiesi@0
|
1713
|
danielebarchiesi@0
|
1714 // Load the block-specific configuration settings.
|
danielebarchiesi@0
|
1715 $webform_blocks = variable_get('webform_blocks', array());
|
danielebarchiesi@0
|
1716 $settings = isset($webform_blocks[$delta]) ? $webform_blocks[$delta] : array();
|
danielebarchiesi@0
|
1717 $settings += array(
|
danielebarchiesi@0
|
1718 'display' => 'form',
|
danielebarchiesi@0
|
1719 'pages_block' => 0,
|
danielebarchiesi@0
|
1720 );
|
danielebarchiesi@0
|
1721
|
danielebarchiesi@0
|
1722 // Get the node ID from delta.
|
danielebarchiesi@0
|
1723 $nid = drupal_substr($delta, strrpos($delta, '-') + 1);
|
danielebarchiesi@0
|
1724
|
danielebarchiesi@0
|
1725 // Load node in current language.
|
danielebarchiesi@0
|
1726 if (module_exists('translation')) {
|
danielebarchiesi@0
|
1727 global $language;
|
danielebarchiesi@0
|
1728 if (($translations = translation_node_get_translations($nid)) && (isset($translations[$language->language]))) {
|
danielebarchiesi@0
|
1729 $nid = $translations[$language->language]->nid;
|
danielebarchiesi@0
|
1730 }
|
danielebarchiesi@0
|
1731 }
|
danielebarchiesi@0
|
1732
|
danielebarchiesi@0
|
1733 // The webform node to display in the block.
|
danielebarchiesi@0
|
1734 $node = node_load($nid);
|
danielebarchiesi@0
|
1735
|
danielebarchiesi@0
|
1736 // Return if user has no access to the webform node.
|
danielebarchiesi@0
|
1737 if (!node_access('view', $node)) {
|
danielebarchiesi@0
|
1738 return;
|
danielebarchiesi@0
|
1739 }
|
danielebarchiesi@0
|
1740
|
danielebarchiesi@0
|
1741 // This is a webform node block.
|
danielebarchiesi@0
|
1742 $node->webform_block = TRUE;
|
danielebarchiesi@0
|
1743
|
danielebarchiesi@0
|
1744 // Use the node title for the block title.
|
danielebarchiesi@0
|
1745 $subject = $node->title;
|
danielebarchiesi@0
|
1746
|
danielebarchiesi@0
|
1747 // If not displaying pages in the block, set the #action property on the form.
|
danielebarchiesi@0
|
1748 if ($settings['pages_block']) {
|
danielebarchiesi@0
|
1749 $node->webform['action'] = FALSE;
|
danielebarchiesi@0
|
1750 }
|
danielebarchiesi@0
|
1751 else {
|
danielebarchiesi@0
|
1752 $query = array_diff_key($_GET, array('q' => ''));
|
danielebarchiesi@0
|
1753 $node->webform['action'] = url('node/' . $node->nid, array('query' => $query));
|
danielebarchiesi@0
|
1754 }
|
danielebarchiesi@0
|
1755
|
danielebarchiesi@0
|
1756 // Generate the content of the block based on display settings.
|
danielebarchiesi@0
|
1757 if ($settings['display'] == 'form') {
|
danielebarchiesi@0
|
1758 webform_node_view($node, 'full');
|
danielebarchiesi@0
|
1759 $content = $node->content['webform'];
|
danielebarchiesi@0
|
1760 }
|
danielebarchiesi@0
|
1761 else {
|
danielebarchiesi@0
|
1762 $teaser = ($settings['display'] == 'teaser') ? 'teaser' : 'full';
|
danielebarchiesi@0
|
1763 $content = node_view($node, $teaser);
|
danielebarchiesi@0
|
1764 }
|
danielebarchiesi@0
|
1765
|
danielebarchiesi@0
|
1766 // Add contextual links for the webform node if they aren't already there.
|
danielebarchiesi@0
|
1767 if (!isset($content['#contextual_links']['node'])) {
|
danielebarchiesi@0
|
1768 $content['#contextual_links']['node'] = array('node', array($node->nid));
|
danielebarchiesi@0
|
1769 }
|
danielebarchiesi@0
|
1770
|
danielebarchiesi@0
|
1771 // Create the block.
|
danielebarchiesi@0
|
1772 // Note that we render the content immediately here rather than passing back
|
danielebarchiesi@0
|
1773 // a renderable so that if the block is empty it is hidden.
|
danielebarchiesi@0
|
1774 $block = array(
|
danielebarchiesi@0
|
1775 'subject' => $subject,
|
danielebarchiesi@0
|
1776 'content' => drupal_render($content),
|
danielebarchiesi@0
|
1777 );
|
danielebarchiesi@0
|
1778 return $block;
|
danielebarchiesi@0
|
1779 }
|
danielebarchiesi@0
|
1780
|
danielebarchiesi@0
|
1781 /**
|
danielebarchiesi@0
|
1782 * Implements hook_block_configure().
|
danielebarchiesi@0
|
1783 */
|
danielebarchiesi@0
|
1784 function webform_block_configure($delta = '') {
|
danielebarchiesi@0
|
1785 // Load the block-specific configuration settings.
|
danielebarchiesi@0
|
1786 $webform_blocks = variable_get('webform_blocks', array());
|
danielebarchiesi@0
|
1787 $settings = isset($webform_blocks[$delta]) ? $webform_blocks[$delta] : array();
|
danielebarchiesi@0
|
1788 $settings += array(
|
danielebarchiesi@0
|
1789 'display' => 'form',
|
danielebarchiesi@0
|
1790 'pages_block' => 0,
|
danielebarchiesi@0
|
1791 );
|
danielebarchiesi@0
|
1792
|
danielebarchiesi@0
|
1793 $form = array();
|
danielebarchiesi@0
|
1794 $form['display'] = array(
|
danielebarchiesi@0
|
1795 '#type' => 'radios',
|
danielebarchiesi@0
|
1796 '#title' => t('Display mode'),
|
danielebarchiesi@0
|
1797 '#default_value' => $settings['display'],
|
danielebarchiesi@0
|
1798 '#options' => array(
|
danielebarchiesi@0
|
1799 'form' => t('Form only'),
|
danielebarchiesi@0
|
1800 'full' => t('Full node'),
|
danielebarchiesi@0
|
1801 'teaser' => t('Teaser'),
|
danielebarchiesi@0
|
1802 ),
|
danielebarchiesi@0
|
1803 '#description' => t('The display mode determines how much of the webform to show within the block.'),
|
danielebarchiesi@0
|
1804 );
|
danielebarchiesi@0
|
1805
|
danielebarchiesi@0
|
1806 $form['pages_block'] = array(
|
danielebarchiesi@0
|
1807 '#type' => 'checkbox',
|
danielebarchiesi@0
|
1808 '#title' => t('Show all webform pages in block'),
|
danielebarchiesi@0
|
1809 '#default_value' => $settings['pages_block'],
|
danielebarchiesi@0
|
1810 '#description' => t('By default multi-page webforms redirect to the node page for all pages after the first one. If checked, all pages will be shown in the block instead.'),
|
danielebarchiesi@0
|
1811 );
|
danielebarchiesi@0
|
1812
|
danielebarchiesi@0
|
1813 return $form;
|
danielebarchiesi@0
|
1814 }
|
danielebarchiesi@0
|
1815
|
danielebarchiesi@0
|
1816 /**
|
danielebarchiesi@0
|
1817 * Implements hook_block_save().
|
danielebarchiesi@0
|
1818 */
|
danielebarchiesi@0
|
1819 function webform_block_save($delta = '', $edit = array()) {
|
danielebarchiesi@0
|
1820 // Load the previously defined block-specific configuration settings.
|
danielebarchiesi@0
|
1821 $settings = variable_get('webform_blocks', array());
|
danielebarchiesi@0
|
1822 // Build the settings array.
|
danielebarchiesi@0
|
1823 $new_settings[$delta] = array(
|
danielebarchiesi@0
|
1824 'display' => $edit['display'],
|
danielebarchiesi@0
|
1825 'pages_block' => $edit['pages_block'],
|
danielebarchiesi@0
|
1826 );
|
danielebarchiesi@0
|
1827 // We store settings for multiple blocks in just one variable
|
danielebarchiesi@0
|
1828 // so we merge the existing settings with the new ones before save.
|
danielebarchiesi@0
|
1829 variable_set('webform_blocks', array_merge($settings, $new_settings));
|
danielebarchiesi@0
|
1830 }
|
danielebarchiesi@0
|
1831
|
danielebarchiesi@0
|
1832 /**
|
danielebarchiesi@0
|
1833 * Client form generation function. If this is displaying an existing
|
danielebarchiesi@0
|
1834 * submission, pass in the $submission variable with the contents of the
|
danielebarchiesi@0
|
1835 * submission to be displayed.
|
danielebarchiesi@0
|
1836 *
|
danielebarchiesi@0
|
1837 * @param $form
|
danielebarchiesi@0
|
1838 * The current form array (always empty).
|
danielebarchiesi@0
|
1839 * @param $form_state
|
danielebarchiesi@0
|
1840 * The current form values of a submission, used in multipage webforms.
|
danielebarchiesi@0
|
1841 * @param $node
|
danielebarchiesi@0
|
1842 * The current webform node.
|
danielebarchiesi@0
|
1843 * @param $submission
|
danielebarchiesi@0
|
1844 * An object containing information about the form submission if we're
|
danielebarchiesi@0
|
1845 * displaying a result.
|
danielebarchiesi@0
|
1846 * @param $is_draft
|
danielebarchiesi@0
|
1847 * Optional. Set to TRUE if displaying a draft.
|
danielebarchiesi@0
|
1848 * @param $filter
|
danielebarchiesi@0
|
1849 * Whether or not to filter the contents of descriptions and values when
|
danielebarchiesi@0
|
1850 * building the form. Values need to be unfiltered to be editable by
|
danielebarchiesi@0
|
1851 * Form Builder.
|
danielebarchiesi@0
|
1852 */
|
danielebarchiesi@0
|
1853 function webform_client_form($form, &$form_state, $node, $submission, $is_draft = FALSE, $filter = TRUE) {
|
danielebarchiesi@0
|
1854 global $user;
|
danielebarchiesi@0
|
1855
|
danielebarchiesi@0
|
1856 // Attach necessary JavaScript and CSS.
|
danielebarchiesi@0
|
1857 $form['#attached'] = array(
|
danielebarchiesi@0
|
1858 'css' => array(drupal_get_path('module', 'webform') . '/css/webform.css'),
|
danielebarchiesi@0
|
1859 'js' => array(drupal_get_path('module', 'webform') . '/js/webform.js'),
|
danielebarchiesi@0
|
1860 );
|
danielebarchiesi@0
|
1861 form_load_include($form_state, 'inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
1862 form_load_include($form_state, 'inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
1863
|
danielebarchiesi@0
|
1864 $form['#process'] = array(
|
danielebarchiesi@0
|
1865 'webform_client_form_includes',
|
danielebarchiesi@0
|
1866 );
|
danielebarchiesi@0
|
1867
|
danielebarchiesi@0
|
1868 // If in a multi-step form, a submission ID may be specified in form state.
|
danielebarchiesi@0
|
1869 // Load this submission. This allows anonymous users to use auto-save.
|
danielebarchiesi@0
|
1870 if (empty($submission) && !empty($form_state['values']['details']['sid'])) {
|
danielebarchiesi@0
|
1871 $submission = webform_get_submission($node->nid, $form_state['values']['details']['sid']);
|
danielebarchiesi@0
|
1872 $is_draft = $submission->is_draft;
|
danielebarchiesi@0
|
1873 }
|
danielebarchiesi@0
|
1874
|
danielebarchiesi@0
|
1875 // Bind arguments to $form to make them available in theming and form_alter.
|
danielebarchiesi@0
|
1876 $form['#node'] = $node;
|
danielebarchiesi@0
|
1877 $form['#submission'] = $submission;
|
danielebarchiesi@0
|
1878 $form['#is_draft'] = $is_draft;
|
danielebarchiesi@0
|
1879 $form['#filter'] = $filter;
|
danielebarchiesi@0
|
1880
|
danielebarchiesi@0
|
1881 // Add a theme function for this form.
|
danielebarchiesi@0
|
1882 $form['#theme'] = array('webform_form_' . $node->nid, 'webform_form');
|
danielebarchiesi@0
|
1883
|
danielebarchiesi@0
|
1884 // Add a css class for all client forms.
|
danielebarchiesi@0
|
1885 $form['#attributes'] = array('class' => array('webform-client-form'));
|
danielebarchiesi@0
|
1886
|
danielebarchiesi@0
|
1887 // Set the encoding type (necessary for file uploads).
|
danielebarchiesi@0
|
1888 $form['#attributes']['enctype'] = 'multipart/form-data';
|
danielebarchiesi@0
|
1889
|
danielebarchiesi@0
|
1890 // Sometimes when displaying a webform as a teaser or block, a custom action
|
danielebarchiesi@0
|
1891 // property is set to direct the user to the node page.
|
danielebarchiesi@0
|
1892 if (!empty($node->webform['action'])) {
|
danielebarchiesi@0
|
1893 $form['#action'] = $node->webform['action'];
|
danielebarchiesi@0
|
1894 }
|
danielebarchiesi@0
|
1895
|
danielebarchiesi@0
|
1896 $form['#submit'] = array('webform_client_form_pages', 'webform_client_form_submit');
|
danielebarchiesi@0
|
1897 $form['#validate'] = array('webform_client_form_validate');
|
danielebarchiesi@0
|
1898
|
danielebarchiesi@0
|
1899 if (is_array($node->webform['components']) && !empty($node->webform['components'])) {
|
danielebarchiesi@0
|
1900 // Prepare a new form array.
|
danielebarchiesi@0
|
1901 $form['submitted'] = array(
|
danielebarchiesi@0
|
1902 '#tree' => TRUE
|
danielebarchiesi@0
|
1903 );
|
danielebarchiesi@0
|
1904 $form['details'] = array(
|
danielebarchiesi@0
|
1905 '#tree' => TRUE,
|
danielebarchiesi@0
|
1906 );
|
danielebarchiesi@0
|
1907
|
danielebarchiesi@0
|
1908 // Put the components into a tree structure.
|
danielebarchiesi@0
|
1909 if (!isset($form_state['storage']['component_tree'])) {
|
danielebarchiesi@0
|
1910 $form_state['webform']['component_tree'] = array();
|
danielebarchiesi@0
|
1911 $form_state['webform']['page_count'] = 1;
|
danielebarchiesi@0
|
1912 $form_state['webform']['page_num'] = 1;
|
danielebarchiesi@0
|
1913 _webform_components_tree_build($node->webform['components'], $form_state['webform']['component_tree'], 0, $form_state['webform']['page_count']);
|
danielebarchiesi@0
|
1914 }
|
danielebarchiesi@0
|
1915 else {
|
danielebarchiesi@0
|
1916 $form_state['webform']['component_tree'] = $form_state['storage']['component_tree'];
|
danielebarchiesi@0
|
1917 $form_state['webform']['page_count'] = $form_state['storage']['page_count'];
|
danielebarchiesi@0
|
1918 $form_state['webform']['page_num'] = $form_state['storage']['page_num'];
|
danielebarchiesi@0
|
1919 }
|
danielebarchiesi@0
|
1920
|
danielebarchiesi@0
|
1921 // Shorten up our variable names.
|
danielebarchiesi@0
|
1922 $component_tree = $form_state['webform']['component_tree'];
|
danielebarchiesi@0
|
1923 $page_count = $form_state['webform']['page_count'];
|
danielebarchiesi@0
|
1924 $page_num = $form_state['webform']['page_num'];
|
danielebarchiesi@0
|
1925
|
danielebarchiesi@0
|
1926 if ($page_count > 1) {
|
danielebarchiesi@0
|
1927 $next_page_labels = array();
|
danielebarchiesi@0
|
1928 $prev_page_labels = array();
|
danielebarchiesi@0
|
1929 }
|
danielebarchiesi@0
|
1930
|
danielebarchiesi@0
|
1931 // Recursively add components to the form. The unfiltered version of the
|
danielebarchiesi@0
|
1932 // form (typically used in Form Builder), includes all components.
|
danielebarchiesi@0
|
1933 foreach ($component_tree['children'] as $cid => $component) {
|
danielebarchiesi@0
|
1934 $component_value = isset($form_state['values']['submitted'][$cid]) ? $form_state['values']['submitted'][$cid] : NULL;
|
danielebarchiesi@0
|
1935 if ($filter == FALSE || _webform_client_form_rule_check($node, $component, $page_num, $form_state)) {
|
danielebarchiesi@0
|
1936 if ($component['type'] == 'pagebreak') {
|
danielebarchiesi@0
|
1937 $next_page_labels[$component['page_num'] - 1] = !empty($component['extra']['next_page_label']) ? $component['extra']['next_page_label'] : t('Next Page >');
|
danielebarchiesi@0
|
1938 $prev_page_labels[$component['page_num']] = !empty($component['extra']['prev_page_label']) ? $component['extra']['prev_page_label'] : t('< Previous Page');
|
danielebarchiesi@0
|
1939 }
|
danielebarchiesi@0
|
1940 _webform_client_form_add_component($node, $component, $component_value, $form['submitted'], $form, $form_state, $submission, 'form', $page_num, $filter);
|
danielebarchiesi@0
|
1941 }
|
danielebarchiesi@0
|
1942 }
|
danielebarchiesi@0
|
1943
|
danielebarchiesi@0
|
1944 // These form details help managing data upon submission.
|
danielebarchiesi@0
|
1945 $form['details']['nid'] = array(
|
danielebarchiesi@0
|
1946 '#type' => 'value',
|
danielebarchiesi@0
|
1947 '#value' => $node->nid,
|
danielebarchiesi@0
|
1948 );
|
danielebarchiesi@0
|
1949 $form['details']['sid'] = array(
|
danielebarchiesi@0
|
1950 '#type' => 'hidden',
|
danielebarchiesi@0
|
1951 '#value' => isset($submission->sid) ? $submission->sid : '',
|
danielebarchiesi@0
|
1952 );
|
danielebarchiesi@0
|
1953 $form['details']['uid'] = array(
|
danielebarchiesi@0
|
1954 '#type' => 'value',
|
danielebarchiesi@0
|
1955 '#value' => isset($submission->uid) ? $submission->uid : $user->uid,
|
danielebarchiesi@0
|
1956 );
|
danielebarchiesi@0
|
1957 $form['details']['page_num'] = array(
|
danielebarchiesi@0
|
1958 '#type' => 'hidden',
|
danielebarchiesi@0
|
1959 '#value' => $page_num,
|
danielebarchiesi@0
|
1960 );
|
danielebarchiesi@0
|
1961 $form['details']['page_count'] = array(
|
danielebarchiesi@0
|
1962 '#type' => 'hidden',
|
danielebarchiesi@0
|
1963 '#value' => $page_count,
|
danielebarchiesi@0
|
1964 );
|
danielebarchiesi@0
|
1965 $form['details']['finished'] = array(
|
danielebarchiesi@0
|
1966 '#type' => 'hidden',
|
danielebarchiesi@0
|
1967 '#value' => isset($submission->is_draft) ? (!$submission->is_draft) : 0,
|
danielebarchiesi@0
|
1968 );
|
danielebarchiesi@0
|
1969
|
danielebarchiesi@0
|
1970 // Add buttons for pages, drafts, and submissions.
|
danielebarchiesi@0
|
1971 $form['actions'] = array(
|
danielebarchiesi@0
|
1972 '#type' => 'actions',
|
danielebarchiesi@0
|
1973 '#weight' => 1000,
|
danielebarchiesi@0
|
1974 );
|
danielebarchiesi@0
|
1975
|
danielebarchiesi@0
|
1976 // Add the draft button.
|
danielebarchiesi@0
|
1977 if ($node->webform['allow_draft'] && (empty($submission) || $submission->is_draft) && $user->uid != 0) {
|
danielebarchiesi@0
|
1978 $form['actions']['draft'] = array(
|
danielebarchiesi@0
|
1979 '#type' => 'submit',
|
danielebarchiesi@0
|
1980 '#value' => t('Save Draft'),
|
danielebarchiesi@0
|
1981 '#weight' => -2,
|
danielebarchiesi@0
|
1982 '#validate' => array(),
|
danielebarchiesi@0
|
1983 '#attributes' => array('formnovalidate' => 'formnovalidate'),
|
danielebarchiesi@0
|
1984 );
|
danielebarchiesi@0
|
1985 }
|
danielebarchiesi@0
|
1986
|
danielebarchiesi@0
|
1987 if ($page_count > 1) {
|
danielebarchiesi@0
|
1988 // Add the submit button(s).
|
danielebarchiesi@0
|
1989 if ($page_num > 1) {
|
danielebarchiesi@0
|
1990 $form['actions']['previous'] = array(
|
danielebarchiesi@0
|
1991 '#type' => 'submit',
|
danielebarchiesi@0
|
1992 '#value' => $prev_page_labels[$page_num],
|
danielebarchiesi@0
|
1993 '#weight' => 5,
|
danielebarchiesi@0
|
1994 '#validate' => array(),
|
danielebarchiesi@0
|
1995 '#attributes' => array('formnovalidate' => 'formnovalidate'),
|
danielebarchiesi@0
|
1996 );
|
danielebarchiesi@0
|
1997 }
|
danielebarchiesi@0
|
1998 if ($page_num == $page_count) {
|
danielebarchiesi@0
|
1999 $form['actions']['submit'] = array(
|
danielebarchiesi@0
|
2000 '#type' => 'submit',
|
danielebarchiesi@0
|
2001 '#value' => empty($node->webform['submit_text']) ? t('Submit') : t($node->webform['submit_text']),
|
danielebarchiesi@0
|
2002 '#weight' => 10,
|
danielebarchiesi@0
|
2003 );
|
danielebarchiesi@0
|
2004 }
|
danielebarchiesi@0
|
2005 elseif ($page_num < $page_count) {
|
danielebarchiesi@0
|
2006 $form['actions']['next'] = array(
|
danielebarchiesi@0
|
2007 '#type' => 'submit',
|
danielebarchiesi@0
|
2008 '#value' => $next_page_labels[$page_num],
|
danielebarchiesi@0
|
2009 '#weight' => 10,
|
danielebarchiesi@0
|
2010 );
|
danielebarchiesi@0
|
2011 }
|
danielebarchiesi@0
|
2012 }
|
danielebarchiesi@0
|
2013 else {
|
danielebarchiesi@0
|
2014 // Add the submit button.
|
danielebarchiesi@0
|
2015 $form['actions']['submit'] = array(
|
danielebarchiesi@0
|
2016 '#type' => 'submit',
|
danielebarchiesi@0
|
2017 '#value' => empty($node->webform['submit_text']) ? t('Submit') : t($node->webform['submit_text']),
|
danielebarchiesi@0
|
2018 '#weight' => 10,
|
danielebarchiesi@0
|
2019 );
|
danielebarchiesi@0
|
2020 }
|
danielebarchiesi@0
|
2021 }
|
danielebarchiesi@0
|
2022
|
danielebarchiesi@0
|
2023 return $form;
|
danielebarchiesi@0
|
2024 }
|
danielebarchiesi@0
|
2025
|
danielebarchiesi@0
|
2026 /**
|
danielebarchiesi@0
|
2027 * Process function for webform_client_form().
|
danielebarchiesi@0
|
2028 *
|
danielebarchiesi@0
|
2029 * Include all the enabled components for this form to ensure availability.
|
danielebarchiesi@0
|
2030 */
|
danielebarchiesi@0
|
2031 function webform_client_form_includes($form, $form_state) {
|
danielebarchiesi@0
|
2032 $components = webform_components();
|
danielebarchiesi@0
|
2033 foreach ($components as $component_type => $component) {
|
danielebarchiesi@0
|
2034 webform_component_include($component_type);
|
danielebarchiesi@0
|
2035 }
|
danielebarchiesi@0
|
2036 return $form;
|
danielebarchiesi@0
|
2037 }
|
danielebarchiesi@0
|
2038
|
danielebarchiesi@0
|
2039 /**
|
danielebarchiesi@0
|
2040 * Check if a component should be displayed on the current page.
|
danielebarchiesi@0
|
2041 */
|
danielebarchiesi@0
|
2042 function _webform_client_form_rule_check($node, $component, $page_num, $form_state = NULL, $submission = NULL) {
|
danielebarchiesi@0
|
2043 $conditional_values = isset($component['extra']['conditional_values']) ? $component['extra']['conditional_values'] : NULL;
|
danielebarchiesi@0
|
2044 $conditional_component = isset($component['extra']['conditional_component']) && isset($node->webform['components'][$component['extra']['conditional_component']]) ? $node->webform['components'][$component['extra']['conditional_component']] : NULL;
|
danielebarchiesi@0
|
2045 $conditional_cid = $conditional_component['cid'];
|
danielebarchiesi@0
|
2046
|
danielebarchiesi@0
|
2047 // Check the rules for this entire page. Note individual page breaks are
|
danielebarchiesi@0
|
2048 // checked down below in the individual component rule checks.
|
danielebarchiesi@0
|
2049 $show_page = TRUE;
|
danielebarchiesi@0
|
2050 if ($component['page_num'] > 1 && $component['type'] != 'pagebreak') {
|
danielebarchiesi@0
|
2051 foreach ($node->webform['components'] as $cid => $page_component) {
|
danielebarchiesi@0
|
2052 if ($page_component['type'] == 'pagebreak' && $page_component['page_num'] == $page_num) {
|
danielebarchiesi@0
|
2053 $show_page = _webform_client_form_rule_check($node, $page_component, $page_num, $form_state, $submission);
|
danielebarchiesi@0
|
2054 break;
|
danielebarchiesi@0
|
2055 }
|
danielebarchiesi@0
|
2056 }
|
danielebarchiesi@0
|
2057 }
|
danielebarchiesi@0
|
2058
|
danielebarchiesi@0
|
2059 // Check any parents' visibility rules.
|
danielebarchiesi@0
|
2060 $show_parent = $show_page;
|
danielebarchiesi@0
|
2061 if ($show_parent && $component['pid'] && isset($node->webform['components'][$component['pid']])) {
|
danielebarchiesi@0
|
2062 $parent_component = $node->webform['components'][$component['pid']];
|
danielebarchiesi@0
|
2063 $show_parent = _webform_client_form_rule_check($node, $parent_component, $page_num, $form_state, $submission);
|
danielebarchiesi@0
|
2064 }
|
danielebarchiesi@0
|
2065
|
danielebarchiesi@0
|
2066 // Check the individual component rules.
|
danielebarchiesi@0
|
2067 $show_component = $show_parent;
|
danielebarchiesi@0
|
2068 if ($show_component && ($page_num == 0 || $component['page_num'] == $page_num) && $conditional_component && strlen(trim($conditional_values))) {
|
danielebarchiesi@0
|
2069 $input_values = array();
|
danielebarchiesi@0
|
2070 if (isset($form_state)) {
|
danielebarchiesi@0
|
2071 $input_value = isset($form_state['values']['submitted'][$conditional_cid]) ? $form_state['values']['submitted'][$conditional_cid] : NULL;
|
danielebarchiesi@0
|
2072 $input_values = is_array($input_value) ? $input_value : array($input_value);
|
danielebarchiesi@0
|
2073 }
|
danielebarchiesi@0
|
2074 elseif (isset($submission)) {
|
danielebarchiesi@0
|
2075 $input_values = isset($submission->data[$conditional_cid]['value']) ? $submission->data[$conditional_cid]['value'] : array();
|
danielebarchiesi@0
|
2076 }
|
danielebarchiesi@0
|
2077
|
danielebarchiesi@0
|
2078 $test_values = array_map('trim', explode("\n", $conditional_values));
|
danielebarchiesi@0
|
2079 if (empty($input_values) && !empty($test_values)) {
|
danielebarchiesi@0
|
2080 $show_component = FALSE;
|
danielebarchiesi@0
|
2081 }
|
danielebarchiesi@0
|
2082 else {
|
danielebarchiesi@0
|
2083 foreach ($input_values as $input_value) {
|
danielebarchiesi@0
|
2084 if ($show_component = in_array($input_value, $test_values)) {
|
danielebarchiesi@0
|
2085 break;
|
danielebarchiesi@0
|
2086 }
|
danielebarchiesi@0
|
2087 }
|
danielebarchiesi@0
|
2088 }
|
danielebarchiesi@0
|
2089
|
danielebarchiesi@0
|
2090 if ($component['extra']['conditional_operator'] == '!=') {
|
danielebarchiesi@0
|
2091 $show_component = !$show_component;
|
danielebarchiesi@0
|
2092 }
|
danielebarchiesi@0
|
2093 }
|
danielebarchiesi@0
|
2094
|
danielebarchiesi@0
|
2095 // Private component?
|
danielebarchiesi@0
|
2096 if ($component['extra']['private']) {
|
danielebarchiesi@0
|
2097 $show_component = webform_results_access($node);
|
danielebarchiesi@0
|
2098 }
|
danielebarchiesi@0
|
2099
|
danielebarchiesi@0
|
2100 return $show_component;
|
danielebarchiesi@0
|
2101 }
|
danielebarchiesi@0
|
2102
|
danielebarchiesi@0
|
2103 /**
|
danielebarchiesi@0
|
2104 * Add a component to a renderable array. Called recursively for fieldsets.
|
danielebarchiesi@0
|
2105 *
|
danielebarchiesi@0
|
2106 * This function assists in the building of the client form, as well as the
|
danielebarchiesi@0
|
2107 * display of results, and the text of e-mails.
|
danielebarchiesi@0
|
2108 *
|
danielebarchiesi@0
|
2109 * @param $component
|
danielebarchiesi@0
|
2110 * The component to be added to the form.
|
danielebarchiesi@0
|
2111 * @param $component_value
|
danielebarchiesi@0
|
2112 * The components current value if known.
|
danielebarchiesi@0
|
2113 * @param $parent_fieldset
|
danielebarchiesi@0
|
2114 * The fieldset to which this element will be added.
|
danielebarchiesi@0
|
2115 * @param $form
|
danielebarchiesi@0
|
2116 * The entire form array.
|
danielebarchiesi@0
|
2117 * @param $form_state
|
danielebarchiesi@0
|
2118 * The form state.
|
danielebarchiesi@0
|
2119 * @param $submission
|
danielebarchiesi@0
|
2120 * The Webform submission as retrieved from the database.
|
danielebarchiesi@0
|
2121 * @param $format
|
danielebarchiesi@0
|
2122 * The format the form should be displayed as. May be one of the following:
|
danielebarchiesi@0
|
2123 * - form: Show as an editable form.
|
danielebarchiesi@0
|
2124 * - html: Show as HTML results.
|
danielebarchiesi@0
|
2125 * - text: Show as plain text.
|
danielebarchiesi@0
|
2126 * @param $filter
|
danielebarchiesi@0
|
2127 * Whether the form element properties should be filtered. Only set to FALSE
|
danielebarchiesi@0
|
2128 * if needing the raw properties for editing.
|
danielebarchiesi@0
|
2129 *
|
danielebarchiesi@0
|
2130 * @see webform_client_form()
|
danielebarchiesi@0
|
2131 * @see webform_submission_render()
|
danielebarchiesi@0
|
2132 */
|
danielebarchiesi@0
|
2133 function _webform_client_form_add_component($node, $component, $component_value, &$parent_fieldset, &$form, $form_state, $submission, $format = 'form', $page_num = 0, $filter = TRUE) {
|
danielebarchiesi@0
|
2134 $cid = $component['cid'];
|
danielebarchiesi@0
|
2135
|
danielebarchiesi@0
|
2136 // Load with submission information if necessary.
|
danielebarchiesi@0
|
2137 if ($format != 'form') {
|
danielebarchiesi@0
|
2138 // This component is display only.
|
danielebarchiesi@0
|
2139 $data = empty($submission->data[$cid]['value']) ? NULL : $submission->data[$cid]['value'];
|
danielebarchiesi@0
|
2140 if ($display_element = webform_component_invoke($component['type'], 'display', $component, $data, $format)) {
|
danielebarchiesi@0
|
2141 // Ensure the component is added as a property.
|
danielebarchiesi@0
|
2142 $display_element['#webform_component'] = $component;
|
danielebarchiesi@0
|
2143
|
danielebarchiesi@0
|
2144 // Allow modules to modify a "display only" webform component.
|
danielebarchiesi@0
|
2145 drupal_alter('webform_component_display', $display_element, $component);
|
danielebarchiesi@0
|
2146
|
danielebarchiesi@0
|
2147 // The form_builder() function usually adds #parents and #id for us, but
|
danielebarchiesi@0
|
2148 // because these are not marked for #input, we need to add them manually.
|
danielebarchiesi@0
|
2149 if (!isset($display_element['#parents'])) {
|
danielebarchiesi@0
|
2150 $parents = isset($parent_fieldset['#parents']) ? $parent_fieldset['#parents'] : array('submitted');
|
danielebarchiesi@0
|
2151 $parents[] = $component['form_key'];
|
danielebarchiesi@0
|
2152 $display_element['#parents'] = $parents;
|
danielebarchiesi@0
|
2153 }
|
danielebarchiesi@0
|
2154 if (!isset($display_element['#id'])) {
|
danielebarchiesi@0
|
2155 $display_element['#id'] = drupal_clean_css_identifier('edit-' . implode('-', $display_element['#parents']));
|
danielebarchiesi@0
|
2156 }
|
danielebarchiesi@0
|
2157
|
danielebarchiesi@0
|
2158 // Add the element into the proper parent in the display.
|
danielebarchiesi@0
|
2159 $parent_fieldset[$component['form_key']] = $display_element;
|
danielebarchiesi@0
|
2160 }
|
danielebarchiesi@0
|
2161 }
|
danielebarchiesi@0
|
2162 // Show the component only on its form page, or if building an unfiltered
|
danielebarchiesi@0
|
2163 // version of the form (such as for Form Builder).
|
danielebarchiesi@0
|
2164 elseif ($component['page_num'] == $page_num || $filter == FALSE) {
|
danielebarchiesi@0
|
2165 // Add this user-defined field to the form (with all the values that are always available).
|
danielebarchiesi@0
|
2166 $data = isset($submission->data[$cid]['value']) ? $submission->data[$cid]['value'] : NULL;
|
danielebarchiesi@0
|
2167 if ($element = webform_component_invoke($component['type'], 'render', $component, $data, $filter)) {
|
danielebarchiesi@0
|
2168 // Ensure the component is added as a property.
|
danielebarchiesi@0
|
2169 $element['#webform_component'] = $component;
|
danielebarchiesi@0
|
2170
|
danielebarchiesi@0
|
2171 // The 'private' option is in most components, but it's not a real
|
danielebarchiesi@0
|
2172 // property. Add it for Form Builder compatibility.
|
danielebarchiesi@0
|
2173 if (webform_component_feature($component['type'], 'private')) {
|
danielebarchiesi@0
|
2174 $element['#webform_private'] = $component['extra']['private'];
|
danielebarchiesi@0
|
2175 }
|
danielebarchiesi@0
|
2176
|
danielebarchiesi@0
|
2177 // Allow modules to modify a webform component that is going to be render in a form.
|
danielebarchiesi@0
|
2178 drupal_alter('webform_component_render', $element, $component);
|
danielebarchiesi@0
|
2179
|
danielebarchiesi@0
|
2180 // Add the element into the proper parent in the form.
|
danielebarchiesi@0
|
2181 $parent_fieldset[$component['form_key']] = $element;
|
danielebarchiesi@0
|
2182
|
danielebarchiesi@0
|
2183 // Override the value if one already exists in the form state.
|
danielebarchiesi@0
|
2184 if (isset($component_value)) {
|
danielebarchiesi@0
|
2185 $parent_fieldset[$component['form_key']]['#default_value'] = $component_value;
|
danielebarchiesi@0
|
2186 if (is_array($component_value)) {
|
danielebarchiesi@0
|
2187 foreach ($component_value as $key => $value) {
|
danielebarchiesi@0
|
2188 if (isset($parent_fieldset[$component['form_key']][$key])) {
|
danielebarchiesi@0
|
2189 $parent_fieldset[$component['form_key']][$key]['#default_value'] = $value;
|
danielebarchiesi@0
|
2190 }
|
danielebarchiesi@0
|
2191 }
|
danielebarchiesi@0
|
2192 }
|
danielebarchiesi@0
|
2193 }
|
danielebarchiesi@0
|
2194 }
|
danielebarchiesi@0
|
2195 else {
|
danielebarchiesi@0
|
2196 drupal_set_message(t('The webform component @type is not able to be displayed', array('@type' => $component['type'])));
|
danielebarchiesi@0
|
2197 }
|
danielebarchiesi@0
|
2198 }
|
danielebarchiesi@0
|
2199
|
danielebarchiesi@0
|
2200 // Disable validation initially on all elements. We manually validate
|
danielebarchiesi@0
|
2201 // all webform elements in webform_client_form_validate().
|
danielebarchiesi@0
|
2202 if (isset($parent_fieldset[$component['form_key']])) {
|
danielebarchiesi@0
|
2203 $parent_fieldset[$component['form_key']]['#validated'] = TRUE;
|
danielebarchiesi@0
|
2204 $parent_fieldset[$component['form_key']]['#webform_validated'] = FALSE;
|
danielebarchiesi@0
|
2205 }
|
danielebarchiesi@0
|
2206
|
danielebarchiesi@0
|
2207 if (isset($component['children']) && is_array($component['children'])) {
|
danielebarchiesi@0
|
2208 foreach ($component['children'] as $scid => $subcomponent) {
|
danielebarchiesi@0
|
2209 $subcomponent_value = isset($form_state['values']['submitted'][$scid]) ? $form_state['values']['submitted'][$scid] : NULL;
|
danielebarchiesi@0
|
2210 if (_webform_client_form_rule_check($node, $subcomponent, $page_num, $form_state, $submission)) {
|
danielebarchiesi@0
|
2211 _webform_client_form_add_component($node, $subcomponent, $subcomponent_value, $parent_fieldset[$component['form_key']], $form, $form_state, $submission, $format, $page_num, $filter);
|
danielebarchiesi@0
|
2212 }
|
danielebarchiesi@0
|
2213 }
|
danielebarchiesi@0
|
2214 }
|
danielebarchiesi@0
|
2215 }
|
danielebarchiesi@0
|
2216
|
danielebarchiesi@0
|
2217 function webform_client_form_validate($form, &$form_state) {
|
danielebarchiesi@0
|
2218 $node = node_load($form_state['values']['details']['nid']);
|
danielebarchiesi@0
|
2219 $finished = $form_state['values']['details']['finished'];
|
danielebarchiesi@0
|
2220
|
danielebarchiesi@0
|
2221 // Check that the submissions have not exceeded the total submission limit.
|
danielebarchiesi@0
|
2222 if ($node->webform['total_submit_limit'] != -1) {
|
danielebarchiesi@0
|
2223 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
2224 // Check if the total number of entries was reached before the user submitted
|
danielebarchiesi@0
|
2225 // the form.
|
danielebarchiesi@0
|
2226 if (!$finished && $total_limit_exceeded = _webform_submission_total_limit_check($node)) {
|
danielebarchiesi@0
|
2227 // Show the user the limit has exceeded.
|
danielebarchiesi@0
|
2228 theme('webform_view_messages', array('node' => $node, 'teaser' => 0, 'page' => 1, 'submission_count' => 0, 'total_limit_exceeded' => $total_limit_exceeded, 'allowed_roles' => array_keys(user_roles()), 'closed' => FALSE, 'cached' => FALSE));
|
danielebarchiesi@0
|
2229 form_set_error('', NULL);
|
danielebarchiesi@0
|
2230 return;
|
danielebarchiesi@0
|
2231 }
|
danielebarchiesi@0
|
2232 }
|
danielebarchiesi@0
|
2233
|
danielebarchiesi@0
|
2234 // Check that the user has not exceeded the submission limit.
|
danielebarchiesi@0
|
2235 // This usually will only apply to anonymous users when the page cache is
|
danielebarchiesi@0
|
2236 // enabled, because they may submit the form even if they do not have access.
|
danielebarchiesi@0
|
2237 if ($node->webform['submit_limit'] != -1) { // -1: Submissions are never throttled.
|
danielebarchiesi@0
|
2238 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
2239
|
danielebarchiesi@0
|
2240 if (!$finished && $user_limit_exceeded = _webform_submission_user_limit_check($node)) {
|
danielebarchiesi@0
|
2241 // Assume that webform_view_messages will print out the necessary message,
|
danielebarchiesi@0
|
2242 // then stop the processing of the form with an empty form error.
|
danielebarchiesi@0
|
2243 theme('webform_view_messages', array('node' => $node, 'teaser' => 0, 'page' => 1, 'submission_count' => 0, 'user_limit_exceeded' => $user_limit_exceeded, 'allowed_roles' => array_keys(user_roles()), 'closed' => FALSE, 'cached' => FALSE));
|
danielebarchiesi@0
|
2244 form_set_error('', NULL);
|
danielebarchiesi@0
|
2245 return;
|
danielebarchiesi@0
|
2246 }
|
danielebarchiesi@0
|
2247 }
|
danielebarchiesi@0
|
2248
|
danielebarchiesi@0
|
2249 // Run all #element_validate and #required checks. These are skipped initially
|
danielebarchiesi@0
|
2250 // by setting #validated = TRUE on all components when they are added.
|
danielebarchiesi@0
|
2251 _webform_client_form_validate($form, $form_state);
|
danielebarchiesi@0
|
2252 }
|
danielebarchiesi@0
|
2253
|
danielebarchiesi@0
|
2254 /**
|
danielebarchiesi@0
|
2255 * Recursive validation function to trigger normal Drupal validation.
|
danielebarchiesi@0
|
2256 *
|
danielebarchiesi@0
|
2257 * This function imitates _form_validate in Drupal's form.inc, only it sets
|
danielebarchiesi@0
|
2258 * a different property to ensure that validation has occurred.
|
danielebarchiesi@0
|
2259 */
|
danielebarchiesi@0
|
2260 function _webform_client_form_validate($elements, &$form_state, $first_run = TRUE) {
|
danielebarchiesi@0
|
2261 static $form;
|
danielebarchiesi@0
|
2262 if ($first_run) {
|
danielebarchiesi@0
|
2263 $form = $elements;
|
danielebarchiesi@0
|
2264 }
|
danielebarchiesi@0
|
2265
|
danielebarchiesi@0
|
2266 // Recurse through all children.
|
danielebarchiesi@0
|
2267 foreach (element_children($elements) as $key) {
|
danielebarchiesi@0
|
2268 if (isset($elements[$key]) && $elements[$key]) {
|
danielebarchiesi@0
|
2269 _webform_client_form_validate($elements[$key], $form_state, FALSE);
|
danielebarchiesi@0
|
2270 }
|
danielebarchiesi@0
|
2271 }
|
danielebarchiesi@0
|
2272 // Validate the current input.
|
danielebarchiesi@0
|
2273 if (isset($elements['#webform_validated']) && $elements['#webform_validated'] == FALSE) {
|
danielebarchiesi@0
|
2274 if (isset($elements['#needs_validation'])) {
|
danielebarchiesi@0
|
2275 // Make sure a value is passed when the field is required.
|
danielebarchiesi@0
|
2276 // A simple call to empty() will not cut it here as some fields, like
|
danielebarchiesi@0
|
2277 // checkboxes, can return a valid value of '0'. Instead, check the
|
danielebarchiesi@0
|
2278 // length if it's a string, and the item count if it's an array. For
|
danielebarchiesi@0
|
2279 // radios, FALSE means that no value was submitted, so check that too.
|
danielebarchiesi@0
|
2280 if ($elements['#required'] && (!count($elements['#value']) || (is_string($elements['#value']) && strlen(trim($elements['#value'])) == 0) || $elements['#value'] === FALSE)) {
|
danielebarchiesi@0
|
2281 form_error($elements, t('!name field is required.', array('!name' => $elements['#title'])));
|
danielebarchiesi@0
|
2282 }
|
danielebarchiesi@0
|
2283
|
danielebarchiesi@0
|
2284 // Verify that the value is not longer than #maxlength.
|
danielebarchiesi@0
|
2285 if (isset($elements['#maxlength']) && drupal_strlen($elements['#value']) > $elements['#maxlength']) {
|
danielebarchiesi@0
|
2286 form_error($elements, t('!name cannot be longer than %max characters but is currently %length characters long.', array('!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'], '%max' => $elements['#maxlength'], '%length' => drupal_strlen($elements['#value']))));
|
danielebarchiesi@0
|
2287 }
|
danielebarchiesi@0
|
2288
|
danielebarchiesi@0
|
2289 if (isset($elements['#options']) && isset($elements['#value'])) {
|
danielebarchiesi@0
|
2290 if ($elements['#type'] == 'select') {
|
danielebarchiesi@0
|
2291 $options = form_options_flatten($elements['#options']);
|
danielebarchiesi@0
|
2292 }
|
danielebarchiesi@0
|
2293 else {
|
danielebarchiesi@0
|
2294 $options = $elements['#options'];
|
danielebarchiesi@0
|
2295 }
|
danielebarchiesi@0
|
2296 if (is_array($elements['#value'])) {
|
danielebarchiesi@0
|
2297 $value = $elements['#type'] == 'checkboxes' ? array_keys(array_filter($elements['#value'])) : $elements['#value'];
|
danielebarchiesi@0
|
2298 foreach ($value as $v) {
|
danielebarchiesi@0
|
2299 if (!isset($options[$v])) {
|
danielebarchiesi@0
|
2300 form_error($elements, t('An illegal choice has been detected. Please contact the site administrator.'));
|
danielebarchiesi@0
|
2301 watchdog('form', 'Illegal choice %choice in !name element.', array('%choice' => $v, '!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
|
danielebarchiesi@0
|
2302 }
|
danielebarchiesi@0
|
2303 }
|
danielebarchiesi@0
|
2304 }
|
danielebarchiesi@0
|
2305 elseif ($elements['#value'] !== '' && !isset($options[$elements['#value']])) {
|
danielebarchiesi@0
|
2306 form_error($elements, t('An illegal choice has been detected. Please contact the site administrator.'));
|
danielebarchiesi@0
|
2307 watchdog('form', 'Illegal choice %choice in %name element.', array('%choice' => $elements['#value'], '%name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title']), WATCHDOG_ERROR);
|
danielebarchiesi@0
|
2308 }
|
danielebarchiesi@0
|
2309 }
|
danielebarchiesi@0
|
2310 }
|
danielebarchiesi@0
|
2311
|
danielebarchiesi@0
|
2312 // Call any element-specific validators. These must act on the element
|
danielebarchiesi@0
|
2313 // #value data.
|
danielebarchiesi@0
|
2314 if (isset($elements['#element_validate'])) {
|
danielebarchiesi@0
|
2315 foreach ($elements['#element_validate'] as $function) {
|
danielebarchiesi@0
|
2316 if (function_exists($function)) {
|
danielebarchiesi@0
|
2317 $function($elements, $form_state, $form);
|
danielebarchiesi@0
|
2318 }
|
danielebarchiesi@0
|
2319 }
|
danielebarchiesi@0
|
2320 }
|
danielebarchiesi@0
|
2321 $elements['#webform_validated'] = TRUE;
|
danielebarchiesi@0
|
2322 }
|
danielebarchiesi@0
|
2323 }
|
danielebarchiesi@0
|
2324
|
danielebarchiesi@0
|
2325 /**
|
danielebarchiesi@0
|
2326 * Handle the processing of pages and conditional logic.
|
danielebarchiesi@0
|
2327 */
|
danielebarchiesi@0
|
2328 function webform_client_form_pages($form, &$form_state) {
|
danielebarchiesi@0
|
2329 $node = node_load($form_state['values']['details']['nid']);
|
danielebarchiesi@0
|
2330
|
danielebarchiesi@0
|
2331 // Multistep forms may not have any components on the first page.
|
danielebarchiesi@0
|
2332 if (!isset($form_state['values']['submitted'])) {
|
danielebarchiesi@0
|
2333 $form_state['values']['submitted'] = array();
|
danielebarchiesi@0
|
2334 }
|
danielebarchiesi@0
|
2335
|
danielebarchiesi@0
|
2336 // Move special settings to storage.
|
danielebarchiesi@0
|
2337 if (isset($form_state['webform']['component_tree'])) {
|
danielebarchiesi@0
|
2338 $form_state['storage']['component_tree'] = $form_state['webform']['component_tree'];
|
danielebarchiesi@0
|
2339 $form_state['storage']['page_count'] = $form_state['webform']['page_count'];
|
danielebarchiesi@0
|
2340 $form_state['storage']['page_num'] = $form_state['webform']['page_num'];
|
danielebarchiesi@0
|
2341 }
|
danielebarchiesi@0
|
2342
|
danielebarchiesi@0
|
2343 // Perform post processing by components.
|
danielebarchiesi@0
|
2344 _webform_client_form_submit_process($node, $form_state['values']['submitted']);
|
danielebarchiesi@0
|
2345
|
danielebarchiesi@0
|
2346 // Flatten trees within the submission.
|
danielebarchiesi@0
|
2347 $form_state['values']['submitted_tree'] = $form_state['values']['submitted'];
|
danielebarchiesi@0
|
2348 $form_state['values']['submitted'] = _webform_client_form_submit_flatten($node, $form_state['values']['submitted']);
|
danielebarchiesi@0
|
2349
|
danielebarchiesi@0
|
2350 // Assume the form is completed unless the page logic says otherwise.
|
danielebarchiesi@0
|
2351 $form_state['webform_completed'] = TRUE;
|
danielebarchiesi@0
|
2352
|
danielebarchiesi@0
|
2353 // Check for a multi-page form that is not yet complete.
|
danielebarchiesi@0
|
2354 $submit_op = !empty($form['actions']['submit']['#value']) ? $form['actions']['submit']['#value'] : t('Submit');
|
danielebarchiesi@0
|
2355 $draft_op = !empty($form['actions']['draft']['#value']) ? $form['actions']['draft']['#value'] : t('Save Draft');
|
danielebarchiesi@0
|
2356 if (!in_array($form_state['values']['op'], array($submit_op, $draft_op))) {
|
danielebarchiesi@0
|
2357 // Store values from the current page in the form state storage.
|
danielebarchiesi@0
|
2358 if (is_array($form_state['values']['submitted'])) {
|
danielebarchiesi@0
|
2359 foreach ($form_state['values']['submitted'] as $key => $val) {
|
danielebarchiesi@0
|
2360 $form_state['storage']['submitted'][$key] = $val;
|
danielebarchiesi@0
|
2361 }
|
danielebarchiesi@0
|
2362 }
|
danielebarchiesi@0
|
2363
|
danielebarchiesi@0
|
2364 // Update form state values with those from storage.
|
danielebarchiesi@0
|
2365 if (isset($form_state['storage']['submitted'])) {
|
danielebarchiesi@0
|
2366 foreach ($form_state['storage']['submitted'] as $key => $val) {
|
danielebarchiesi@0
|
2367 $form_state['values']['submitted'][$key] = $val;
|
danielebarchiesi@0
|
2368 }
|
danielebarchiesi@0
|
2369 }
|
danielebarchiesi@0
|
2370
|
danielebarchiesi@0
|
2371 // Set the page number.
|
danielebarchiesi@0
|
2372 if (!isset($form_state['storage']['page_num'])) {
|
danielebarchiesi@0
|
2373 $form_state['storage']['page_num'] = 1;
|
danielebarchiesi@0
|
2374 }
|
danielebarchiesi@0
|
2375 if (end($form_state['clicked_button']['#parents']) == 'next') {
|
danielebarchiesi@0
|
2376 $direction = 1;
|
danielebarchiesi@0
|
2377 }
|
danielebarchiesi@0
|
2378 else {
|
danielebarchiesi@0
|
2379 $direction = 0;
|
danielebarchiesi@0
|
2380 }
|
danielebarchiesi@0
|
2381
|
danielebarchiesi@0
|
2382 // If the next page has no components that need to be displayed, skip it.
|
danielebarchiesi@0
|
2383 if (isset($direction)) {
|
danielebarchiesi@0
|
2384 $components = $direction ? $node->webform['components'] : array_reverse($node->webform['components'], TRUE);
|
danielebarchiesi@0
|
2385 $last_component = end($node->webform['components']);
|
danielebarchiesi@0
|
2386 foreach ($components as $component) {
|
danielebarchiesi@0
|
2387 if ($component['type'] == 'pagebreak' && (
|
danielebarchiesi@0
|
2388 $direction == 1 && $component['page_num'] > $form_state['storage']['page_num'] ||
|
danielebarchiesi@0
|
2389 $direction == 0 && $component['page_num'] <= $form_state['storage']['page_num'])) {
|
danielebarchiesi@0
|
2390 $previous_pagebreak = $component;
|
danielebarchiesi@0
|
2391 continue;
|
danielebarchiesi@0
|
2392 }
|
danielebarchiesi@0
|
2393 if (isset($previous_pagebreak)) {
|
danielebarchiesi@0
|
2394 $page_num = $previous_pagebreak['page_num'] + $direction - 1;
|
danielebarchiesi@0
|
2395 // If we've found an component on this page, advance to that page.
|
danielebarchiesi@0
|
2396 if ($component['page_num'] == $page_num && _webform_client_form_rule_check($node, $component, $page_num, $form_state)) {
|
danielebarchiesi@0
|
2397 $form_state['storage']['page_num'] = $page_num;
|
danielebarchiesi@0
|
2398 break;
|
danielebarchiesi@0
|
2399 }
|
danielebarchiesi@0
|
2400 // If we've gotten to the end of the form without finding any more
|
danielebarchiesi@0
|
2401 // components, set the page number more than the max, ending the form.
|
danielebarchiesi@0
|
2402 elseif ($direction && $component['cid'] == $last_component['cid']) {
|
danielebarchiesi@0
|
2403 $form_state['storage']['page_num'] = $page_num + 1;
|
danielebarchiesi@0
|
2404 }
|
danielebarchiesi@0
|
2405 }
|
danielebarchiesi@0
|
2406 }
|
danielebarchiesi@0
|
2407 }
|
danielebarchiesi@0
|
2408
|
danielebarchiesi@0
|
2409 // The form is done if the page number is greater than the page count.
|
danielebarchiesi@0
|
2410 $form_state['webform_completed'] = $form_state['storage']['page_num'] > $form_state['storage']['page_count'];
|
danielebarchiesi@0
|
2411 }
|
danielebarchiesi@0
|
2412
|
danielebarchiesi@0
|
2413 // Merge any stored submission data for multistep forms.
|
danielebarchiesi@0
|
2414 if (isset($form_state['storage']['submitted'])) {
|
danielebarchiesi@0
|
2415 $original_values = is_array($form_state['values']['submitted']) ? $form_state['values']['submitted'] : array();
|
danielebarchiesi@0
|
2416 unset($form_state['values']['submitted']);
|
danielebarchiesi@0
|
2417
|
danielebarchiesi@0
|
2418 foreach ($form_state['storage']['submitted'] as $key => $val) {
|
danielebarchiesi@0
|
2419 $form_state['values']['submitted'][$key] = $val;
|
danielebarchiesi@0
|
2420 }
|
danielebarchiesi@0
|
2421 foreach ($original_values as $key => $val) {
|
danielebarchiesi@0
|
2422 $form_state['values']['submitted'][$key] = $val;
|
danielebarchiesi@0
|
2423 }
|
danielebarchiesi@0
|
2424
|
danielebarchiesi@0
|
2425 // Remove the variable so it doesn't show up in the additional processing.
|
danielebarchiesi@0
|
2426 unset($original_values);
|
danielebarchiesi@0
|
2427 }
|
danielebarchiesi@0
|
2428
|
danielebarchiesi@0
|
2429 // Inform the submit handlers that a draft will be saved.
|
danielebarchiesi@0
|
2430 $form_state['save_draft'] = $form_state['values']['op'] == $draft_op || ($node->webform['auto_save'] && !$form_state['webform_completed']);
|
danielebarchiesi@0
|
2431
|
danielebarchiesi@0
|
2432 // Determine what we need to do on the next page.
|
danielebarchiesi@0
|
2433 if (!empty($form_state['save_draft']) || !$form_state['webform_completed']) {
|
danielebarchiesi@0
|
2434 // Rebuild the form and display the current (on drafts) or next page.
|
danielebarchiesi@0
|
2435 $form_state['rebuild'] = TRUE;
|
danielebarchiesi@0
|
2436 }
|
danielebarchiesi@0
|
2437 else {
|
danielebarchiesi@0
|
2438 // Remove the form state storage now that we're done with the pages.
|
danielebarchiesi@0
|
2439 $form_state['rebuild'] = FALSE;
|
danielebarchiesi@0
|
2440 unset($form_state['storage']);
|
danielebarchiesi@0
|
2441 }
|
danielebarchiesi@0
|
2442 }
|
danielebarchiesi@0
|
2443
|
danielebarchiesi@0
|
2444 /**
|
danielebarchiesi@0
|
2445 * Submit handler for saving the form values and sending e-mails.
|
danielebarchiesi@0
|
2446 */
|
danielebarchiesi@0
|
2447 function webform_client_form_submit($form, &$form_state) {
|
danielebarchiesi@0
|
2448 module_load_include('inc', 'webform', 'includes/webform.submissions');
|
danielebarchiesi@0
|
2449 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
2450 global $user;
|
danielebarchiesi@0
|
2451
|
danielebarchiesi@0
|
2452 if (empty($form_state['save_draft']) && empty($form_state['webform_completed'])) {
|
danielebarchiesi@0
|
2453 return;
|
danielebarchiesi@0
|
2454 }
|
danielebarchiesi@0
|
2455
|
danielebarchiesi@0
|
2456 $node = $form['#node'];
|
danielebarchiesi@0
|
2457 $sid = $form_state['values']['details']['sid'] ? (int) $form_state['values']['details']['sid'] : NULL;
|
danielebarchiesi@0
|
2458
|
danielebarchiesi@0
|
2459 // Check if user is submitting as a draft.
|
danielebarchiesi@0
|
2460 $is_draft = (int) !empty($form_state['save_draft']);
|
danielebarchiesi@0
|
2461
|
danielebarchiesi@0
|
2462 if (!$sid) {
|
danielebarchiesi@0
|
2463 // Create a new submission object.
|
danielebarchiesi@0
|
2464 $submission = (object) array(
|
danielebarchiesi@0
|
2465 'nid' => $node->nid,
|
danielebarchiesi@0
|
2466 'uid' => $form_state['values']['details']['uid'],
|
danielebarchiesi@0
|
2467 'submitted' => REQUEST_TIME,
|
danielebarchiesi@0
|
2468 'remote_addr' => ip_address(),
|
danielebarchiesi@0
|
2469 'is_draft' => $is_draft,
|
danielebarchiesi@0
|
2470 'data' => webform_submission_data($node, $form_state['values']['submitted']),
|
danielebarchiesi@0
|
2471 );
|
danielebarchiesi@0
|
2472 }
|
danielebarchiesi@0
|
2473 else {
|
danielebarchiesi@0
|
2474 // To maintain time and user information, load the existing submission.
|
danielebarchiesi@0
|
2475 $submission = webform_get_submission($node->webform['nid'], $sid);
|
danielebarchiesi@0
|
2476 $submission->is_draft = $is_draft;
|
danielebarchiesi@0
|
2477
|
danielebarchiesi@0
|
2478 // Merge with new submission data. The + operator maintains numeric keys.
|
danielebarchiesi@0
|
2479 // This maintains existing data with just-submitted data when a user resumes
|
danielebarchiesi@0
|
2480 // a submission previously saved as a draft.
|
danielebarchiesi@0
|
2481 $new_data = webform_submission_data($node, $form_state['values']['submitted']);
|
danielebarchiesi@0
|
2482 $submission->data = $new_data + $submission->data;
|
danielebarchiesi@0
|
2483 }
|
danielebarchiesi@0
|
2484
|
danielebarchiesi@0
|
2485 // If there is no data to be saved (such as on a multipage form with no fields
|
danielebarchiesi@0
|
2486 // on the first page), process no further. Submissions with no data cannot
|
danielebarchiesi@0
|
2487 // be loaded from the database as efficiently, so we don't save them at all.
|
danielebarchiesi@0
|
2488 if (empty($submission->data)) {
|
danielebarchiesi@0
|
2489 return;
|
danielebarchiesi@0
|
2490 }
|
danielebarchiesi@0
|
2491
|
danielebarchiesi@0
|
2492 // Save the submission to the database.
|
danielebarchiesi@0
|
2493 if (!$sid) {
|
danielebarchiesi@0
|
2494 // No sid was found thus insert it in the dataabase.
|
danielebarchiesi@0
|
2495 $form_state['values']['details']['sid'] = $sid = webform_submission_insert($node, $submission);
|
danielebarchiesi@0
|
2496 $form_state['values']['details']['is_new'] = TRUE;
|
danielebarchiesi@0
|
2497
|
danielebarchiesi@0
|
2498 // Set a cookie including the server's submission time.
|
danielebarchiesi@0
|
2499 // The cookie expires in the length of the interval plus a day to compensate for different timezones.
|
danielebarchiesi@0
|
2500 if (variable_get('webform_use_cookies', 0)) {
|
danielebarchiesi@0
|
2501 $cookie_name = 'webform-' . $node->nid;
|
danielebarchiesi@0
|
2502 $time = REQUEST_TIME;
|
danielebarchiesi@0
|
2503 $params = session_get_cookie_params();
|
danielebarchiesi@0
|
2504 setcookie($cookie_name . '[' . $time . ']', $time, $time + $node->webform['submit_interval'] + 86400, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
|
danielebarchiesi@0
|
2505 }
|
danielebarchiesi@0
|
2506
|
danielebarchiesi@0
|
2507 // Save session information about this submission for anonymous users,
|
danielebarchiesi@0
|
2508 // allowing them to access or edit their submissions.
|
danielebarchiesi@0
|
2509 if (!$user->uid && user_access('access own webform submissions')) {
|
danielebarchiesi@0
|
2510 $_SESSION['webform_submission'][$form_state['values']['details']['sid']] = $node->nid;
|
danielebarchiesi@0
|
2511 }
|
danielebarchiesi@0
|
2512 }
|
danielebarchiesi@0
|
2513 else {
|
danielebarchiesi@0
|
2514 // Sid was found thus update the existing sid in the database.
|
danielebarchiesi@0
|
2515 webform_submission_update($node, $submission);
|
danielebarchiesi@0
|
2516 $form_state['values']['details']['is_new'] = FALSE;
|
danielebarchiesi@0
|
2517 }
|
danielebarchiesi@0
|
2518
|
danielebarchiesi@0
|
2519 // Check if this form is sending an email.
|
danielebarchiesi@0
|
2520 if (!$is_draft && !$form_state['values']['details']['finished']) {
|
danielebarchiesi@0
|
2521 $submission = webform_get_submission($node->webform['nid'], $sid, TRUE);
|
danielebarchiesi@0
|
2522 webform_submission_send_mail($node, $submission);
|
danielebarchiesi@0
|
2523 }
|
danielebarchiesi@0
|
2524
|
danielebarchiesi@0
|
2525 // Strip out empty tags added by WYSIWYG editors if needed.
|
danielebarchiesi@0
|
2526 $confirmation = strlen(trim(strip_tags($node->webform['confirmation']))) ? $node->webform['confirmation'] : '';
|
danielebarchiesi@0
|
2527
|
danielebarchiesi@0
|
2528 // Clean up the redirect URL and filter it for webform tokens.
|
danielebarchiesi@0
|
2529 $redirect_url = trim($node->webform['redirect_url']);
|
danielebarchiesi@0
|
2530 $redirect_url = _webform_filter_values($redirect_url, $node, $submission, NULL, FALSE, TRUE);
|
danielebarchiesi@0
|
2531
|
danielebarchiesi@0
|
2532
|
danielebarchiesi@0
|
2533 // Remove the domain name from the redirect.
|
danielebarchiesi@0
|
2534 $redirect_url = preg_replace('/^' . preg_quote($GLOBALS['base_url'], '/') . '\//', '', $redirect_url);
|
danielebarchiesi@0
|
2535
|
danielebarchiesi@0
|
2536 // Check confirmation and redirect_url fields.
|
danielebarchiesi@0
|
2537 $message = NULL;
|
danielebarchiesi@0
|
2538 $redirect = NULL;
|
danielebarchiesi@0
|
2539 $external_url = FALSE;
|
danielebarchiesi@0
|
2540 if (isset($form['actions']['draft']['#value']) && $form_state['values']['op'] == $form['actions']['draft']['#value']) {
|
danielebarchiesi@0
|
2541 $message = t('Submission saved. You may return to this form later and it will restore the current values.');
|
danielebarchiesi@0
|
2542 }
|
danielebarchiesi@0
|
2543 elseif ($is_draft) {
|
danielebarchiesi@0
|
2544 $redirect = NULL;
|
danielebarchiesi@0
|
2545 }
|
danielebarchiesi@0
|
2546 elseif (!empty($form_state['values']['details']['finished'])) {
|
danielebarchiesi@0
|
2547 $message = t('Submission updated.');
|
danielebarchiesi@0
|
2548 }
|
danielebarchiesi@0
|
2549 elseif ($redirect_url == '<none>') {
|
danielebarchiesi@0
|
2550 $redirect = NULL;
|
danielebarchiesi@0
|
2551 }
|
danielebarchiesi@0
|
2552 elseif ($redirect_url == '<confirmation>') {
|
danielebarchiesi@0
|
2553 $redirect = array('node/' . $node->nid . '/done', array('query' => array('sid' => $sid)));
|
danielebarchiesi@0
|
2554 }
|
danielebarchiesi@0
|
2555 elseif (valid_url($redirect_url, TRUE)) {
|
danielebarchiesi@0
|
2556 $redirect = $redirect_url;
|
danielebarchiesi@0
|
2557 $external_url = TRUE;
|
danielebarchiesi@0
|
2558 }
|
danielebarchiesi@0
|
2559 elseif ($redirect_url && strpos($redirect_url, 'http') !== 0) {
|
danielebarchiesi@0
|
2560 $parts = drupal_parse_url($redirect_url);
|
danielebarchiesi@0
|
2561 $parts['query'] ? ($parts['query']['sid'] = $sid) : ($parts['query'] = array('sid' => $sid));
|
danielebarchiesi@0
|
2562 $query = $parts['query'];
|
danielebarchiesi@0
|
2563 $redirect = array($parts['path'], array('query' => $query, 'fragment' => $parts['fragment']));
|
danielebarchiesi@0
|
2564 }
|
danielebarchiesi@0
|
2565
|
danielebarchiesi@0
|
2566 // Show a message if manually set.
|
danielebarchiesi@0
|
2567 if (isset($message)) {
|
danielebarchiesi@0
|
2568 drupal_set_message($message);
|
danielebarchiesi@0
|
2569 }
|
danielebarchiesi@0
|
2570 // If redirecting and we have a confirmation message, show it as a message.
|
danielebarchiesi@0
|
2571 elseif (!$is_draft && !$external_url && (!empty($redirect_url) && $redirect_url != '<confirmation>') && !empty($confirmation)) {
|
danielebarchiesi@0
|
2572 drupal_set_message(check_markup($confirmation, $node->webform['confirmation_format'], '', TRUE));
|
danielebarchiesi@0
|
2573 }
|
danielebarchiesi@0
|
2574
|
danielebarchiesi@0
|
2575 $form_state['redirect'] = $redirect;
|
danielebarchiesi@0
|
2576 }
|
danielebarchiesi@0
|
2577
|
danielebarchiesi@0
|
2578 /**
|
danielebarchiesi@0
|
2579 * Post processes the submission tree with any updates from components.
|
danielebarchiesi@0
|
2580 *
|
danielebarchiesi@0
|
2581 * @param $node
|
danielebarchiesi@0
|
2582 * The full webform node.
|
danielebarchiesi@0
|
2583 * @param $form_values
|
danielebarchiesi@0
|
2584 * The form values for the form.
|
danielebarchiesi@0
|
2585 * @param $types
|
danielebarchiesi@0
|
2586 * Optional. Specific types to perform processing.
|
danielebarchiesi@0
|
2587 * @param $parent
|
danielebarchiesi@0
|
2588 * Internal use. The current parent CID whose children are being processed.
|
danielebarchiesi@0
|
2589 */
|
danielebarchiesi@0
|
2590 function _webform_client_form_submit_process($node, &$form_values, $types = NULL, $parent = 0) {
|
danielebarchiesi@0
|
2591 if (is_array($form_values)) {
|
danielebarchiesi@0
|
2592 foreach ($form_values as $form_key => $value) {
|
danielebarchiesi@0
|
2593 $cid = webform_get_cid($node, $form_key, $parent);
|
danielebarchiesi@0
|
2594 if (is_array($value) && isset($node->webform['components'][$cid]['type']) && webform_component_feature($node->webform['components'][$cid]['type'], 'group')) {
|
danielebarchiesi@0
|
2595 _webform_client_form_submit_process($node, $form_values[$form_key], $types, $cid);
|
danielebarchiesi@0
|
2596 }
|
danielebarchiesi@0
|
2597
|
danielebarchiesi@0
|
2598 if (isset($node->webform['components'][$cid])) {
|
danielebarchiesi@0
|
2599 // Call the component process submission function.
|
danielebarchiesi@0
|
2600 $component = $node->webform['components'][$cid];
|
danielebarchiesi@0
|
2601 if ((!isset($types) || in_array($component['type'], $types)) && webform_component_implements($component['type'], 'submit')) {
|
danielebarchiesi@0
|
2602 $form_values[$component['form_key']] = webform_component_invoke($component['type'], 'submit', $component, $form_values[$component['form_key']]);
|
danielebarchiesi@0
|
2603 }
|
danielebarchiesi@0
|
2604 }
|
danielebarchiesi@0
|
2605 }
|
danielebarchiesi@0
|
2606 }
|
danielebarchiesi@0
|
2607 }
|
danielebarchiesi@0
|
2608
|
danielebarchiesi@0
|
2609 /**
|
danielebarchiesi@0
|
2610 * Flattens a submitted form back into a single array representation (rather than nested fields)
|
danielebarchiesi@0
|
2611 */
|
danielebarchiesi@0
|
2612 function _webform_client_form_submit_flatten($node, $fieldset, $parent = 0) {
|
danielebarchiesi@0
|
2613 $values = array();
|
danielebarchiesi@0
|
2614
|
danielebarchiesi@0
|
2615 if (is_array($fieldset)) {
|
danielebarchiesi@0
|
2616 foreach ($fieldset as $form_key => $value) {
|
danielebarchiesi@0
|
2617 $cid = webform_get_cid($node, $form_key, $parent);
|
danielebarchiesi@0
|
2618
|
danielebarchiesi@0
|
2619 if (is_array($value) && webform_component_feature($node->webform['components'][$cid]['type'], 'group')) {
|
danielebarchiesi@0
|
2620 $values += _webform_client_form_submit_flatten($node, $value, $cid);
|
danielebarchiesi@0
|
2621 }
|
danielebarchiesi@0
|
2622 else {
|
danielebarchiesi@0
|
2623 $values[$cid] = $value;
|
danielebarchiesi@0
|
2624 }
|
danielebarchiesi@0
|
2625 }
|
danielebarchiesi@0
|
2626 }
|
danielebarchiesi@0
|
2627
|
danielebarchiesi@0
|
2628 return $values;
|
danielebarchiesi@0
|
2629 }
|
danielebarchiesi@0
|
2630
|
danielebarchiesi@0
|
2631 /**
|
danielebarchiesi@0
|
2632 * Prints the confirmation message after a successful submission.
|
danielebarchiesi@0
|
2633 */
|
danielebarchiesi@0
|
2634 function _webform_confirmation($node) {
|
danielebarchiesi@0
|
2635 drupal_set_title($node->title);
|
danielebarchiesi@0
|
2636 webform_set_breadcrumb($node);
|
danielebarchiesi@0
|
2637 $sid = isset($_GET['sid']) ? $_GET['sid'] : NULL;
|
danielebarchiesi@0
|
2638 return theme(array('webform_confirmation_' . $node->nid, 'webform_confirmation'), array('node' => $node, 'sid' => $sid));
|
danielebarchiesi@0
|
2639 }
|
danielebarchiesi@0
|
2640
|
danielebarchiesi@0
|
2641 /**
|
danielebarchiesi@0
|
2642 * Prepare for theming of the webform form.
|
danielebarchiesi@0
|
2643 */
|
danielebarchiesi@0
|
2644 function template_preprocess_webform_form(&$vars) {
|
danielebarchiesi@0
|
2645 if (isset($vars['form']['details']['nid']['#value'])) {
|
danielebarchiesi@0
|
2646 $vars['nid'] = $vars['form']['details']['nid']['#value'];
|
danielebarchiesi@0
|
2647 }
|
danielebarchiesi@0
|
2648 elseif (isset($vars['form']['submission']['#value'])) {
|
danielebarchiesi@0
|
2649 $vars['nid'] = $vars['form']['submission']['#value']->nid;
|
danielebarchiesi@0
|
2650 }
|
danielebarchiesi@0
|
2651 }
|
danielebarchiesi@0
|
2652
|
danielebarchiesi@0
|
2653 /**
|
danielebarchiesi@0
|
2654 * Prepare for theming of the webform submission confirmation.
|
danielebarchiesi@0
|
2655 */
|
danielebarchiesi@0
|
2656 function template_preprocess_webform_confirmation(&$vars) {
|
danielebarchiesi@0
|
2657 $confirmation = check_markup($vars['node']->webform['confirmation'], $vars['node']->webform['confirmation_format'], '', TRUE);
|
danielebarchiesi@0
|
2658 // Strip out empty tags added by WYSIWYG editors if needed.
|
danielebarchiesi@0
|
2659 $vars['confirmation_message'] = strlen(trim(strip_tags($confirmation))) ? $confirmation : '';
|
danielebarchiesi@0
|
2660 }
|
danielebarchiesi@0
|
2661
|
danielebarchiesi@0
|
2662 /**
|
danielebarchiesi@0
|
2663 * Prepare to theme the contents of e-mails sent by webform.
|
danielebarchiesi@0
|
2664 */
|
danielebarchiesi@0
|
2665 function template_preprocess_webform_mail_message(&$vars) {
|
danielebarchiesi@0
|
2666 global $user;
|
danielebarchiesi@0
|
2667
|
danielebarchiesi@0
|
2668 $vars['user'] = $user;
|
danielebarchiesi@0
|
2669 $vars['ip_address'] = ip_address();
|
danielebarchiesi@0
|
2670 }
|
danielebarchiesi@0
|
2671
|
danielebarchiesi@0
|
2672 /**
|
danielebarchiesi@0
|
2673 * A Form API #pre_render function. Sets display based on #title_display.
|
danielebarchiesi@0
|
2674 *
|
danielebarchiesi@0
|
2675 * This function is used regularly in D6 for all elements, but specifically for
|
danielebarchiesi@0
|
2676 * fieldsets in D7, which don't support #title_display natively.
|
danielebarchiesi@0
|
2677 */
|
danielebarchiesi@0
|
2678 function webform_element_title_display($element) {
|
danielebarchiesi@0
|
2679 if (isset($element['#title_display']) && strcmp($element['#title_display'], 'none') === 0) {
|
danielebarchiesi@0
|
2680 $element['#title'] = NULL;
|
danielebarchiesi@0
|
2681 }
|
danielebarchiesi@0
|
2682 return $element;
|
danielebarchiesi@0
|
2683 }
|
danielebarchiesi@0
|
2684
|
danielebarchiesi@0
|
2685 /**
|
danielebarchiesi@0
|
2686 * Replacement for theme_form_element().
|
danielebarchiesi@0
|
2687 */
|
danielebarchiesi@0
|
2688 function theme_webform_element($variables) {
|
danielebarchiesi@0
|
2689 // Ensure defaults.
|
danielebarchiesi@0
|
2690 $variables['element'] += array(
|
danielebarchiesi@0
|
2691 '#title_display' => 'before',
|
danielebarchiesi@0
|
2692 );
|
danielebarchiesi@0
|
2693
|
danielebarchiesi@0
|
2694 $element = $variables['element'];
|
danielebarchiesi@0
|
2695
|
danielebarchiesi@0
|
2696 // All elements using this for display only are given the "display" type.
|
danielebarchiesi@0
|
2697 if (isset($element['#format']) && $element['#format'] == 'html') {
|
danielebarchiesi@0
|
2698 $type = 'display';
|
danielebarchiesi@0
|
2699 }
|
danielebarchiesi@0
|
2700 else {
|
danielebarchiesi@0
|
2701 $type = (isset($element['#type']) && !in_array($element['#type'], array('markup', 'textfield', 'webform_email', 'webform_number'))) ? $element['#type'] : $element['#webform_component']['type'];
|
danielebarchiesi@0
|
2702 }
|
danielebarchiesi@0
|
2703
|
danielebarchiesi@0
|
2704 // Convert the parents array into a string, excluding the "submitted" wrapper.
|
danielebarchiesi@0
|
2705 $nested_level = $element['#parents'][0] == 'submitted' ? 1 : 0;
|
danielebarchiesi@0
|
2706 $parents = str_replace('_', '-', implode('--', array_slice($element['#parents'], $nested_level)));
|
danielebarchiesi@0
|
2707
|
danielebarchiesi@0
|
2708 $wrapper_classes = array(
|
danielebarchiesi@0
|
2709 'form-item',
|
danielebarchiesi@0
|
2710 'webform-component',
|
danielebarchiesi@0
|
2711 'webform-component-' . $type,
|
danielebarchiesi@0
|
2712 );
|
danielebarchiesi@0
|
2713 if (isset($element['#title_display']) && strcmp($element['#title_display'], 'inline') === 0) {
|
danielebarchiesi@0
|
2714 $wrapper_classes[] = 'webform-container-inline';
|
danielebarchiesi@0
|
2715 }
|
danielebarchiesi@0
|
2716 $output = '<div class="' . implode(' ', $wrapper_classes) . '" id="webform-component-' . $parents . '">' . "\n";
|
danielebarchiesi@0
|
2717
|
danielebarchiesi@0
|
2718 // If #title is not set, we don't display any label or required marker.
|
danielebarchiesi@0
|
2719 if (!isset($element['#title'])) {
|
danielebarchiesi@0
|
2720 $element['#title_display'] = 'none';
|
danielebarchiesi@0
|
2721 }
|
danielebarchiesi@0
|
2722 $prefix = isset($element['#field_prefix']) ? '<span class="field-prefix">' . _webform_filter_xss($element['#field_prefix']) . '</span> ' : '';
|
danielebarchiesi@0
|
2723 $suffix = isset($element['#field_suffix']) ? ' <span class="field-suffix">' . _webform_filter_xss($element['#field_suffix']) . '</span>' : '';
|
danielebarchiesi@0
|
2724
|
danielebarchiesi@0
|
2725 switch ($element['#title_display']) {
|
danielebarchiesi@0
|
2726 case 'inline':
|
danielebarchiesi@0
|
2727 case 'before':
|
danielebarchiesi@0
|
2728 case 'invisible':
|
danielebarchiesi@0
|
2729 $output .= ' ' . theme('form_element_label', $variables);
|
danielebarchiesi@0
|
2730 $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
|
danielebarchiesi@0
|
2731 break;
|
danielebarchiesi@0
|
2732
|
danielebarchiesi@0
|
2733 case 'after':
|
danielebarchiesi@0
|
2734 $output .= ' ' . $prefix . $element['#children'] . $suffix;
|
danielebarchiesi@0
|
2735 $output .= ' ' . theme('form_element_label', $variables) . "\n";
|
danielebarchiesi@0
|
2736 break;
|
danielebarchiesi@0
|
2737
|
danielebarchiesi@0
|
2738 case 'none':
|
danielebarchiesi@0
|
2739 case 'attribute':
|
danielebarchiesi@0
|
2740 // Output no label and no required marker, only the children.
|
danielebarchiesi@0
|
2741 $output .= ' ' . $prefix . $element['#children'] . $suffix . "\n";
|
danielebarchiesi@0
|
2742 break;
|
danielebarchiesi@0
|
2743 }
|
danielebarchiesi@0
|
2744
|
danielebarchiesi@0
|
2745 if (!empty($element['#description'])) {
|
danielebarchiesi@0
|
2746 $output .= ' <div class="description">' . $element['#description'] . "</div>\n";
|
danielebarchiesi@0
|
2747 }
|
danielebarchiesi@0
|
2748
|
danielebarchiesi@0
|
2749 $output .= "</div>\n";
|
danielebarchiesi@0
|
2750
|
danielebarchiesi@0
|
2751 return $output;
|
danielebarchiesi@0
|
2752 }
|
danielebarchiesi@0
|
2753
|
danielebarchiesi@0
|
2754 /**
|
danielebarchiesi@0
|
2755 * Output a form element in plain text format.
|
danielebarchiesi@0
|
2756 */
|
danielebarchiesi@0
|
2757 function theme_webform_element_text($variables) {
|
danielebarchiesi@0
|
2758 $element = $variables['element'];
|
danielebarchiesi@0
|
2759 $value = $variables['element']['#children'];
|
danielebarchiesi@0
|
2760
|
danielebarchiesi@0
|
2761 $output = '';
|
danielebarchiesi@0
|
2762 $is_group = webform_component_feature($element['#webform_component']['type'], 'group');
|
danielebarchiesi@0
|
2763
|
danielebarchiesi@0
|
2764 // Output the element title.
|
danielebarchiesi@0
|
2765 if (isset($element['#title'])) {
|
danielebarchiesi@0
|
2766 if ($is_group) {
|
danielebarchiesi@0
|
2767 $output .= '--' . $element['#title'] . '--';
|
danielebarchiesi@0
|
2768 }
|
danielebarchiesi@0
|
2769 elseif (!in_array(drupal_substr($element['#title'], -1), array('?', ':', '!', '%', ';', '@'))) {
|
danielebarchiesi@0
|
2770 $output .= $element['#title'] . ':';
|
danielebarchiesi@0
|
2771 }
|
danielebarchiesi@0
|
2772 else {
|
danielebarchiesi@0
|
2773 $output .= $element['#title'];
|
danielebarchiesi@0
|
2774 }
|
danielebarchiesi@0
|
2775 }
|
danielebarchiesi@0
|
2776
|
danielebarchiesi@0
|
2777 // Wrap long values at 65 characters, allowing for a few fieldset indents.
|
danielebarchiesi@0
|
2778 // It's common courtesy to wrap at 75 characters in e-mails.
|
danielebarchiesi@0
|
2779 if ($is_group && drupal_strlen($value) > 65) {
|
danielebarchiesi@0
|
2780 $value = wordwrap($value, 65, "\n");
|
danielebarchiesi@0
|
2781 $lines = explode("\n", $value);
|
danielebarchiesi@0
|
2782 foreach ($lines as $key => $line) {
|
danielebarchiesi@0
|
2783 $lines[$key] = ' ' . $line;
|
danielebarchiesi@0
|
2784 }
|
danielebarchiesi@0
|
2785 $value = implode("\n", $lines);
|
danielebarchiesi@0
|
2786 }
|
danielebarchiesi@0
|
2787
|
danielebarchiesi@0
|
2788 // Add the value to the output.
|
danielebarchiesi@0
|
2789 if ($value) {
|
danielebarchiesi@0
|
2790 $output .= (strpos($value, "\n") === FALSE ? ' ' : "\n") . $value;
|
danielebarchiesi@0
|
2791 }
|
danielebarchiesi@0
|
2792
|
danielebarchiesi@0
|
2793 // Indent fieldsets.
|
danielebarchiesi@0
|
2794 if ($is_group) {
|
danielebarchiesi@0
|
2795 $lines = explode("\n", $output);
|
danielebarchiesi@0
|
2796 foreach ($lines as $number => $line) {
|
danielebarchiesi@0
|
2797 if (strlen($line)) {
|
danielebarchiesi@0
|
2798 $lines[$number] = ' ' . $line;
|
danielebarchiesi@0
|
2799 }
|
danielebarchiesi@0
|
2800 }
|
danielebarchiesi@0
|
2801 $output = implode("\n", $lines);
|
danielebarchiesi@0
|
2802 $output .= "\n";
|
danielebarchiesi@0
|
2803 }
|
danielebarchiesi@0
|
2804
|
danielebarchiesi@0
|
2805 if ($output) {
|
danielebarchiesi@0
|
2806 $output .= "\n";
|
danielebarchiesi@0
|
2807 }
|
danielebarchiesi@0
|
2808
|
danielebarchiesi@0
|
2809 return $output;
|
danielebarchiesi@0
|
2810 }
|
danielebarchiesi@0
|
2811
|
danielebarchiesi@0
|
2812 /**
|
danielebarchiesi@0
|
2813 * Theme a radio button and another element together.
|
danielebarchiesi@0
|
2814 *
|
danielebarchiesi@0
|
2815 * This is used in the e-mail configuration to show a radio button and a text
|
danielebarchiesi@0
|
2816 * field or select list on the same line.
|
danielebarchiesi@0
|
2817 */
|
danielebarchiesi@0
|
2818 function theme_webform_inline_radio($variables) {
|
danielebarchiesi@0
|
2819 $element = $variables['element'];
|
danielebarchiesi@0
|
2820
|
danielebarchiesi@0
|
2821 // Add element's #type and #name as class to aid with JS/CSS selectors.
|
danielebarchiesi@0
|
2822 $class = array('form-item');
|
danielebarchiesi@0
|
2823 if (!empty($element['#type'])) {
|
danielebarchiesi@0
|
2824 $class[] = 'form-type-' . strtr($element['#type'], '_', '-');
|
danielebarchiesi@0
|
2825 }
|
danielebarchiesi@0
|
2826 if (!empty($element['#name'])) {
|
danielebarchiesi@0
|
2827 $class[] = 'form-item-' . strtr($element['#name'], array(' ' => '-', '_' => '-', '[' => '-', ']' => ''));
|
danielebarchiesi@0
|
2828 }
|
danielebarchiesi@0
|
2829
|
danielebarchiesi@0
|
2830 // Add container-inline to all elements.
|
danielebarchiesi@0
|
2831 $class[] = 'webform-container-inline';
|
danielebarchiesi@0
|
2832 if (isset($element['#inline_element']) && isset($variables['element']['#title'])) {
|
danielebarchiesi@0
|
2833 $variables['element']['#title'] .= ': ';
|
danielebarchiesi@0
|
2834 }
|
danielebarchiesi@0
|
2835
|
danielebarchiesi@0
|
2836 $output = '<div class="' . implode(' ', $class) . '">' . "\n";
|
danielebarchiesi@0
|
2837 $output .= ' ' . $element['#children'];
|
danielebarchiesi@0
|
2838 if (!empty($element['#title'])) {
|
danielebarchiesi@0
|
2839 $output .= ' ' . theme('form_element_label', $variables) . "\n";
|
danielebarchiesi@0
|
2840 }
|
danielebarchiesi@0
|
2841 if (isset($element['#inline_element'])) {
|
danielebarchiesi@0
|
2842 $output .= ' ' . $element['#inline_element'] . "\n";
|
danielebarchiesi@0
|
2843 }
|
danielebarchiesi@0
|
2844
|
danielebarchiesi@0
|
2845 if (!empty($element['#description'])) {
|
danielebarchiesi@0
|
2846 $output .= ' <div class="description">' . $element['#description'] . "</div>\n";
|
danielebarchiesi@0
|
2847 }
|
danielebarchiesi@0
|
2848
|
danielebarchiesi@0
|
2849 $output .= "</div>\n";
|
danielebarchiesi@0
|
2850
|
danielebarchiesi@0
|
2851 return $output;
|
danielebarchiesi@0
|
2852 }
|
danielebarchiesi@0
|
2853
|
danielebarchiesi@0
|
2854 /**
|
danielebarchiesi@0
|
2855 * Theme the headers when sending an email from webform.
|
danielebarchiesi@0
|
2856 *
|
danielebarchiesi@0
|
2857 * @param $node
|
danielebarchiesi@0
|
2858 * The complete node object for the webform.
|
danielebarchiesi@0
|
2859 * @param $submission
|
danielebarchiesi@0
|
2860 * The webform submission of the user.
|
danielebarchiesi@0
|
2861 * @param $email
|
danielebarchiesi@0
|
2862 * If you desire to make different e-mail headers depending on the recipient,
|
danielebarchiesi@0
|
2863 * you can check the $email['email'] property to output different content.
|
danielebarchiesi@0
|
2864 * This will be the ID of the component that is a conditional e-mail
|
danielebarchiesi@0
|
2865 * recipient. For the normal e-mails, it will have the value of 'default'.
|
danielebarchiesi@0
|
2866 * @return
|
danielebarchiesi@0
|
2867 * An array of headers to be used when sending a webform email. If headers
|
danielebarchiesi@0
|
2868 * for "From", "To", or "Subject" are set, they will take precedence over
|
danielebarchiesi@0
|
2869 * the values set in the webform configuration.
|
danielebarchiesi@0
|
2870 */
|
danielebarchiesi@0
|
2871 function theme_webform_mail_headers($variables) {
|
danielebarchiesi@0
|
2872 $headers = array(
|
danielebarchiesi@0
|
2873 'X-Mailer' => 'Drupal Webform (PHP/' . phpversion() . ')',
|
danielebarchiesi@0
|
2874 );
|
danielebarchiesi@0
|
2875 return $headers;
|
danielebarchiesi@0
|
2876 }
|
danielebarchiesi@0
|
2877
|
danielebarchiesi@0
|
2878 /**
|
danielebarchiesi@0
|
2879 * Check if current user has a draft of this webform, and return the sid.
|
danielebarchiesi@0
|
2880 */
|
danielebarchiesi@0
|
2881 function _webform_fetch_draft_sid($nid, $uid) {
|
danielebarchiesi@0
|
2882 return db_select('webform_submissions')
|
danielebarchiesi@0
|
2883 ->fields('webform_submissions', array('sid'))
|
danielebarchiesi@0
|
2884 ->condition('nid', $nid)
|
danielebarchiesi@0
|
2885 ->condition('uid', $uid)
|
danielebarchiesi@0
|
2886 ->condition('is_draft', 1)
|
danielebarchiesi@0
|
2887 ->orderBy('submitted', 'DESC')
|
danielebarchiesi@0
|
2888 ->execute()
|
danielebarchiesi@0
|
2889 ->fetchField();
|
danielebarchiesi@0
|
2890 }
|
danielebarchiesi@0
|
2891
|
danielebarchiesi@0
|
2892 /**
|
danielebarchiesi@0
|
2893 * Filters all special tokens provided by webform, such as %post and %profile.
|
danielebarchiesi@0
|
2894 *
|
danielebarchiesi@0
|
2895 * @param $string
|
danielebarchiesi@0
|
2896 * The string to have its tokens replaced.
|
danielebarchiesi@0
|
2897 * @param $node
|
danielebarchiesi@0
|
2898 * If replacing node-level tokens, the node for which tokens will be created.
|
danielebarchiesi@0
|
2899 * @param $submission
|
danielebarchiesi@0
|
2900 * If replacing submission-level tokens, the submission for which tokens will
|
danielebarchiesi@0
|
2901 * be created.
|
danielebarchiesi@0
|
2902 * @param $email
|
danielebarchiesi@0
|
2903 * If replacing tokens within the context of an e-mail, the Webform e-mail
|
danielebarchiesi@0
|
2904 * settings array.
|
danielebarchiesi@0
|
2905 * @param $strict
|
danielebarchiesi@0
|
2906 * Boolean value indicating if the results should be run through check_plain.
|
danielebarchiesi@0
|
2907 * This is used any time the values will be output as HTML, but not in
|
danielebarchiesi@0
|
2908 * default values or e-mails.
|
danielebarchiesi@0
|
2909 * @param $allow_anonymous
|
danielebarchiesi@0
|
2910 * Boolean value indicating if all tokens should be replaced for anonymous
|
danielebarchiesi@0
|
2911 * users, even if they contain sensitive user information such as %session or
|
danielebarchiesi@0
|
2912 * %ip_address. This is disabled by default to prevent user data from being
|
danielebarchiesi@0
|
2913 * preserved in the anonymous page cache and should only be used in
|
danielebarchiesi@0
|
2914 * non-cached situations, such as e-mails.
|
danielebarchiesi@0
|
2915 */
|
danielebarchiesi@0
|
2916 function _webform_filter_values($string, $node = NULL, $submission = NULL, $email = NULL, $strict = TRUE, $allow_anonymous = FALSE) {
|
danielebarchiesi@0
|
2917 global $user;
|
danielebarchiesi@0
|
2918 static $replacements;
|
danielebarchiesi@0
|
2919
|
danielebarchiesi@0
|
2920 // Don't do any filtering if the string is empty.
|
danielebarchiesi@0
|
2921 if (strlen(trim($string)) == 0) {
|
danielebarchiesi@0
|
2922 return $string;
|
danielebarchiesi@0
|
2923 }
|
danielebarchiesi@0
|
2924
|
danielebarchiesi@0
|
2925 // Setup default token replacements.
|
danielebarchiesi@0
|
2926 if (!isset($replacements)) {
|
danielebarchiesi@0
|
2927 $replacements['unsafe'] = array();
|
danielebarchiesi@0
|
2928 $replacements['safe']['%site'] = variable_get('site_name', 'drupal');
|
danielebarchiesi@0
|
2929 $replacements['safe']['%date'] = format_date(REQUEST_TIME, 'long');
|
danielebarchiesi@0
|
2930 }
|
danielebarchiesi@0
|
2931
|
danielebarchiesi@0
|
2932 // Node replacements.
|
danielebarchiesi@0
|
2933 if (isset($node) && !array_key_exists('%nid', $replacements['safe'])) {
|
danielebarchiesi@0
|
2934 $replacements['safe']['%nid'] = $node->nid;
|
danielebarchiesi@0
|
2935 $replacements['safe']['%title'] = $node->title;
|
danielebarchiesi@0
|
2936 }
|
danielebarchiesi@0
|
2937
|
danielebarchiesi@0
|
2938 // Determine the display format.
|
danielebarchiesi@0
|
2939 $format = isset($email['html']) && $email['html'] ? 'html' : 'text';
|
danielebarchiesi@0
|
2940
|
danielebarchiesi@0
|
2941 // Submission replacements.
|
danielebarchiesi@0
|
2942 if (isset($submission) && !isset($replacements['email'][$format])) {
|
danielebarchiesi@0
|
2943 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
2944
|
danielebarchiesi@0
|
2945 // Set the submission ID.
|
danielebarchiesi@0
|
2946 $replacements['unsafe']['%sid'] = $submission->sid;
|
danielebarchiesi@0
|
2947
|
danielebarchiesi@0
|
2948 // E-mails may be sent in two formats, keep tokens separate for each one.
|
danielebarchiesi@0
|
2949 $replacements['email'][$format] = array();
|
danielebarchiesi@0
|
2950
|
danielebarchiesi@0
|
2951 // Populate token values for each component.
|
danielebarchiesi@0
|
2952 foreach ($submission->data as $cid => $value) {
|
danielebarchiesi@0
|
2953 $component = $node->webform['components'][$cid];
|
danielebarchiesi@0
|
2954
|
danielebarchiesi@0
|
2955 // Find by form key.
|
danielebarchiesi@0
|
2956 $parents = webform_component_parent_keys($node, $component);
|
danielebarchiesi@0
|
2957 $form_key = implode('][', $parents);
|
danielebarchiesi@0
|
2958 $display_element = webform_component_invoke($component['type'], 'display', $component, $value['value'], $format);
|
danielebarchiesi@0
|
2959
|
danielebarchiesi@0
|
2960 // Ensure the component is added as a property.
|
danielebarchiesi@0
|
2961 $display_element['#webform_component'] = $component;
|
danielebarchiesi@0
|
2962
|
danielebarchiesi@0
|
2963 if (empty($display_element['#parents'])) {
|
danielebarchiesi@0
|
2964 $display_element['#parents'] = array_merge(array('submitted'), $parents);
|
danielebarchiesi@0
|
2965 }
|
danielebarchiesi@0
|
2966 if (empty($display_element['#id'])) {
|
danielebarchiesi@0
|
2967 $display_element['#id'] = drupal_html_id('edit-' . implode('-', $display_element['#parents']));
|
danielebarchiesi@0
|
2968 }
|
danielebarchiesi@0
|
2969 $replacements['email'][$format]['%email[' . $form_key . ']'] = render($display_element);
|
danielebarchiesi@0
|
2970 $display_element['#theme_wrappers'] = array(); // Remove label and wrappers.
|
danielebarchiesi@0
|
2971 $replacements['email'][$format]['%value[' . $form_key . ']'] = render($display_element);
|
danielebarchiesi@0
|
2972 }
|
danielebarchiesi@0
|
2973
|
danielebarchiesi@0
|
2974 // Provide blanks for components in the webform but not in the submission.
|
danielebarchiesi@0
|
2975 $missing_components = array_diff_key($node->webform['components'], $submission->data);
|
danielebarchiesi@0
|
2976 foreach ($missing_components as $component) {
|
danielebarchiesi@0
|
2977 $parents = webform_component_parent_keys($node, $component);
|
danielebarchiesi@0
|
2978 $form_key = implode('][', $parents);
|
danielebarchiesi@0
|
2979 $replacements['email'][$format]['%email[' . $form_key . ']'] = '';
|
danielebarchiesi@0
|
2980 $replacements['email'][$format]['%value[' . $form_key . ']'] = '';
|
danielebarchiesi@0
|
2981 }
|
danielebarchiesi@0
|
2982
|
danielebarchiesi@0
|
2983 // Submission edit URL.
|
danielebarchiesi@0
|
2984 $replacements['unsafe']['%submission_url'] = url('node/' . $node->nid . '/submission/' . $submission->sid, array('absolute' => TRUE));
|
danielebarchiesi@0
|
2985 }
|
danielebarchiesi@0
|
2986
|
danielebarchiesi@0
|
2987 // Token for the entire form tree for e-mails.
|
danielebarchiesi@0
|
2988 if (isset($submission) && isset($email)) {
|
danielebarchiesi@0
|
2989 $replacements['email'][$format]['%email_values'] = webform_submission_render($node, $submission, $email, $format);
|
danielebarchiesi@0
|
2990 }
|
danielebarchiesi@0
|
2991
|
danielebarchiesi@0
|
2992 // Provide a list of candidates for token replacement.
|
danielebarchiesi@0
|
2993 $special_tokens = array(
|
danielebarchiesi@0
|
2994 'safe' => array(
|
danielebarchiesi@0
|
2995 '%get' => $_GET,
|
danielebarchiesi@0
|
2996 '%post' => $_POST,
|
danielebarchiesi@0
|
2997 ),
|
danielebarchiesi@0
|
2998 'unsafe' => array(
|
danielebarchiesi@0
|
2999 '%cookie' => $_COOKIE,
|
danielebarchiesi@0
|
3000 '%session' => isset($_SESSION) ? $_SESSION : array(),
|
danielebarchiesi@0
|
3001 '%request' => $_REQUEST,
|
danielebarchiesi@0
|
3002 '%server' => $_SERVER,
|
danielebarchiesi@0
|
3003 '%profile' => (array) $user,
|
danielebarchiesi@0
|
3004 ),
|
danielebarchiesi@0
|
3005 );
|
danielebarchiesi@0
|
3006
|
danielebarchiesi@0
|
3007 // Replacements of global variable tokens.
|
danielebarchiesi@0
|
3008 if (!isset($replacements['specials_set'])) {
|
danielebarchiesi@0
|
3009 $replacements['specials_set'] = TRUE;
|
danielebarchiesi@0
|
3010
|
danielebarchiesi@0
|
3011 // Load profile information if available.
|
danielebarchiesi@0
|
3012 if ($user->uid) {
|
danielebarchiesi@0
|
3013 $account = user_load($user->uid);
|
danielebarchiesi@0
|
3014 $special_tokens['unsafe']['%profile'] = (array) $account;
|
danielebarchiesi@0
|
3015 }
|
danielebarchiesi@0
|
3016
|
danielebarchiesi@0
|
3017 // User replacements.
|
danielebarchiesi@0
|
3018 if (!array_key_exists('%uid', $replacements['unsafe'])) {
|
danielebarchiesi@0
|
3019 $replacements['unsafe']['%uid'] = !empty($user->uid) ? $user->uid : '';
|
danielebarchiesi@0
|
3020 $replacements['unsafe']['%username'] = isset($user->name) ? $user->name : '';
|
danielebarchiesi@0
|
3021 $replacements['unsafe']['%useremail'] = isset($user->mail) ? $user->mail : '';
|
danielebarchiesi@0
|
3022 $replacements['unsafe']['%ip_address'] = ip_address();
|
danielebarchiesi@0
|
3023 }
|
danielebarchiesi@0
|
3024
|
danielebarchiesi@0
|
3025 // Populate the replacements array with special variables.
|
danielebarchiesi@0
|
3026 foreach ($special_tokens as $safe_state => $tokens) {
|
danielebarchiesi@0
|
3027 foreach ($tokens as $token => $variable) {
|
danielebarchiesi@0
|
3028 // Safety check in case $_POST or some other global has been removed
|
danielebarchiesi@0
|
3029 // by a naughty module, in which case $variable may be NULL.
|
danielebarchiesi@0
|
3030 if (!is_array($variable)) {
|
danielebarchiesi@0
|
3031 continue;
|
danielebarchiesi@0
|
3032 }
|
danielebarchiesi@0
|
3033
|
danielebarchiesi@0
|
3034 foreach ($variable as $key => $value) {
|
danielebarchiesi@0
|
3035 // This special case for profile module dates.
|
danielebarchiesi@0
|
3036 if ($token == '%profile' && is_array($value) && isset($value['year'])) {
|
danielebarchiesi@0
|
3037 $replacement = webform_strtodate(webform_date_format(), $value['month'] . '/' . $value['day'] . '/' . $value['year'], 'UTC');
|
danielebarchiesi@0
|
3038 }
|
danielebarchiesi@0
|
3039 else {
|
danielebarchiesi@0
|
3040 // Checking for complex types (arrays and objects) fails here with
|
danielebarchiesi@0
|
3041 // incomplete objects (see http://php.net/is_object), so we check
|
danielebarchiesi@0
|
3042 // for simple types instead.
|
danielebarchiesi@0
|
3043 $replacement = (is_string($value) || is_bool($value) || is_numeric($value)) ? $value : '';
|
danielebarchiesi@0
|
3044 }
|
danielebarchiesi@0
|
3045 $replacements[$safe_state][$token . '[' . $key . ']'] = $replacement;
|
danielebarchiesi@0
|
3046 }
|
danielebarchiesi@0
|
3047 }
|
danielebarchiesi@0
|
3048 }
|
danielebarchiesi@0
|
3049 }
|
danielebarchiesi@0
|
3050
|
danielebarchiesi@0
|
3051 // Make a copy of the replacements so we don't affect the static version.
|
danielebarchiesi@0
|
3052 $safe_replacements = $replacements['safe'];
|
danielebarchiesi@0
|
3053
|
danielebarchiesi@0
|
3054 // Restrict replacements for anonymous users. Not all tokens can be used
|
danielebarchiesi@0
|
3055 // because they may expose session or other private data to other users when
|
danielebarchiesi@0
|
3056 // anonymous page caching is enabled.
|
danielebarchiesi@0
|
3057 if ($user->uid || $allow_anonymous) {
|
danielebarchiesi@0
|
3058 $safe_replacements += $replacements['unsafe'];
|
danielebarchiesi@0
|
3059 if (isset($replacements['email'][$format])) {
|
danielebarchiesi@0
|
3060 $safe_replacements += $replacements['email'][$format];
|
danielebarchiesi@0
|
3061 }
|
danielebarchiesi@0
|
3062 }
|
danielebarchiesi@0
|
3063 else {
|
danielebarchiesi@0
|
3064 foreach ($replacements['unsafe'] as $key => $value) {
|
danielebarchiesi@0
|
3065 $safe_replacements[$key] = '';
|
danielebarchiesi@0
|
3066 }
|
danielebarchiesi@0
|
3067 }
|
danielebarchiesi@0
|
3068
|
danielebarchiesi@0
|
3069 $find = array_keys($safe_replacements);
|
danielebarchiesi@0
|
3070 $replace = array_values($safe_replacements);
|
danielebarchiesi@0
|
3071 $string = str_replace($find, $replace, $string);
|
danielebarchiesi@0
|
3072
|
danielebarchiesi@0
|
3073 // Clean up any unused tokens.
|
danielebarchiesi@0
|
3074 foreach ($special_tokens as $safe_state => $tokens) {
|
danielebarchiesi@0
|
3075 foreach (array_keys($tokens) as $token) {
|
danielebarchiesi@0
|
3076 $string = preg_replace('/\\' . $token . '\[\w+\]/', '', $string);
|
danielebarchiesi@0
|
3077 }
|
danielebarchiesi@0
|
3078 }
|
danielebarchiesi@0
|
3079
|
danielebarchiesi@0
|
3080 return $strict ? _webform_filter_xss($string) : $string;
|
danielebarchiesi@0
|
3081 }
|
danielebarchiesi@0
|
3082
|
danielebarchiesi@0
|
3083 /**
|
danielebarchiesi@0
|
3084 * Filters all special tokens provided by webform, and allows basic layout in descriptions.
|
danielebarchiesi@0
|
3085 */
|
danielebarchiesi@0
|
3086 function _webform_filter_descriptions($string, $node = NULL, $submission = NULL) {
|
danielebarchiesi@0
|
3087 return strlen($string) == 0 ? '' : _webform_filter_xss(_webform_filter_values($string, $node, $submission, NULL, FALSE));
|
danielebarchiesi@0
|
3088 }
|
danielebarchiesi@0
|
3089
|
danielebarchiesi@0
|
3090 /**
|
danielebarchiesi@0
|
3091 * Filter labels for display by running through XSS checks.
|
danielebarchiesi@0
|
3092 */
|
danielebarchiesi@0
|
3093 function _webform_filter_xss($string) {
|
danielebarchiesi@0
|
3094 static $allowed_tags;
|
danielebarchiesi@0
|
3095 $allowed_tags = isset($allowed_tags) ? $allowed_tags : webform_variable_get('webform_allowed_tags');
|
danielebarchiesi@0
|
3096 return filter_xss($string, $allowed_tags);
|
danielebarchiesi@0
|
3097 }
|
danielebarchiesi@0
|
3098
|
danielebarchiesi@0
|
3099
|
danielebarchiesi@0
|
3100 /**
|
danielebarchiesi@0
|
3101 * Utility function to ensure that a webform record exists in the database.
|
danielebarchiesi@0
|
3102 *
|
danielebarchiesi@0
|
3103 * @param $node
|
danielebarchiesi@0
|
3104 * The node object to check if a database entry exists.
|
danielebarchiesi@0
|
3105 * @return
|
danielebarchiesi@0
|
3106 * This function should always return TRUE if no errors were encountered,
|
danielebarchiesi@0
|
3107 * ensuring that a webform table row has been created. Will return FALSE if
|
danielebarchiesi@0
|
3108 * a record does not exist and a new one could not be created.
|
danielebarchiesi@0
|
3109 */
|
danielebarchiesi@0
|
3110 function webform_ensure_record(&$node) {
|
danielebarchiesi@0
|
3111 if (!$node->webform['record_exists']) {
|
danielebarchiesi@0
|
3112 // Even though webform_node_insert() would set this property to TRUE,
|
danielebarchiesi@0
|
3113 // we set record_exists to trigger a difference from the defaults.
|
danielebarchiesi@0
|
3114 $node->webform['record_exists'] = TRUE;
|
danielebarchiesi@0
|
3115 webform_node_insert($node);
|
danielebarchiesi@0
|
3116 }
|
danielebarchiesi@0
|
3117 return $node->webform['record_exists'];
|
danielebarchiesi@0
|
3118 }
|
danielebarchiesi@0
|
3119
|
danielebarchiesi@0
|
3120 /**
|
danielebarchiesi@0
|
3121 * Utility function to check if a webform record is necessary in the database.
|
danielebarchiesi@0
|
3122 *
|
danielebarchiesi@0
|
3123 * If the node is no longer using any webform settings, this function will
|
danielebarchiesi@0
|
3124 * delete the settings from the webform table. Note that this function will NOT
|
danielebarchiesi@0
|
3125 * delete rows from the webform table if the node-type is exclusively used for
|
danielebarchiesi@0
|
3126 * webforms (per the "webform_node_types_primary" variable).
|
danielebarchiesi@0
|
3127 *
|
danielebarchiesi@0
|
3128 * @param $node
|
danielebarchiesi@0
|
3129 * The node object to check if a database entry is still required.
|
danielebarchiesi@0
|
3130 * @return
|
danielebarchiesi@0
|
3131 * Returns TRUE if the webform still has a record in the database. Returns
|
danielebarchiesi@0
|
3132 * FALSE if the webform does not have a record or if the previously existing
|
danielebarchiesi@0
|
3133 * record was just deleted.
|
danielebarchiesi@0
|
3134 */
|
danielebarchiesi@0
|
3135 function webform_check_record(&$node) {
|
danielebarchiesi@0
|
3136 $webform = $node->webform;
|
danielebarchiesi@0
|
3137 $webform['record_exists'] = FALSE;
|
danielebarchiesi@0
|
3138 unset($webform['nid']);
|
danielebarchiesi@0
|
3139
|
danielebarchiesi@0
|
3140 // Don't include empty values in the comparison, this makes it so modules that
|
danielebarchiesi@0
|
3141 // extend Webform with empty defaults won't affect cleanup of rows.
|
danielebarchiesi@0
|
3142 $webform = array_filter($webform);
|
danielebarchiesi@0
|
3143 $defaults = array_filter(webform_node_defaults());
|
danielebarchiesi@0
|
3144 if ($webform == $defaults && !in_array($node->type, webform_variable_get('webform_node_types_primary'))) {
|
danielebarchiesi@0
|
3145 webform_node_delete($node);
|
danielebarchiesi@0
|
3146 $node->webform = webform_node_defaults();
|
danielebarchiesi@0
|
3147 }
|
danielebarchiesi@0
|
3148 return $node->webform['record_exists'];
|
danielebarchiesi@0
|
3149 }
|
danielebarchiesi@0
|
3150
|
danielebarchiesi@0
|
3151 /**
|
danielebarchiesi@0
|
3152 * Given a form_key and a list of form_key parents, determine the cid.
|
danielebarchiesi@0
|
3153 *
|
danielebarchiesi@0
|
3154 * @param $node
|
danielebarchiesi@0
|
3155 * A fully loaded node object.
|
danielebarchiesi@0
|
3156 * @param $form_key
|
danielebarchiesi@0
|
3157 * The form key for which we're finding a cid.
|
danielebarchiesi@0
|
3158 * @param $parent
|
danielebarchiesi@0
|
3159 * The cid of the parent component.
|
danielebarchiesi@0
|
3160 */
|
danielebarchiesi@0
|
3161 function webform_get_cid(&$node, $form_key, $pid) {
|
danielebarchiesi@0
|
3162 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
3163 if ($component['form_key'] == $form_key && $component['pid'] == $pid) {
|
danielebarchiesi@0
|
3164 return $cid;
|
danielebarchiesi@0
|
3165 }
|
danielebarchiesi@0
|
3166 }
|
danielebarchiesi@0
|
3167 }
|
danielebarchiesi@0
|
3168
|
danielebarchiesi@0
|
3169 /**
|
danielebarchiesi@0
|
3170 * Retreive a Drupal variable with the appropriate default value.
|
danielebarchiesi@0
|
3171 */
|
danielebarchiesi@0
|
3172 function webform_variable_get($variable) {
|
danielebarchiesi@0
|
3173 switch ($variable) {
|
danielebarchiesi@0
|
3174 case 'webform_allowed_tags':
|
danielebarchiesi@0
|
3175 $result = variable_get('webform_allowed_tags', array('a', 'em', 'strong', 'code', 'img'));
|
danielebarchiesi@0
|
3176 break;
|
danielebarchiesi@0
|
3177 case 'webform_default_from_name':
|
danielebarchiesi@0
|
3178 $result = variable_get('webform_default_from_name', variable_get('site_name', ''));
|
danielebarchiesi@0
|
3179 break;
|
danielebarchiesi@0
|
3180 case 'webform_default_from_address':
|
danielebarchiesi@0
|
3181 $result = variable_get('webform_default_from_address', variable_get('site_mail', ini_get('sendmail_from')));
|
danielebarchiesi@0
|
3182 break;
|
danielebarchiesi@0
|
3183 case 'webform_default_subject':
|
danielebarchiesi@0
|
3184 $result = variable_get('webform_default_subject', t('Form submission from: %title'));
|
danielebarchiesi@0
|
3185 break;
|
danielebarchiesi@0
|
3186 case 'webform_node_types':
|
danielebarchiesi@0
|
3187 $result = variable_get('webform_node_types', array('webform'));
|
danielebarchiesi@0
|
3188 break;
|
danielebarchiesi@0
|
3189 case 'webform_node_types_primary':
|
danielebarchiesi@0
|
3190 $result = variable_get('webform_node_types_primary', array('webform'));
|
danielebarchiesi@0
|
3191 break;
|
danielebarchiesi@0
|
3192 }
|
danielebarchiesi@0
|
3193 return $result;
|
danielebarchiesi@0
|
3194 }
|
danielebarchiesi@0
|
3195
|
danielebarchiesi@0
|
3196 function theme_webform_token_help($variables) {
|
danielebarchiesi@0
|
3197 $groups = $variables['groups'];
|
danielebarchiesi@0
|
3198 $groups = empty($groups) ? array('basic', 'node', 'special') : $groups;
|
danielebarchiesi@0
|
3199
|
danielebarchiesi@0
|
3200 static $tokens = array();
|
danielebarchiesi@0
|
3201
|
danielebarchiesi@0
|
3202 if (empty($tokens)) {
|
danielebarchiesi@0
|
3203 $tokens['basic'] = array(
|
danielebarchiesi@0
|
3204 'title' => t('Basic tokens'),
|
danielebarchiesi@0
|
3205 'tokens' => array(
|
danielebarchiesi@0
|
3206 '%username' => t('The name of the user if logged in. Blank for anonymous users.'),
|
danielebarchiesi@0
|
3207 '%useremail' => t('The e-mail address of the user if logged in. Blank for anonymous users.'),
|
danielebarchiesi@0
|
3208 '%ip_address' => t('The IP address of the user.'),
|
danielebarchiesi@0
|
3209 '%site' => t('The name of the site (i.e. %site_name)', array('%site_name' => variable_get('site_name', ''))),
|
danielebarchiesi@0
|
3210 '%date' => t('The current date, formatted according to the site settings.'),
|
danielebarchiesi@0
|
3211 ),
|
danielebarchiesi@0
|
3212 );
|
danielebarchiesi@0
|
3213
|
danielebarchiesi@0
|
3214 $tokens['node'] = array(
|
danielebarchiesi@0
|
3215 'title' => t('Node tokens'),
|
danielebarchiesi@0
|
3216 'tokens' => array(
|
danielebarchiesi@0
|
3217 '%nid' => t('The node ID.'),
|
danielebarchiesi@0
|
3218 '%title' => t('The node title.'),
|
danielebarchiesi@0
|
3219 ),
|
danielebarchiesi@0
|
3220 );
|
danielebarchiesi@0
|
3221
|
danielebarchiesi@0
|
3222 $tokens['special'] = array(
|
danielebarchiesi@0
|
3223 'title' => t('Special tokens'),
|
danielebarchiesi@0
|
3224 'tokens' => array(
|
danielebarchiesi@0
|
3225 '%profile[' . t('key') . ']' => t('Any user profile field or value, such as %profile[name] or %profile[profile_first_name]'),
|
danielebarchiesi@0
|
3226 '%get[' . t('key') . ']' => t('Tokens may be populated from the URL by creating URLs of the form http://example.com/my-form?foo=bar. Using the token %get[foo] would print "bar".'),
|
danielebarchiesi@0
|
3227 '%post[' . t('key') . ']' => t('Tokens may also be populated from POST values that are submitted by forms.'),
|
danielebarchiesi@0
|
3228 ),
|
danielebarchiesi@0
|
3229 'description' => t('In addition to %get and %post, the following super tokens may be used, though only with logged-in users: %server, %cookie, and %request. For example %server[HTTP_USER_AGENT] or %session[id].'),
|
danielebarchiesi@0
|
3230 );
|
danielebarchiesi@0
|
3231
|
danielebarchiesi@0
|
3232 $tokens['email'] = array(
|
danielebarchiesi@0
|
3233 'title' => t('E-mail tokens'),
|
danielebarchiesi@0
|
3234 'tokens' => array(
|
danielebarchiesi@0
|
3235 '%email_values' => t('All included components in a hierarchical structure.'),
|
danielebarchiesi@0
|
3236 '%email[' . t('key') . '] ' => t('A formatted value and field label. Elements may be accessed such as <em>%email[fieldset_a][key_b]</em>. Do not include quotes.'),
|
danielebarchiesi@0
|
3237 '%submission_url' => t('The URL for viewing the completed submission.'),
|
danielebarchiesi@0
|
3238 ),
|
danielebarchiesi@0
|
3239 );
|
danielebarchiesi@0
|
3240
|
danielebarchiesi@0
|
3241 $tokens['submission'] = array(
|
danielebarchiesi@0
|
3242 'title' => t('Submission tokens'),
|
danielebarchiesi@0
|
3243 'tokens' => array(
|
danielebarchiesi@0
|
3244 '%sid' => t('The unique submission ID.'),
|
danielebarchiesi@0
|
3245 '%value[key]' => t('A value without additional formatting. Elements may be accessed such as <em>%value[fieldset_a][key_b]</em>. Do not include quotes.'),
|
danielebarchiesi@0
|
3246 ),
|
danielebarchiesi@0
|
3247 );
|
danielebarchiesi@0
|
3248 }
|
danielebarchiesi@0
|
3249
|
danielebarchiesi@0
|
3250 $output = '';
|
danielebarchiesi@0
|
3251 $output .= '<p>' . t('You may use special tokens in this field that will be replaced with dynamic values.') . '</p>';
|
danielebarchiesi@0
|
3252
|
danielebarchiesi@0
|
3253 foreach ($tokens as $group_name => $group) {
|
danielebarchiesi@0
|
3254 if (!is_array($groups) || in_array($group_name, $groups)) {
|
danielebarchiesi@0
|
3255 $items = array();
|
danielebarchiesi@0
|
3256 foreach ($group['tokens'] as $token => $token_description) {
|
danielebarchiesi@0
|
3257 $items[] = $token . ' - ' . $token_description;
|
danielebarchiesi@0
|
3258 }
|
danielebarchiesi@0
|
3259 $output .= theme('item_list', array('items' => $items, 'title' => $group['title']));
|
danielebarchiesi@0
|
3260 $output .= isset($group['description']) ? '<p>' . $group['description'] . '</p>' : '';
|
danielebarchiesi@0
|
3261 }
|
danielebarchiesi@0
|
3262 }
|
danielebarchiesi@0
|
3263
|
danielebarchiesi@0
|
3264 $fieldset = array(
|
danielebarchiesi@0
|
3265 '#title' => t('Token values'),
|
danielebarchiesi@0
|
3266 '#type' => 'fieldset',
|
danielebarchiesi@0
|
3267 '#collapsible' => TRUE,
|
danielebarchiesi@0
|
3268 '#collapsed' => TRUE,
|
danielebarchiesi@0
|
3269 '#children' => '<div>' . $output . '</div>',
|
danielebarchiesi@0
|
3270 '#attributes' => array('class' => array('collapsible', 'collapsed')),
|
danielebarchiesi@0
|
3271 );
|
danielebarchiesi@0
|
3272 return theme('fieldset', array('element' => $fieldset));
|
danielebarchiesi@0
|
3273 }
|
danielebarchiesi@0
|
3274
|
danielebarchiesi@0
|
3275 function _webform_safe_name($name) {
|
danielebarchiesi@0
|
3276 $new = trim($name);
|
danielebarchiesi@0
|
3277
|
danielebarchiesi@0
|
3278 // If transliteration is available, use it to convert names to ASCII.
|
danielebarchiesi@0
|
3279 if (function_exists('transliteration_get')) {
|
danielebarchiesi@0
|
3280 $new = transliteration_get($new, '');
|
danielebarchiesi@0
|
3281 $new = str_replace(array(' ', '-', '/'), array('_', '_', '_'), $new);
|
danielebarchiesi@0
|
3282 }
|
danielebarchiesi@0
|
3283 else {
|
danielebarchiesi@0
|
3284 $new = str_replace(
|
danielebarchiesi@0
|
3285 array(' ', '-', '/', '€', 'ƒ', 'Š', 'Ž', 'š', 'ž', 'Ÿ', '¢', '¥', 'µ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', 'Œ', 'œ', 'Æ', 'Ð', 'Þ', 'ß', 'æ', 'ð', 'þ'),
|
danielebarchiesi@0
|
3286 array('_', '_', '_', 'E', 'f', 'S', 'Z', 's', 'z', 'Y', 'c', 'Y', 'u', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th'),
|
danielebarchiesi@0
|
3287 $new);
|
danielebarchiesi@0
|
3288 }
|
danielebarchiesi@0
|
3289
|
danielebarchiesi@0
|
3290 $new = drupal_strtolower($new);
|
danielebarchiesi@0
|
3291 $new = preg_replace('/[^a-z0-9_]/', '', $new);
|
danielebarchiesi@0
|
3292 return $new;
|
danielebarchiesi@0
|
3293 }
|
danielebarchiesi@0
|
3294
|
danielebarchiesi@0
|
3295 /**
|
danielebarchiesi@0
|
3296 * Given an email address and a name, format an e-mail address.
|
danielebarchiesi@0
|
3297 *
|
danielebarchiesi@0
|
3298 * @param $address
|
danielebarchiesi@0
|
3299 * The e-mail address.
|
danielebarchiesi@0
|
3300 * @param $name
|
danielebarchiesi@0
|
3301 * The name to be used in the formatted address.
|
danielebarchiesi@0
|
3302 * @param $node
|
danielebarchiesi@0
|
3303 * The webform node if replacements will be done.
|
danielebarchiesi@0
|
3304 * @param $submission
|
danielebarchiesi@0
|
3305 * The webform submission values if replacements will be done.
|
danielebarchiesi@0
|
3306 * @param $encode
|
danielebarchiesi@0
|
3307 * Encode the text for use in an e-mail.
|
danielebarchiesi@0
|
3308 * @param $single
|
danielebarchiesi@0
|
3309 * Force a single value to be returned, even if a component expands to
|
danielebarchiesi@0
|
3310 * multiple addresses. This is useful to ensure a single e-mail will be
|
danielebarchiesi@0
|
3311 * returned for the "From" address.
|
danielebarchiesi@0
|
3312 * @param $format
|
danielebarchiesi@0
|
3313 * The e-mail format, defaults to the site-wide setting. May be either "short"
|
danielebarchiesi@0
|
3314 * or "long".
|
danielebarchiesi@0
|
3315 */
|
danielebarchiesi@0
|
3316 function webform_format_email_address($address, $name, $node = NULL, $submission = NULL, $encode = TRUE, $single = TRUE, $format = NULL) {
|
danielebarchiesi@0
|
3317 if (!isset($format)) {
|
danielebarchiesi@0
|
3318 $format = variable_get('webform_email_address_format', 'long');
|
danielebarchiesi@0
|
3319 }
|
danielebarchiesi@0
|
3320
|
danielebarchiesi@0
|
3321 if ($name == 'default') {
|
danielebarchiesi@0
|
3322 $name = webform_variable_get('webform_default_from_name');
|
danielebarchiesi@0
|
3323 }
|
danielebarchiesi@0
|
3324 elseif (is_numeric($name) && isset($node->webform['components'][$name])) {
|
danielebarchiesi@0
|
3325 if (isset($submission->data[$name]['value'])) {
|
danielebarchiesi@0
|
3326 $name = $submission->data[$name]['value'];
|
danielebarchiesi@0
|
3327 }
|
danielebarchiesi@0
|
3328 else {
|
danielebarchiesi@0
|
3329 $name = t('Value of !component', array('!component' => $node->webform['components'][$name]['name']));
|
danielebarchiesi@0
|
3330 }
|
danielebarchiesi@0
|
3331 }
|
danielebarchiesi@0
|
3332
|
danielebarchiesi@0
|
3333 if ($address == 'default') {
|
danielebarchiesi@0
|
3334 $address = webform_variable_get('webform_default_from_address');
|
danielebarchiesi@0
|
3335 }
|
danielebarchiesi@0
|
3336 elseif (is_numeric($address) && isset($node->webform['components'][$address])) {
|
danielebarchiesi@0
|
3337 if (isset($submission->data[$address]['value'])) {
|
danielebarchiesi@0
|
3338 $values = $submission->data[$address]['value'];;
|
danielebarchiesi@0
|
3339 $address = array();
|
danielebarchiesi@0
|
3340 foreach ($values as $value) {
|
danielebarchiesi@0
|
3341 $address = array_merge($address, explode(',', $value));
|
danielebarchiesi@0
|
3342 }
|
danielebarchiesi@0
|
3343 }
|
danielebarchiesi@0
|
3344 else {
|
danielebarchiesi@0
|
3345 $address = t('Value of "!component"', array('!component' => $node->webform['components'][$address]['name']));
|
danielebarchiesi@0
|
3346 }
|
danielebarchiesi@0
|
3347 }
|
danielebarchiesi@0
|
3348
|
danielebarchiesi@0
|
3349 // Convert arrays into a single value for From values.
|
danielebarchiesi@0
|
3350 if ($single) {
|
danielebarchiesi@0
|
3351 $address = is_array($address) ? reset($address) : $address;
|
danielebarchiesi@0
|
3352 $name = is_array($name) ? reset($name) : $name;
|
danielebarchiesi@0
|
3353 }
|
danielebarchiesi@0
|
3354
|
danielebarchiesi@0
|
3355 // Address may be an array if a component value was used on checkboxes.
|
danielebarchiesi@0
|
3356 if (is_array($address)) {
|
danielebarchiesi@0
|
3357 foreach ($address as $key => $individual_address) {
|
danielebarchiesi@0
|
3358 $address[$key] = _webform_filter_values($individual_address, $node, $submission, NULL, FALSE, TRUE);
|
danielebarchiesi@0
|
3359 }
|
danielebarchiesi@0
|
3360 }
|
danielebarchiesi@0
|
3361 else {
|
danielebarchiesi@0
|
3362 $address = _webform_filter_values($address, $node, $submission, NULL, FALSE, TRUE);
|
danielebarchiesi@0
|
3363 }
|
danielebarchiesi@0
|
3364
|
danielebarchiesi@0
|
3365 if ($format == 'long' && !empty($name)) {
|
danielebarchiesi@0
|
3366 $name = _webform_filter_values($name, $node, $submission, NULL, FALSE, TRUE);
|
danielebarchiesi@0
|
3367 if ($encode) {
|
danielebarchiesi@0
|
3368 $name = mime_header_encode($name);
|
danielebarchiesi@0
|
3369 }
|
danielebarchiesi@0
|
3370 return '"' . $name . '" <' . $address . '>';
|
danielebarchiesi@0
|
3371 }
|
danielebarchiesi@0
|
3372 else {
|
danielebarchiesi@0
|
3373 return $address;
|
danielebarchiesi@0
|
3374 }
|
danielebarchiesi@0
|
3375 }
|
danielebarchiesi@0
|
3376
|
danielebarchiesi@0
|
3377 /**
|
danielebarchiesi@0
|
3378 * Given an email subject, format it with any needed replacements.
|
danielebarchiesi@0
|
3379 */
|
danielebarchiesi@0
|
3380 function webform_format_email_subject($subject, $node = NULL, $submission = NULL) {
|
danielebarchiesi@0
|
3381 if ($subject == 'default') {
|
danielebarchiesi@0
|
3382 $subject = webform_variable_get('webform_default_subject');
|
danielebarchiesi@0
|
3383 }
|
danielebarchiesi@0
|
3384 elseif (is_numeric($subject) && isset($node->webform['components'][$subject])) {
|
danielebarchiesi@0
|
3385 $component = $node->webform['components'][$subject];
|
danielebarchiesi@0
|
3386 if (isset($submission->data[$subject]['value'])) {
|
danielebarchiesi@0
|
3387 $display_function = '_webform_display_' . $component['type'];
|
danielebarchiesi@0
|
3388 $value = $submission->data[$subject]['value'];
|
danielebarchiesi@0
|
3389
|
danielebarchiesi@0
|
3390 // Convert the value to a clean text representation if possible.
|
danielebarchiesi@0
|
3391 if (function_exists($display_function)) {
|
danielebarchiesi@0
|
3392 $display = $display_function($component, $value, 'text');
|
danielebarchiesi@0
|
3393 $display['#theme_wrappers'] = array();
|
danielebarchiesi@0
|
3394 $display['#webform_component'] = $component;
|
danielebarchiesi@0
|
3395 $subject = str_replace("\n", ' ', drupal_render($display));
|
danielebarchiesi@0
|
3396 }
|
danielebarchiesi@0
|
3397 else {
|
danielebarchiesi@0
|
3398 $subject = $value;
|
danielebarchiesi@0
|
3399 }
|
danielebarchiesi@0
|
3400 }
|
danielebarchiesi@0
|
3401 else {
|
danielebarchiesi@0
|
3402 $subject = t('Value of "!component"', array('!component' => $component['name']));
|
danielebarchiesi@0
|
3403 }
|
danielebarchiesi@0
|
3404 }
|
danielebarchiesi@0
|
3405
|
danielebarchiesi@0
|
3406 // Convert arrays to strings (may happen if checkboxes are used as the value).
|
danielebarchiesi@0
|
3407 if (is_array($subject)) {
|
danielebarchiesi@0
|
3408 $subject = reset($subject);
|
danielebarchiesi@0
|
3409 }
|
danielebarchiesi@0
|
3410
|
danielebarchiesi@0
|
3411 return _webform_filter_values($subject, $node, $submission, NULL, FALSE, TRUE);
|
danielebarchiesi@0
|
3412 }
|
danielebarchiesi@0
|
3413
|
danielebarchiesi@0
|
3414 /**
|
danielebarchiesi@0
|
3415 * Convert an array of components into a tree
|
danielebarchiesi@0
|
3416 */
|
danielebarchiesi@0
|
3417 function _webform_components_tree_build($src, &$tree, $parent, &$page_count) {
|
danielebarchiesi@0
|
3418 foreach ($src as $cid => $component) {
|
danielebarchiesi@0
|
3419 if ($component['pid'] == $parent) {
|
danielebarchiesi@0
|
3420 _webform_components_tree_build($src, $component, $cid, $page_count);
|
danielebarchiesi@0
|
3421 if ($component['type'] == 'pagebreak') {
|
danielebarchiesi@0
|
3422 $page_count++;
|
danielebarchiesi@0
|
3423 }
|
danielebarchiesi@0
|
3424 $tree['children'][$cid] = $component;
|
danielebarchiesi@0
|
3425 $tree['children'][$cid]['page_num'] = $page_count;
|
danielebarchiesi@0
|
3426 }
|
danielebarchiesi@0
|
3427 }
|
danielebarchiesi@0
|
3428 return $tree;
|
danielebarchiesi@0
|
3429 }
|
danielebarchiesi@0
|
3430
|
danielebarchiesi@0
|
3431 /**
|
danielebarchiesi@0
|
3432 * Flatten a component tree into a flat list.
|
danielebarchiesi@0
|
3433 */
|
danielebarchiesi@0
|
3434 function _webform_components_tree_flatten($tree) {
|
danielebarchiesi@0
|
3435 $components = array();
|
danielebarchiesi@0
|
3436 foreach ($tree as $cid => $component) {
|
danielebarchiesi@0
|
3437 if (isset($component['children'])) {
|
danielebarchiesi@0
|
3438 unset($component['children']);
|
danielebarchiesi@0
|
3439 $components[$cid] = $component;
|
danielebarchiesi@0
|
3440 // array_merge() can't be used here because the keys are numeric.
|
danielebarchiesi@0
|
3441 $children = _webform_components_tree_flatten($tree[$cid]['children']);
|
danielebarchiesi@0
|
3442 foreach ($children as $ccid => $ccomponent) {
|
danielebarchiesi@0
|
3443 $components[$ccid] = $ccomponent;
|
danielebarchiesi@0
|
3444 }
|
danielebarchiesi@0
|
3445 }
|
danielebarchiesi@0
|
3446 else {
|
danielebarchiesi@0
|
3447 $components[$cid] = $component;
|
danielebarchiesi@0
|
3448 }
|
danielebarchiesi@0
|
3449 }
|
danielebarchiesi@0
|
3450 return $components;
|
danielebarchiesi@0
|
3451 }
|
danielebarchiesi@0
|
3452
|
danielebarchiesi@0
|
3453 /**
|
danielebarchiesi@0
|
3454 * Helper for the uasort in webform_tree_sort()
|
danielebarchiesi@0
|
3455 */
|
danielebarchiesi@0
|
3456 function _webform_components_sort($a, $b) {
|
danielebarchiesi@0
|
3457 if ($a['weight'] == $b['weight']) {
|
danielebarchiesi@0
|
3458 return strcasecmp($a['name'], $b['name']);
|
danielebarchiesi@0
|
3459 }
|
danielebarchiesi@0
|
3460 return ($a['weight'] < $b['weight']) ? -1 : 1;
|
danielebarchiesi@0
|
3461 }
|
danielebarchiesi@0
|
3462
|
danielebarchiesi@0
|
3463 /**
|
danielebarchiesi@0
|
3464 * Sort each level of a component tree by weight and name
|
danielebarchiesi@0
|
3465 */
|
danielebarchiesi@0
|
3466 function _webform_components_tree_sort($tree) {
|
danielebarchiesi@0
|
3467 if (isset($tree['children']) && is_array($tree['children'])) {
|
danielebarchiesi@0
|
3468 $children = array();
|
danielebarchiesi@0
|
3469 uasort($tree['children'], '_webform_components_sort');
|
danielebarchiesi@0
|
3470 foreach ($tree['children'] as $cid => $component) {
|
danielebarchiesi@0
|
3471 $children[$cid] = _webform_components_tree_sort($component);
|
danielebarchiesi@0
|
3472 }
|
danielebarchiesi@0
|
3473 $tree['children'] = $children;
|
danielebarchiesi@0
|
3474 }
|
danielebarchiesi@0
|
3475 return $tree;
|
danielebarchiesi@0
|
3476 }
|
danielebarchiesi@0
|
3477
|
danielebarchiesi@0
|
3478 /**
|
danielebarchiesi@0
|
3479 * Get a list of all available component definitions.
|
danielebarchiesi@0
|
3480 */
|
danielebarchiesi@0
|
3481 function webform_components($include_disabled = FALSE, $reset = FALSE) {
|
danielebarchiesi@0
|
3482 static $components, $disabled;
|
danielebarchiesi@0
|
3483
|
danielebarchiesi@0
|
3484 if (!isset($components) || $reset) {
|
danielebarchiesi@0
|
3485 $components = array();
|
danielebarchiesi@0
|
3486 $disabled = array_flip(variable_get('webform_disabled_components', array()));
|
danielebarchiesi@0
|
3487 foreach (module_implements('webform_component_info') as $module) {
|
danielebarchiesi@0
|
3488 $module_components = module_invoke($module, 'webform_component_info');
|
danielebarchiesi@0
|
3489 foreach ($module_components as $type => $info) {
|
danielebarchiesi@0
|
3490 $module_components[$type]['module'] = $module;
|
danielebarchiesi@0
|
3491 $module_components[$type]['enabled'] = !array_key_exists($type, $disabled);
|
danielebarchiesi@0
|
3492 }
|
danielebarchiesi@0
|
3493 $components += $module_components;
|
danielebarchiesi@0
|
3494 }
|
danielebarchiesi@0
|
3495 drupal_alter('webform_component_info', $components);
|
danielebarchiesi@0
|
3496 ksort($components);
|
danielebarchiesi@0
|
3497 }
|
danielebarchiesi@0
|
3498
|
danielebarchiesi@0
|
3499 return $include_disabled ? $components : array_diff_key($components, $disabled);
|
danielebarchiesi@0
|
3500 }
|
danielebarchiesi@0
|
3501
|
danielebarchiesi@0
|
3502 /**
|
danielebarchiesi@0
|
3503 * Build a list of components suitable for use as select list options.
|
danielebarchiesi@0
|
3504 */
|
danielebarchiesi@0
|
3505 function webform_component_options($include_disabled = FALSE) {
|
danielebarchiesi@0
|
3506 $component_info = webform_components($include_disabled);
|
danielebarchiesi@0
|
3507 $options = array();
|
danielebarchiesi@0
|
3508 foreach ($component_info as $type => $info) {
|
danielebarchiesi@0
|
3509 $options[$type] = $info['label'];
|
danielebarchiesi@0
|
3510 }
|
danielebarchiesi@0
|
3511 return $options;
|
danielebarchiesi@0
|
3512 }
|
danielebarchiesi@0
|
3513
|
danielebarchiesi@0
|
3514 /**
|
danielebarchiesi@0
|
3515 * Load a component file into memory.
|
danielebarchiesi@0
|
3516 *
|
danielebarchiesi@0
|
3517 * @param $component_type
|
danielebarchiesi@0
|
3518 * The string machine name of a component.
|
danielebarchiesi@0
|
3519 */
|
danielebarchiesi@0
|
3520 function webform_component_include($component_type) {
|
danielebarchiesi@0
|
3521 static $included = array();
|
danielebarchiesi@0
|
3522
|
danielebarchiesi@0
|
3523 // No need to load components that have already been added once.
|
danielebarchiesi@0
|
3524 if (!isset($included[$component_type])) {
|
danielebarchiesi@0
|
3525 $components = webform_components(TRUE);
|
danielebarchiesi@0
|
3526 $included[$component_type] = TRUE;
|
danielebarchiesi@0
|
3527
|
danielebarchiesi@0
|
3528 if (($info = $components[$component_type]) && isset($info['file'])) {
|
danielebarchiesi@0
|
3529 $pathinfo = pathinfo($info['file']);
|
danielebarchiesi@0
|
3530 $basename = basename($pathinfo['basename'], '.' . $pathinfo['extension']);
|
danielebarchiesi@0
|
3531 $path = (!empty($pathinfo['dirname']) ? $pathinfo['dirname'] . '/' : '') . $basename;
|
danielebarchiesi@0
|
3532 module_load_include($pathinfo['extension'], $info['module'], $path);
|
danielebarchiesi@0
|
3533 }
|
danielebarchiesi@0
|
3534 }
|
danielebarchiesi@0
|
3535 }
|
danielebarchiesi@0
|
3536
|
danielebarchiesi@0
|
3537 /**
|
danielebarchiesi@0
|
3538 * Invoke a component callback.
|
danielebarchiesi@0
|
3539 *
|
danielebarchiesi@0
|
3540 * @param $type
|
danielebarchiesi@0
|
3541 * The component type as a string.
|
danielebarchiesi@0
|
3542 * @param $callback
|
danielebarchiesi@0
|
3543 * The callback to execute.
|
danielebarchiesi@0
|
3544 * @param ...
|
danielebarchiesi@0
|
3545 * Any additional parameters required by the $callback.
|
danielebarchiesi@0
|
3546 */
|
danielebarchiesi@0
|
3547 function webform_component_invoke($type, $callback) {
|
danielebarchiesi@0
|
3548 $args = func_get_args();
|
danielebarchiesi@0
|
3549 $type = array_shift($args);
|
danielebarchiesi@0
|
3550 $callback = array_shift($args);
|
danielebarchiesi@0
|
3551 $function = '_webform_' . $callback . '_' . $type;
|
danielebarchiesi@0
|
3552 webform_component_include($type);
|
danielebarchiesi@0
|
3553 if (function_exists($function)) {
|
danielebarchiesi@0
|
3554 return call_user_func_array($function, $args);
|
danielebarchiesi@0
|
3555 }
|
danielebarchiesi@0
|
3556 }
|
danielebarchiesi@0
|
3557
|
danielebarchiesi@0
|
3558 /**
|
danielebarchiesi@0
|
3559 * Check if a component implements a particular hook.
|
danielebarchiesi@0
|
3560 *
|
danielebarchiesi@0
|
3561 * @param $type
|
danielebarchiesi@0
|
3562 * The component type as a string.
|
danielebarchiesi@0
|
3563 * @param $callback
|
danielebarchiesi@0
|
3564 * The callback to check.
|
danielebarchiesi@0
|
3565 */
|
danielebarchiesi@0
|
3566 function webform_component_implements($type, $callback) {
|
danielebarchiesi@0
|
3567 $function = '_webform_' . $callback . '_' . $type;
|
danielebarchiesi@0
|
3568 webform_component_include($type);
|
danielebarchiesi@0
|
3569 return function_exists($function);
|
danielebarchiesi@0
|
3570 }
|
danielebarchiesi@0
|
3571
|
danielebarchiesi@0
|
3572 /**
|
danielebarchiesi@0
|
3573 * Disable the Drupal page cache.
|
danielebarchiesi@0
|
3574 */
|
danielebarchiesi@0
|
3575 function webform_disable_page_cache() {
|
danielebarchiesi@0
|
3576 drupal_page_is_cacheable(FALSE);
|
danielebarchiesi@0
|
3577 }
|
danielebarchiesi@0
|
3578
|
danielebarchiesi@0
|
3579 /**
|
danielebarchiesi@0
|
3580 * Set the necessary breadcrumb for the page we are on.
|
danielebarchiesi@0
|
3581 */
|
danielebarchiesi@0
|
3582 function webform_set_breadcrumb($node, $submission = NULL) {
|
danielebarchiesi@0
|
3583 $breadcrumb = drupal_get_breadcrumb();
|
danielebarchiesi@0
|
3584
|
danielebarchiesi@0
|
3585 if (isset($node)) {
|
danielebarchiesi@0
|
3586 $webform_breadcrumb = array();
|
danielebarchiesi@0
|
3587 $webform_breadcrumb[] = array_shift($breadcrumb);
|
danielebarchiesi@0
|
3588 $webform_breadcrumb[] = l($node->title, 'node/' . $node->nid);
|
danielebarchiesi@0
|
3589 if (isset($submission)) {
|
danielebarchiesi@0
|
3590 $last_link = array_shift($breadcrumb);
|
danielebarchiesi@0
|
3591 if (webform_results_access($node)) {
|
danielebarchiesi@0
|
3592 $webform_breadcrumb[] = l(t('Webform results'), 'node/' . $node->nid . '/webform-results');
|
danielebarchiesi@0
|
3593 }
|
danielebarchiesi@0
|
3594 elseif (user_access('access own webform results', $account)) {
|
danielebarchiesi@0
|
3595 $webform_breadcrumb[] = l(t('Submissions'), 'node/' . $node->nid . '/submissions');
|
danielebarchiesi@0
|
3596 }
|
danielebarchiesi@0
|
3597 if (isset($last_link)) {
|
danielebarchiesi@0
|
3598 $webform_breadcrumb[] = $last_link;
|
danielebarchiesi@0
|
3599 }
|
danielebarchiesi@0
|
3600 }
|
danielebarchiesi@0
|
3601 $breadcrumb = $webform_breadcrumb;
|
danielebarchiesi@0
|
3602 }
|
danielebarchiesi@0
|
3603
|
danielebarchiesi@0
|
3604 drupal_set_breadcrumb($breadcrumb);
|
danielebarchiesi@0
|
3605 }
|
danielebarchiesi@0
|
3606
|
danielebarchiesi@0
|
3607 /**
|
danielebarchiesi@0
|
3608 * Convert an ISO 8601 date or time into an array.
|
danielebarchiesi@0
|
3609 *
|
danielebarchiesi@0
|
3610 * This converts full format dates or times. Either a date or time may be
|
danielebarchiesi@0
|
3611 * provided, in which case only those portions will be returned. Dashes and
|
danielebarchiesi@0
|
3612 * colons must be used, never implied.
|
danielebarchiesi@0
|
3613 *
|
danielebarchiesi@0
|
3614 * Formats:
|
danielebarchiesi@0
|
3615 * Dates: YYYY-MM-DD
|
danielebarchiesi@0
|
3616 * Times: HH:MM:SS
|
danielebarchiesi@0
|
3617 * Datetimes: YYYY-MM-DDTHH:MM:SS
|
danielebarchiesi@0
|
3618 *
|
danielebarchiesi@0
|
3619 * @param $string
|
danielebarchiesi@0
|
3620 * An ISO 8601 date, time, or datetime.
|
danielebarchiesi@0
|
3621 * @param $type
|
danielebarchiesi@0
|
3622 * If wanting only specific fields back, specify either "date" or "time".
|
danielebarchiesi@0
|
3623 * Leaving empty will return an array with both date and time keys, even if
|
danielebarchiesi@0
|
3624 * some are empty. Returns an array with the following keys:
|
danielebarchiesi@0
|
3625 * - year
|
danielebarchiesi@0
|
3626 * - month
|
danielebarchiesi@0
|
3627 * - day
|
danielebarchiesi@0
|
3628 * - hour (in 24hr notation)
|
danielebarchiesi@0
|
3629 * - minute
|
danielebarchiesi@0
|
3630 * - second
|
danielebarchiesi@0
|
3631 */
|
danielebarchiesi@0
|
3632 function webform_date_array($string, $type = NULL) {
|
danielebarchiesi@0
|
3633 $pattern = '/((\d{4}?)-(\d{2}?)-(\d{2}?))?(T?(\d{2}?):(\d{2}?):(\d{2}?))?/';
|
danielebarchiesi@0
|
3634 $matches = array();
|
danielebarchiesi@0
|
3635 preg_match($pattern, $string, $matches);
|
danielebarchiesi@0
|
3636 $matches += array_fill(0, 9, '');
|
danielebarchiesi@0
|
3637
|
danielebarchiesi@0
|
3638 $return = array();
|
danielebarchiesi@0
|
3639
|
danielebarchiesi@0
|
3640 // Check for a date string.
|
danielebarchiesi@0
|
3641 if ($type == 'date' || !isset($type)) {
|
danielebarchiesi@0
|
3642 $return['year'] = $matches[2] !== '' ? (int) $matches[2] : '';
|
danielebarchiesi@0
|
3643 $return['month'] = $matches[3] !== '' ? (int) $matches[3] : '';
|
danielebarchiesi@0
|
3644 $return['day'] = $matches[4] !== '' ? (int) $matches[4] : '';
|
danielebarchiesi@0
|
3645 }
|
danielebarchiesi@0
|
3646
|
danielebarchiesi@0
|
3647 // Check for a time string.
|
danielebarchiesi@0
|
3648 if ($type == 'time' || !isset($type)) {
|
danielebarchiesi@0
|
3649 $return['hour'] = $matches[6] !== '' ? (int) $matches[6] : '';
|
danielebarchiesi@0
|
3650 $return['minute'] = $matches[7] !== '' ? (int) $matches[7] : '';
|
danielebarchiesi@0
|
3651 $return['second'] = $matches[8] !== '' ? (int) $matches[8] : '';
|
danielebarchiesi@0
|
3652 }
|
danielebarchiesi@0
|
3653
|
danielebarchiesi@0
|
3654 return $return;
|
danielebarchiesi@0
|
3655 }
|
danielebarchiesi@0
|
3656
|
danielebarchiesi@0
|
3657 /**
|
danielebarchiesi@0
|
3658 * Convert an array of a date or time into an ISO 8601 compatible string.
|
danielebarchiesi@0
|
3659 *
|
danielebarchiesi@0
|
3660 * @param $array
|
danielebarchiesi@0
|
3661 * The array to convert to a date or time string.
|
danielebarchiesi@0
|
3662 * @param $type
|
danielebarchiesi@0
|
3663 * If wanting a specific string format back specify either "date" or "time".
|
danielebarchiesi@0
|
3664 * Otherwise a full ISO 8601 date and time string will be returned.
|
danielebarchiesi@0
|
3665 */
|
danielebarchiesi@0
|
3666 function webform_date_string($array, $type = NULL) {
|
danielebarchiesi@0
|
3667 $string = '';
|
danielebarchiesi@0
|
3668
|
danielebarchiesi@0
|
3669 if ($type == 'date' || !isset($type)) {
|
danielebarchiesi@0
|
3670 $string .= empty($array['year']) ? '0000' : sprintf('%04d', $array['year']);
|
danielebarchiesi@0
|
3671 $string .= '-';
|
danielebarchiesi@0
|
3672 $string .= empty($array['month']) ? '00' : sprintf('%02d', $array['month']);
|
danielebarchiesi@0
|
3673 $string .= '-';
|
danielebarchiesi@0
|
3674 $string .= empty($array['day']) ? '00' : sprintf('%02d', $array['day']);
|
danielebarchiesi@0
|
3675 }
|
danielebarchiesi@0
|
3676
|
danielebarchiesi@0
|
3677 if (!isset($type)) {
|
danielebarchiesi@0
|
3678 $string .= 'T';
|
danielebarchiesi@0
|
3679 }
|
danielebarchiesi@0
|
3680
|
danielebarchiesi@0
|
3681 if ($type == 'time' || !isset($type)) {
|
danielebarchiesi@0
|
3682 $string .= empty($array['hour']) ? '00' : sprintf('%02d', $array['hour']);
|
danielebarchiesi@0
|
3683 $string .= ':';
|
danielebarchiesi@0
|
3684 $string .= empty($array['minute']) ? '00' : sprintf('%02d', $array['minute']);
|
danielebarchiesi@0
|
3685 $string .= ':';
|
danielebarchiesi@0
|
3686 $string .= empty($array['second']) ? '00' : sprintf('%02d', $array['second']);
|
danielebarchiesi@0
|
3687 }
|
danielebarchiesi@0
|
3688
|
danielebarchiesi@0
|
3689 return $string;
|
danielebarchiesi@0
|
3690 }
|
danielebarchiesi@0
|
3691
|
danielebarchiesi@0
|
3692 /**
|
danielebarchiesi@0
|
3693 * Get a date format according to the site settings.
|
danielebarchiesi@0
|
3694 *
|
danielebarchiesi@0
|
3695 * @param $size
|
danielebarchiesi@0
|
3696 * A choice of 'short', 'medium', or 'long' date formats.
|
danielebarchiesi@0
|
3697 */
|
danielebarchiesi@0
|
3698 function webform_date_format($size = 'medium') {
|
danielebarchiesi@0
|
3699 // Format date according to site's given format.
|
danielebarchiesi@0
|
3700 $format = variable_get('date_format_' . $size, 'D, m/d/Y - H:i');
|
danielebarchiesi@0
|
3701 $time = 'aABgGhHisueIOPTZ';
|
danielebarchiesi@0
|
3702 $day_of_week = 'Dlw';
|
danielebarchiesi@0
|
3703 $special = ',-: ';
|
danielebarchiesi@0
|
3704 $date_format = trim($format, $time . $day_of_week . $special);
|
danielebarchiesi@0
|
3705
|
danielebarchiesi@0
|
3706 // Ensure that a day, month, and year value are present. Use a default
|
danielebarchiesi@0
|
3707 // format if all the values are not found.
|
danielebarchiesi@0
|
3708 if (!preg_match('/[dj]/', $date_format) || !preg_match('/[FmMn]/', $date_format) || !preg_match('/[oYy]/', $date_format)) {
|
danielebarchiesi@0
|
3709 $date_format = 'm/d/Y';
|
danielebarchiesi@0
|
3710 }
|
danielebarchiesi@0
|
3711
|
danielebarchiesi@0
|
3712 return $date_format;
|
danielebarchiesi@0
|
3713 }
|
danielebarchiesi@0
|
3714
|
danielebarchiesi@0
|
3715 /**
|
danielebarchiesi@0
|
3716 * Return a date in the desired format taking into consideration user timezones.
|
danielebarchiesi@0
|
3717 */
|
danielebarchiesi@0
|
3718 function webform_strtodate($format, $string, $timezone_name = NULL) {
|
danielebarchiesi@0
|
3719 global $user;
|
danielebarchiesi@0
|
3720
|
danielebarchiesi@0
|
3721 // Adjust the time based on the user or site timezone.
|
danielebarchiesi@0
|
3722 if (variable_get('configurable_timezones', 1) && $timezone_name == 'user' && $user->uid) {
|
danielebarchiesi@0
|
3723 $timezone_name = isset($GLOBALS['user']->timezone) ? $GLOBALS['user']->timezone : 'UTC';
|
danielebarchiesi@0
|
3724 }
|
danielebarchiesi@0
|
3725 // If the timezone is still empty or not set, use the site timezone.
|
danielebarchiesi@0
|
3726 if (empty($timezone_name) || $timezone_name == 'user') {
|
danielebarchiesi@0
|
3727 $timezone_name = variable_get('date_default_timezone', 'UTC');
|
danielebarchiesi@0
|
3728 }
|
danielebarchiesi@0
|
3729
|
danielebarchiesi@0
|
3730 if (!empty($timezone_name) && class_exists('DateTimeZone')) {
|
danielebarchiesi@0
|
3731 // Suppress errors if encountered during string conversion. Exceptions are
|
danielebarchiesi@0
|
3732 // only supported for DateTime in PHP 5.3 and higher.
|
danielebarchiesi@0
|
3733 try {
|
danielebarchiesi@0
|
3734 @$timezone = new DateTimeZone($timezone_name);
|
danielebarchiesi@0
|
3735 @$datetime = new DateTime($string, $timezone);
|
danielebarchiesi@0
|
3736 return @$datetime->format($format);
|
danielebarchiesi@0
|
3737 }
|
danielebarchiesi@0
|
3738 catch (Exception $e) {
|
danielebarchiesi@0
|
3739 return '';
|
danielebarchiesi@0
|
3740 }
|
danielebarchiesi@0
|
3741 }
|
danielebarchiesi@0
|
3742 else {
|
danielebarchiesi@0
|
3743 return date($format, strtotime($string));
|
danielebarchiesi@0
|
3744 }
|
danielebarchiesi@0
|
3745 }
|
danielebarchiesi@0
|
3746
|
danielebarchiesi@0
|
3747 /**
|
danielebarchiesi@0
|
3748 * Get a timestamp in GMT time, ensuring timezone accuracy.
|
danielebarchiesi@0
|
3749 */
|
danielebarchiesi@0
|
3750 function webform_strtotime($date) {
|
danielebarchiesi@0
|
3751 $current_tz = date_default_timezone_get();
|
danielebarchiesi@0
|
3752 date_default_timezone_set('UTC');
|
danielebarchiesi@0
|
3753 $timestamp = strtotime($date);
|
danielebarchiesi@0
|
3754 date_default_timezone_set($current_tz);
|
danielebarchiesi@0
|
3755 return $timestamp;
|
danielebarchiesi@0
|
3756 }
|
danielebarchiesi@0
|
3757
|
danielebarchiesi@0
|
3758 /**
|
danielebarchiesi@0
|
3759 * Wrapper function for i18n_string() if i18nstrings enabled.
|
danielebarchiesi@0
|
3760 */
|
danielebarchiesi@0
|
3761 function webform_tt($name, $string, $langcode = NULL, $update = FALSE) {
|
danielebarchiesi@0
|
3762 if (function_exists('i18n_string')) {
|
danielebarchiesi@0
|
3763 $options = array(
|
danielebarchiesi@0
|
3764 'langcode' => $langcode,
|
danielebarchiesi@0
|
3765 'update' => $update,
|
danielebarchiesi@0
|
3766 );
|
danielebarchiesi@0
|
3767 return i18n_string($name, $string, $options);
|
danielebarchiesi@0
|
3768 }
|
danielebarchiesi@0
|
3769 else {
|
danielebarchiesi@0
|
3770 return $string;
|
danielebarchiesi@0
|
3771 }
|
danielebarchiesi@0
|
3772 }
|
danielebarchiesi@0
|
3773
|
danielebarchiesi@0
|
3774 /**
|
danielebarchiesi@0
|
3775 * Check if any available HTML mail handlers are available for Webform to use.
|
danielebarchiesi@0
|
3776 */
|
danielebarchiesi@0
|
3777 function webform_email_html_capable() {
|
danielebarchiesi@0
|
3778 // TODO: Right now we only support MIME Mail. Support others if available
|
danielebarchiesi@0
|
3779 // through a hook?
|
danielebarchiesi@0
|
3780 if (module_exists('mimemail')) {
|
danielebarchiesi@0
|
3781 $mail_systems = variable_get('mail_system', array('default-system' => 'DefaultMailSystem'));
|
danielebarchiesi@0
|
3782 $enable = !isset($mail_systems['webform']) || $mail_systems['webform'] == 'MimeMailSystem';
|
danielebarchiesi@0
|
3783
|
danielebarchiesi@0
|
3784 // We assume that if a solution exists even if it's not specified we should
|
danielebarchiesi@0
|
3785 // use it. Webform will specify if e-mails sent with the system are plain-
|
danielebarchiesi@0
|
3786 // text or not when sending each e-mail.
|
danielebarchiesi@0
|
3787 if ($enable) {
|
danielebarchiesi@0
|
3788 $GLOBALS['conf']['mail_system']['webform'] = 'MimeMailSystem';
|
danielebarchiesi@0
|
3789 return TRUE;
|
danielebarchiesi@0
|
3790 }
|
danielebarchiesi@0
|
3791 }
|
danielebarchiesi@0
|
3792 else {
|
danielebarchiesi@0
|
3793 return FALSE;
|
danielebarchiesi@0
|
3794 }
|
danielebarchiesi@0
|
3795 }
|
danielebarchiesi@0
|
3796
|
danielebarchiesi@0
|
3797 /**
|
danielebarchiesi@0
|
3798 * Implements hook_views_api().
|
danielebarchiesi@0
|
3799 */
|
danielebarchiesi@0
|
3800 function webform_views_api() {
|
danielebarchiesi@0
|
3801 return array(
|
danielebarchiesi@0
|
3802 'api' => 2.0,
|
danielebarchiesi@0
|
3803 'path' => drupal_get_path('module', 'webform') . '/views',
|
danielebarchiesi@0
|
3804 );
|
danielebarchiesi@0
|
3805 }
|
danielebarchiesi@0
|
3806
|
danielebarchiesi@0
|
3807 /**
|
danielebarchiesi@0
|
3808 * Implements hook_field_extra_fields().
|
danielebarchiesi@0
|
3809 */
|
danielebarchiesi@0
|
3810 function webform_field_extra_fields() {
|
danielebarchiesi@0
|
3811 $extra = array();
|
danielebarchiesi@0
|
3812 foreach (webform_variable_get('webform_node_types') as $type) {
|
danielebarchiesi@0
|
3813 $extra['node'][$type]['display']['webform'] = array(
|
danielebarchiesi@0
|
3814 'label' => t('Webform'),
|
danielebarchiesi@0
|
3815 'description' => t('Webform client form.'),
|
danielebarchiesi@0
|
3816 'weight' => 10,
|
danielebarchiesi@0
|
3817 );
|
danielebarchiesi@0
|
3818 }
|
danielebarchiesi@0
|
3819 return $extra;
|
danielebarchiesi@0
|
3820 }
|
danielebarchiesi@0
|
3821
|
danielebarchiesi@0
|
3822 /**
|
danielebarchiesi@0
|
3823 * Implements hook_mollom_form_list().
|
danielebarchiesi@0
|
3824 */
|
danielebarchiesi@0
|
3825 function webform_mollom_form_list() {
|
danielebarchiesi@0
|
3826 $forms = array();
|
danielebarchiesi@0
|
3827 $webform_types = webform_variable_get('webform_node_types');
|
danielebarchiesi@0
|
3828 if (empty($webform_types)) {
|
danielebarchiesi@0
|
3829 return $forms;
|
danielebarchiesi@0
|
3830 }
|
danielebarchiesi@0
|
3831
|
danielebarchiesi@0
|
3832 $result = db_select('node', 'n')
|
danielebarchiesi@0
|
3833 ->fields('n', array('nid', 'title'))
|
danielebarchiesi@0
|
3834 ->condition('n.type', $webform_types, 'IN')
|
danielebarchiesi@0
|
3835 ->execute();
|
danielebarchiesi@0
|
3836
|
danielebarchiesi@0
|
3837 foreach ($result as $node) {
|
danielebarchiesi@0
|
3838 $form_id = 'webform_client_form_' . $node->nid;
|
danielebarchiesi@0
|
3839 $forms[$form_id] = array(
|
danielebarchiesi@0
|
3840 'title' => t('@name form', array('@name' => $node->title)),
|
danielebarchiesi@0
|
3841 'entity' => 'webform',
|
danielebarchiesi@0
|
3842 'delete form' => 'webform_submission_delete_form',
|
danielebarchiesi@0
|
3843 );
|
danielebarchiesi@0
|
3844 }
|
danielebarchiesi@0
|
3845 return $forms;
|
danielebarchiesi@0
|
3846 }
|
danielebarchiesi@0
|
3847
|
danielebarchiesi@0
|
3848 /**
|
danielebarchiesi@0
|
3849 * Implements hook_mollom_form_info().
|
danielebarchiesi@0
|
3850 */
|
danielebarchiesi@0
|
3851 function webform_mollom_form_info($form_id) {
|
danielebarchiesi@0
|
3852 module_load_include('inc', 'webform', 'includes/webform.components');
|
danielebarchiesi@0
|
3853
|
danielebarchiesi@0
|
3854 $nid = drupal_substr($form_id, 20);
|
danielebarchiesi@0
|
3855 $node = node_load($nid);
|
danielebarchiesi@0
|
3856 $form_info = array(
|
danielebarchiesi@0
|
3857 'title' => t('@name form', array('@name' => $node->title)),
|
danielebarchiesi@0
|
3858 'mode' => MOLLOM_MODE_ANALYSIS,
|
danielebarchiesi@0
|
3859 'bypass access' => array('edit all webform submissions', 'edit any webform content'),
|
danielebarchiesi@0
|
3860 'entity' => 'webform',
|
danielebarchiesi@0
|
3861 'elements' => array(),
|
danielebarchiesi@0
|
3862 'mapping' => array(
|
danielebarchiesi@0
|
3863 'post_id' => 'details][sid',
|
danielebarchiesi@0
|
3864 'author_id' => 'details][uid',
|
danielebarchiesi@0
|
3865 ),
|
danielebarchiesi@0
|
3866 );
|
danielebarchiesi@0
|
3867 // Add components as elements.
|
danielebarchiesi@0
|
3868 // These components can be enabled for textual analysis (when not using a
|
danielebarchiesi@0
|
3869 // CAPTCHA-only protection) in Mollom's form configuration.
|
danielebarchiesi@0
|
3870 foreach ($node->webform['components'] as $cid => $component) {
|
danielebarchiesi@0
|
3871 if (webform_component_feature($component['type'], 'spam_analysis')) {
|
danielebarchiesi@0
|
3872 $parents = implode('][', webform_component_parent_keys($node, $component));
|
danielebarchiesi@0
|
3873 $form_info['elements']['submitted][' . $parents] = check_plain(t($component['name']));
|
danielebarchiesi@0
|
3874 }
|
danielebarchiesi@0
|
3875 }
|
danielebarchiesi@0
|
3876 // Assign field mappings based on webform configuration.
|
danielebarchiesi@0
|
3877 // Since multiple emails can be configured, we iterate over all and take
|
danielebarchiesi@0
|
3878 // over the assigned component for the field mapping in any email, unless
|
danielebarchiesi@0
|
3879 // we already assigned one. We are not interested in administratively
|
danielebarchiesi@0
|
3880 // configured static strings, only user-submitted values.
|
danielebarchiesi@0
|
3881 foreach ($node->webform['emails'] as $email) {
|
danielebarchiesi@0
|
3882 // Subject (post_title).
|
danielebarchiesi@0
|
3883 if (!isset($form_info['mapping']['post_title'])) {
|
danielebarchiesi@0
|
3884 $cid = $email['subject'];
|
danielebarchiesi@0
|
3885 if (is_numeric($cid)) {
|
danielebarchiesi@0
|
3886 $parents = implode('][', webform_component_parent_keys($node, $node->webform['components'][$cid]));
|
danielebarchiesi@0
|
3887 $form_info['mapping']['post_title'] = 'submitted][' . $parents;
|
danielebarchiesi@0
|
3888 }
|
danielebarchiesi@0
|
3889 }
|
danielebarchiesi@0
|
3890 // From name (author_name).
|
danielebarchiesi@0
|
3891 if (!isset($form_info['mapping']['author_name'])) {
|
danielebarchiesi@0
|
3892 $cid = $email['from_name'];
|
danielebarchiesi@0
|
3893 if (is_numeric($cid)) {
|
danielebarchiesi@0
|
3894 $parents = implode('][', webform_component_parent_keys($node, $node->webform['components'][$cid]));
|
danielebarchiesi@0
|
3895 $form_info['mapping']['author_name'] = 'submitted][' . $parents;
|
danielebarchiesi@0
|
3896 }
|
danielebarchiesi@0
|
3897 }
|
danielebarchiesi@0
|
3898 // From address (author_mail).
|
danielebarchiesi@0
|
3899 if (!isset($form_info['mapping']['author_mail'])) {
|
danielebarchiesi@0
|
3900 $cid = $email['from_address'];
|
danielebarchiesi@0
|
3901 if (is_numeric($cid)) {
|
danielebarchiesi@0
|
3902 $parents = implode('][', webform_component_parent_keys($node, $node->webform['components'][$cid]));
|
danielebarchiesi@0
|
3903 $form_info['mapping']['author_mail'] = 'submitted][' . $parents;
|
danielebarchiesi@0
|
3904 }
|
danielebarchiesi@0
|
3905 }
|
danielebarchiesi@0
|
3906 }
|
danielebarchiesi@0
|
3907
|
danielebarchiesi@0
|
3908 return $form_info;
|
danielebarchiesi@0
|
3909 }
|