danielebarchiesi@0
|
1 <?php
|
danielebarchiesi@0
|
2
|
danielebarchiesi@0
|
3 /**
|
danielebarchiesi@0
|
4 * @file
|
danielebarchiesi@0
|
5 * Sample hooks demonstrating usage in Webform.
|
danielebarchiesi@0
|
6 */
|
danielebarchiesi@0
|
7
|
danielebarchiesi@0
|
8 /**
|
danielebarchiesi@0
|
9 * @defgroup webform_hooks Webform Module Hooks
|
danielebarchiesi@0
|
10 * @{
|
danielebarchiesi@0
|
11 * Webform's hooks enable other modules to intercept events within Webform, such
|
danielebarchiesi@0
|
12 * as the completion of a submission or adding validation. Webform's hooks also
|
danielebarchiesi@0
|
13 * allow other modules to provide additional components for use within forms.
|
danielebarchiesi@0
|
14 */
|
danielebarchiesi@0
|
15
|
danielebarchiesi@0
|
16 /**
|
danielebarchiesi@0
|
17 * Define callbacks that can be used as select list options.
|
danielebarchiesi@0
|
18 *
|
danielebarchiesi@0
|
19 * When users create a select component, they may select a pre-built list of
|
danielebarchiesi@0
|
20 * certain options. Webform core provides a few of these lists such as the
|
danielebarchiesi@0
|
21 * United States, countries of the world, and days of the week. This hook
|
danielebarchiesi@0
|
22 * provides additional lists that may be utilized.
|
danielebarchiesi@0
|
23 *
|
danielebarchiesi@0
|
24 * @see webform_options_example()
|
danielebarchiesi@0
|
25 * @see hook_webform_select_options_info_alter()
|
danielebarchiesi@0
|
26 *
|
danielebarchiesi@0
|
27 * @return
|
danielebarchiesi@0
|
28 * An array of callbacks that can be used for select list options. This array
|
danielebarchiesi@0
|
29 * should be keyed by the "name" of the pre-defined list. The values should
|
danielebarchiesi@0
|
30 * be an array with the following additional keys:
|
danielebarchiesi@0
|
31 * - title: The translated title for this list.
|
danielebarchiesi@0
|
32 * - options callback: The name of the function that will return the list.
|
danielebarchiesi@0
|
33 * - options arguments: Any additional arguments to send to the callback.
|
danielebarchiesi@0
|
34 * - file: Optional. The file containing the options callback, relative to
|
danielebarchiesi@0
|
35 * the module root.
|
danielebarchiesi@0
|
36 */
|
danielebarchiesi@0
|
37 function hook_webform_select_options_info() {
|
danielebarchiesi@0
|
38 $items = array();
|
danielebarchiesi@0
|
39
|
danielebarchiesi@0
|
40 $items['days'] = array(
|
danielebarchiesi@0
|
41 'title' => t('Days of the week'),
|
danielebarchiesi@0
|
42 'options callback' => 'webform_options_days',
|
danielebarchiesi@0
|
43 'file' => 'includes/webform.options.inc',
|
danielebarchiesi@0
|
44 );
|
danielebarchiesi@0
|
45
|
danielebarchiesi@0
|
46 return $items;
|
danielebarchiesi@0
|
47 }
|
danielebarchiesi@0
|
48
|
danielebarchiesi@0
|
49 /**
|
danielebarchiesi@0
|
50 * Alter the list of select list options provided by Webform and other modules.
|
danielebarchiesi@0
|
51 *
|
danielebarchiesi@0
|
52 * @see hook_webform_select_options_info().
|
danielebarchiesi@0
|
53 */
|
danielebarchiesi@0
|
54 function hook_webform_select_options_info_alter(&$items) {
|
danielebarchiesi@0
|
55 // Remove the days of the week options.
|
danielebarchiesi@0
|
56 unset($items['days']);
|
danielebarchiesi@0
|
57 }
|
danielebarchiesi@0
|
58
|
danielebarchiesi@0
|
59 /**
|
danielebarchiesi@0
|
60 * This is an example function to demonstrate a webform options callback.
|
danielebarchiesi@0
|
61 *
|
danielebarchiesi@0
|
62 * This function returns a list of options that Webform may use in a select
|
danielebarchiesi@0
|
63 * component. In order to be called, the function name
|
danielebarchiesi@0
|
64 * ("webform_options_example" in this case), needs to be specified as a callback
|
danielebarchiesi@0
|
65 * in hook_webform_select_options_info().
|
danielebarchiesi@0
|
66 *
|
danielebarchiesi@0
|
67 * @param $component
|
danielebarchiesi@0
|
68 * The Webform component array for the select component being displayed.
|
danielebarchiesi@0
|
69 * @param $flat
|
danielebarchiesi@0
|
70 * Boolean value indicating whether the returned list needs to be a flat array
|
danielebarchiesi@0
|
71 * of key => value pairs. Select components support up to one level of
|
danielebarchiesi@0
|
72 * nesting, but when results are displayed, the list needs to be returned
|
danielebarchiesi@0
|
73 * without the nesting.
|
danielebarchiesi@0
|
74 * @param $filter
|
danielebarchiesi@0
|
75 * Boolean value indicating whether the included options should be passed
|
danielebarchiesi@0
|
76 * through the _webform_filter_values() function for token replacement (only)
|
danielebarchiesi@0
|
77 * needed if your list contains tokens).
|
danielebarchiesi@0
|
78 * @param $arguments
|
danielebarchiesi@0
|
79 * The "options arguments" specified in hook_webform_select_options_info().
|
danielebarchiesi@0
|
80 * @return
|
danielebarchiesi@0
|
81 * An array of key => value pairs suitable for a select list's #options
|
danielebarchiesi@0
|
82 * FormAPI property.
|
danielebarchiesi@0
|
83 */
|
danielebarchiesi@0
|
84 function webform_options_example($component, $flat, $filter, $arguments) {
|
danielebarchiesi@0
|
85 $options = array(
|
danielebarchiesi@0
|
86 'one' => t('Pre-built option one'),
|
danielebarchiesi@0
|
87 'two' => t('Pre-built option two'),
|
danielebarchiesi@0
|
88 'three' => t('Pre-built option three'),
|
danielebarchiesi@0
|
89 );
|
danielebarchiesi@0
|
90
|
danielebarchiesi@0
|
91 return $options;
|
danielebarchiesi@0
|
92 }
|
danielebarchiesi@0
|
93
|
danielebarchiesi@0
|
94 /**
|
danielebarchiesi@0
|
95 * Respond to the loading of Webform submissions.
|
danielebarchiesi@0
|
96 *
|
danielebarchiesi@0
|
97 * @param $submissions
|
danielebarchiesi@0
|
98 * An array of Webform submissions that are being loaded, keyed by the
|
danielebarchiesi@0
|
99 * submission ID. Modifications to the submissions are done by reference.
|
danielebarchiesi@0
|
100 */
|
danielebarchiesi@0
|
101 function hook_webform_submission_load(&$submissions) {
|
danielebarchiesi@0
|
102 foreach ($submissions as $sid => $submission) {
|
danielebarchiesi@0
|
103 $submissions[$sid]->new_property = 'foo';
|
danielebarchiesi@0
|
104 }
|
danielebarchiesi@0
|
105 }
|
danielebarchiesi@0
|
106
|
danielebarchiesi@0
|
107 /**
|
danielebarchiesi@0
|
108 * Modify a Webform submission, prior to saving it in the database.
|
danielebarchiesi@0
|
109 *
|
danielebarchiesi@0
|
110 * @param $node
|
danielebarchiesi@0
|
111 * The Webform node on which this submission was made.
|
danielebarchiesi@0
|
112 * @param $submission
|
danielebarchiesi@0
|
113 * The Webform submission that is about to be saved to the database.
|
danielebarchiesi@0
|
114 */
|
danielebarchiesi@0
|
115 function hook_webform_submission_presave($node, &$submission) {
|
danielebarchiesi@0
|
116 // Update some component's value before it is saved.
|
danielebarchiesi@0
|
117 $component_id = 4;
|
danielebarchiesi@0
|
118 $submission->data[$component_id]['value'][0] = 'foo';
|
danielebarchiesi@0
|
119 }
|
danielebarchiesi@0
|
120
|
danielebarchiesi@0
|
121 /**
|
danielebarchiesi@0
|
122 * Respond to a Webform submission being inserted.
|
danielebarchiesi@0
|
123 *
|
danielebarchiesi@0
|
124 * Note that this hook is called after a submission has already been saved to
|
danielebarchiesi@0
|
125 * the database. If needing to modify the submission prior to insertion, use
|
danielebarchiesi@0
|
126 * hook_webform_submission_presave().
|
danielebarchiesi@0
|
127 *
|
danielebarchiesi@0
|
128 * @param $node
|
danielebarchiesi@0
|
129 * The Webform node on which this submission was made.
|
danielebarchiesi@0
|
130 * @param $submission
|
danielebarchiesi@0
|
131 * The Webform submission that was just inserted into the database.
|
danielebarchiesi@0
|
132 */
|
danielebarchiesi@0
|
133 function hook_webform_submission_insert($node, $submission) {
|
danielebarchiesi@0
|
134 // Insert a record into a 3rd-party module table when a submission is added.
|
danielebarchiesi@0
|
135 db_insert('mymodule_table')
|
danielebarchiesi@0
|
136 ->fields(array(
|
danielebarchiesi@0
|
137 'nid' => $node->nid,
|
danielebarchiesi@0
|
138 'sid' => $submission->sid,
|
danielebarchiesi@0
|
139 'foo' => 'foo_data',
|
danielebarchiesi@0
|
140 ))
|
danielebarchiesi@0
|
141 ->execute();
|
danielebarchiesi@0
|
142 }
|
danielebarchiesi@0
|
143
|
danielebarchiesi@0
|
144 /**
|
danielebarchiesi@0
|
145 * Respond to a Webform submission being updated.
|
danielebarchiesi@0
|
146 *
|
danielebarchiesi@0
|
147 * Note that this hook is called after a submission has already been saved to
|
danielebarchiesi@0
|
148 * the database. If needing to modify the submission prior to updating, use
|
danielebarchiesi@0
|
149 * hook_webform_submission_presave().
|
danielebarchiesi@0
|
150 *
|
danielebarchiesi@0
|
151 * @param $node
|
danielebarchiesi@0
|
152 * The Webform node on which this submission was made.
|
danielebarchiesi@0
|
153 * @param $submission
|
danielebarchiesi@0
|
154 * The Webform submission that was just updated in the database.
|
danielebarchiesi@0
|
155 */
|
danielebarchiesi@0
|
156 function hook_webform_submission_update($node, $submission) {
|
danielebarchiesi@0
|
157 // Update a record in a 3rd-party module table when a submission is updated.
|
danielebarchiesi@0
|
158 db_update('mymodule_table')
|
danielebarchiesi@0
|
159 ->fields(array(
|
danielebarchiesi@0
|
160 'foo' => 'foo_data',
|
danielebarchiesi@0
|
161 ))
|
danielebarchiesi@0
|
162 ->condition('nid', $node->nid)
|
danielebarchiesi@0
|
163 ->condition('sid', $submission->sid)
|
danielebarchiesi@0
|
164 ->execute();
|
danielebarchiesi@0
|
165 }
|
danielebarchiesi@0
|
166
|
danielebarchiesi@0
|
167 /**
|
danielebarchiesi@0
|
168 * Respond to a Webform submission being deleted.
|
danielebarchiesi@0
|
169 *
|
danielebarchiesi@0
|
170 * @param $node
|
danielebarchiesi@0
|
171 * The Webform node on which this submission was made.
|
danielebarchiesi@0
|
172 * @param $submission
|
danielebarchiesi@0
|
173 * The Webform submission that was just deleted from the database.
|
danielebarchiesi@0
|
174 */
|
danielebarchiesi@0
|
175 function hook_webform_submission_delete($node, $submission) {
|
danielebarchiesi@0
|
176 // Delete a record from a 3rd-party module table when a submission is deleted.
|
danielebarchiesi@0
|
177 db_delete('mymodule_table')
|
danielebarchiesi@0
|
178 ->condition('nid', $node->nid)
|
danielebarchiesi@0
|
179 ->condition('sid', $submission->sid)
|
danielebarchiesi@0
|
180 ->execute();
|
danielebarchiesi@0
|
181 }
|
danielebarchiesi@0
|
182
|
danielebarchiesi@0
|
183 /**
|
danielebarchiesi@0
|
184 * Provide a list of actions that can be executed on a submission.
|
danielebarchiesi@0
|
185 *
|
danielebarchiesi@0
|
186 * Some actions are displayed in the list of submissions such as edit, view, and
|
danielebarchiesi@0
|
187 * delete. All other actions are displayed only when viewing the submission.
|
danielebarchiesi@0
|
188 * These additional actions may be specified in this hook. Examples included
|
danielebarchiesi@0
|
189 * directly in the Webform module include PDF, print, and resend e-mails. Other
|
danielebarchiesi@0
|
190 * modules may extend this list by using this hook.
|
danielebarchiesi@0
|
191 *
|
danielebarchiesi@0
|
192 * @param $node
|
danielebarchiesi@0
|
193 * The Webform node on which this submission was made.
|
danielebarchiesi@0
|
194 * @param $submission
|
danielebarchiesi@0
|
195 * The Webform submission on which the actions may be performed.
|
danielebarchiesi@0
|
196 */
|
danielebarchiesi@0
|
197 function hook_webform_submission_actions($node, $submission) {
|
danielebarchiesi@0
|
198 if (webform_results_access($node)) {
|
danielebarchiesi@0
|
199 $actions['myaction'] = array(
|
danielebarchiesi@0
|
200 'title' => t('Do my action'),
|
danielebarchiesi@0
|
201 'href' => 'node/' . $node->nid . '/submission/' . $submission->sid . '/myaction',
|
danielebarchiesi@0
|
202 'query' => drupal_get_destination(),
|
danielebarchiesi@0
|
203 );
|
danielebarchiesi@0
|
204 }
|
danielebarchiesi@0
|
205
|
danielebarchiesi@0
|
206 return $actions;
|
danielebarchiesi@0
|
207 }
|
danielebarchiesi@0
|
208
|
danielebarchiesi@0
|
209 /**
|
danielebarchiesi@0
|
210 * Alter the display of a Webform submission.
|
danielebarchiesi@0
|
211 *
|
danielebarchiesi@0
|
212 * This function applies to both e-mails sent by Webform and normal display of
|
danielebarchiesi@0
|
213 * submissions when viewing through the adminsitrative interface.
|
danielebarchiesi@0
|
214 *
|
danielebarchiesi@0
|
215 * @param $renderable
|
danielebarchiesi@0
|
216 * The Webform submission in a renderable array, similar to FormAPI's
|
danielebarchiesi@0
|
217 * structure. This variable must be passed in by-reference. Important
|
danielebarchiesi@0
|
218 * properties of this array include #node, #submission, #email, and #format,
|
danielebarchiesi@0
|
219 * which can be used to find the context of the submission that is being
|
danielebarchiesi@0
|
220 * rendered.
|
danielebarchiesi@0
|
221 */
|
danielebarchiesi@0
|
222 function hook_webform_submission_render_alter(&$renderable) {
|
danielebarchiesi@0
|
223 // Remove page breaks from sent e-mails.
|
danielebarchiesi@0
|
224 if (isset($renderable['#email'])) {
|
danielebarchiesi@0
|
225 foreach (element_children($renderable) as $key) {
|
danielebarchiesi@0
|
226 if ($renderable[$key]['#component']['type'] == 'pagebreak') {
|
danielebarchiesi@0
|
227 unset($renderable[$key]);
|
danielebarchiesi@0
|
228 }
|
danielebarchiesi@0
|
229 }
|
danielebarchiesi@0
|
230 }
|
danielebarchiesi@0
|
231 }
|
danielebarchiesi@0
|
232
|
danielebarchiesi@0
|
233 /**
|
danielebarchiesi@0
|
234 * Modify a loaded Webform component.
|
danielebarchiesi@0
|
235 *
|
danielebarchiesi@0
|
236 * IMPORTANT: This hook does not actually exist because components are loaded
|
danielebarchiesi@0
|
237 * in bulk as part of webform_node_load(). Use hook_node_load() to modify loaded
|
danielebarchiesi@0
|
238 * components when the node is loaded. This example is provided merely to point
|
danielebarchiesi@0
|
239 * to hook_node_load().
|
danielebarchiesi@0
|
240 *
|
danielebarchiesi@0
|
241 * @see hook_nodeapi()
|
danielebarchiesi@0
|
242 * @see webform_node_load()
|
danielebarchiesi@0
|
243 */
|
danielebarchiesi@0
|
244 function hook_webform_component_load() {
|
danielebarchiesi@0
|
245 // This hook does not exist. Instead use hook_node_load().
|
danielebarchiesi@0
|
246 }
|
danielebarchiesi@0
|
247
|
danielebarchiesi@0
|
248 /**
|
danielebarchiesi@0
|
249 * Modify a Webform component before it is saved to the database.
|
danielebarchiesi@0
|
250 *
|
danielebarchiesi@0
|
251 * Note that most of the time this hook is not necessary, because Webform will
|
danielebarchiesi@0
|
252 * automatically add data to the component based on the component form. Using
|
danielebarchiesi@0
|
253 * hook_form_alter() will be sufficient in most cases.
|
danielebarchiesi@0
|
254 *
|
danielebarchiesi@0
|
255 * @see hook_form_alter()
|
danielebarchiesi@0
|
256 * @see webform_component_edit_form()
|
danielebarchiesi@0
|
257 *
|
danielebarchiesi@0
|
258 * @param $component
|
danielebarchiesi@0
|
259 * The Webform component being saved.
|
danielebarchiesi@0
|
260 */
|
danielebarchiesi@0
|
261 function hook_webform_component_presave(&$component) {
|
danielebarchiesi@0
|
262 $component['extra']['new_option'] = 'foo';
|
danielebarchiesi@0
|
263 }
|
danielebarchiesi@0
|
264
|
danielebarchiesi@0
|
265 /**
|
danielebarchiesi@0
|
266 * Respond to a Webform component being inserted into the database.
|
danielebarchiesi@0
|
267 */
|
danielebarchiesi@0
|
268 function hook_webform_component_insert($component) {
|
danielebarchiesi@0
|
269 // Insert a record into a 3rd-party module table when a component is inserted.
|
danielebarchiesi@0
|
270 db_insert('mymodule_table')
|
danielebarchiesi@0
|
271 ->fields(array(
|
danielebarchiesi@0
|
272 'nid' => $component['nid'],
|
danielebarchiesi@0
|
273 'cid' => $component['cid'],
|
danielebarchiesi@0
|
274 'foo' => 'foo_data',
|
danielebarchiesi@0
|
275 ))
|
danielebarchiesi@0
|
276 ->execute();
|
danielebarchiesi@0
|
277 }
|
danielebarchiesi@0
|
278
|
danielebarchiesi@0
|
279 /**
|
danielebarchiesi@0
|
280 * Respond to a Webform component being updated in the database.
|
danielebarchiesi@0
|
281 */
|
danielebarchiesi@0
|
282 function hook_webform_component_update($component) {
|
danielebarchiesi@0
|
283 // Update a record in a 3rd-party module table when a component is updated.
|
danielebarchiesi@0
|
284 db_update('mymodule_table')
|
danielebarchiesi@0
|
285 ->fields(array(
|
danielebarchiesi@0
|
286 'foo' => 'foo_data',
|
danielebarchiesi@0
|
287 ))
|
danielebarchiesi@0
|
288 ->condition('nid', $component['nid'])
|
danielebarchiesi@0
|
289 ->condition('cid', $component['cid'])
|
danielebarchiesi@0
|
290 ->execute();
|
danielebarchiesi@0
|
291 }
|
danielebarchiesi@0
|
292
|
danielebarchiesi@0
|
293 /**
|
danielebarchiesi@0
|
294 * Respond to a Webform component being deleted.
|
danielebarchiesi@0
|
295 */
|
danielebarchiesi@0
|
296 function hook_webform_component_delete($component) {
|
danielebarchiesi@0
|
297 // Delete a record in a 3rd-party module table when a component is deleted.
|
danielebarchiesi@0
|
298 db_delete('mymodule_table')
|
danielebarchiesi@0
|
299 ->condition('nid', $component['nid'])
|
danielebarchiesi@0
|
300 ->condition('cid', $component['cid'])
|
danielebarchiesi@0
|
301 ->execute();
|
danielebarchiesi@0
|
302 }
|
danielebarchiesi@0
|
303
|
danielebarchiesi@0
|
304 /**
|
danielebarchiesi@0
|
305 * Define components to Webform.
|
danielebarchiesi@0
|
306 *
|
danielebarchiesi@0
|
307 * @return
|
danielebarchiesi@0
|
308 * An array of components, keyed by machine name. Required properties are
|
danielebarchiesi@0
|
309 * "label" and "description". The "features" array defines which capabilities
|
danielebarchiesi@0
|
310 * the component has, such as being displayed in e-mails or csv downloads.
|
danielebarchiesi@0
|
311 * A component like "markup" for example would not show in these locations.
|
danielebarchiesi@0
|
312 * The possible features of a component include:
|
danielebarchiesi@0
|
313 *
|
danielebarchiesi@0
|
314 * - csv
|
danielebarchiesi@0
|
315 * - email
|
danielebarchiesi@0
|
316 * - email_address
|
danielebarchiesi@0
|
317 * - email_name
|
danielebarchiesi@0
|
318 * - required
|
danielebarchiesi@0
|
319 * - conditional
|
danielebarchiesi@0
|
320 * - spam_analysis
|
danielebarchiesi@0
|
321 * - group
|
danielebarchiesi@0
|
322 *
|
danielebarchiesi@0
|
323 * Note that most of these features do not indicate the default state, but
|
danielebarchiesi@0
|
324 * determine if the component can have this property at all. Setting
|
danielebarchiesi@0
|
325 * "required" to TRUE does not mean that a component's fields will always be
|
danielebarchiesi@0
|
326 * required, but instead give the option to the administrator to choose the
|
danielebarchiesi@0
|
327 * requiredness. See the example implementation for details on how these
|
danielebarchiesi@0
|
328 * features may be set.
|
danielebarchiesi@0
|
329 *
|
danielebarchiesi@0
|
330 * An optional "file" may be specified to be loaded when the component is
|
danielebarchiesi@0
|
331 * needed. A set of callbacks will be established based on the name of the
|
danielebarchiesi@0
|
332 * component. All components follow the pattern:
|
danielebarchiesi@0
|
333 *
|
danielebarchiesi@0
|
334 * _webform_[callback]_[component]
|
danielebarchiesi@0
|
335 *
|
danielebarchiesi@0
|
336 * Where [component] is the name of the key of the component and [callback] is
|
danielebarchiesi@0
|
337 * any of the following:
|
danielebarchiesi@0
|
338 *
|
danielebarchiesi@0
|
339 * - defaults
|
danielebarchiesi@0
|
340 * - edit
|
danielebarchiesi@0
|
341 * - render
|
danielebarchiesi@0
|
342 * - display
|
danielebarchiesi@0
|
343 * - submit
|
danielebarchiesi@0
|
344 * - delete
|
danielebarchiesi@0
|
345 * - help
|
danielebarchiesi@0
|
346 * - theme
|
danielebarchiesi@0
|
347 * - analysis
|
danielebarchiesi@0
|
348 * - table
|
danielebarchiesi@0
|
349 * - csv_headers
|
danielebarchiesi@0
|
350 * - csv_data
|
danielebarchiesi@0
|
351 *
|
danielebarchiesi@0
|
352 * See the sample component implementation for details on each one of these
|
danielebarchiesi@0
|
353 * callbacks.
|
danielebarchiesi@0
|
354 *
|
danielebarchiesi@0
|
355 * @see webform_components()
|
danielebarchiesi@0
|
356 */
|
danielebarchiesi@0
|
357 function hook_webform_component_info() {
|
danielebarchiesi@0
|
358 $components = array();
|
danielebarchiesi@0
|
359
|
danielebarchiesi@0
|
360 $components['textfield'] = array(
|
danielebarchiesi@0
|
361 'label' => t('Textfield'),
|
danielebarchiesi@0
|
362 'description' => t('Basic textfield type.'),
|
danielebarchiesi@0
|
363 'features' => array(
|
danielebarchiesi@0
|
364 // Add content to CSV downloads. Defaults to TRUE.
|
danielebarchiesi@0
|
365 'csv' => TRUE,
|
danielebarchiesi@0
|
366
|
danielebarchiesi@0
|
367 // This component supports default values. Defaults to TRUE.
|
danielebarchiesi@0
|
368 'default_value' => FALSE,
|
danielebarchiesi@0
|
369
|
danielebarchiesi@0
|
370 // This component supports a description field. Defaults to TRUE.
|
danielebarchiesi@0
|
371 'description' => FALSE,
|
danielebarchiesi@0
|
372
|
danielebarchiesi@0
|
373 // Show this component in e-mailed submissions. Defaults to TRUE.
|
danielebarchiesi@0
|
374 'email' => TRUE,
|
danielebarchiesi@0
|
375
|
danielebarchiesi@0
|
376 // Allow this component to be used as an e-mail FROM or TO address.
|
danielebarchiesi@0
|
377 // Defaults to FALSE.
|
danielebarchiesi@0
|
378 'email_address' => FALSE,
|
danielebarchiesi@0
|
379
|
danielebarchiesi@0
|
380 // Allow this component to be used as an e-mail SUBJECT or FROM name.
|
danielebarchiesi@0
|
381 // Defaults to FALSE.
|
danielebarchiesi@0
|
382 'email_name' => TRUE,
|
danielebarchiesi@0
|
383
|
danielebarchiesi@0
|
384 // This component may be toggled as required or not. Defaults to TRUE.
|
danielebarchiesi@0
|
385 'required' => TRUE,
|
danielebarchiesi@0
|
386
|
danielebarchiesi@0
|
387 // This component supports a title attribute. Defaults to TRUE.
|
danielebarchiesi@0
|
388 'title' => FALSE,
|
danielebarchiesi@0
|
389
|
danielebarchiesi@0
|
390 // This component has a title that can be toggled as displayed or not.
|
danielebarchiesi@0
|
391 'title_display' => TRUE,
|
danielebarchiesi@0
|
392
|
danielebarchiesi@0
|
393 // This component has a title that can be displayed inline.
|
danielebarchiesi@0
|
394 'title_inline' => TRUE,
|
danielebarchiesi@0
|
395
|
danielebarchiesi@0
|
396 // If this component can be used as a conditional SOURCE. All components
|
danielebarchiesi@0
|
397 // may always be displayed conditionally, regardless of this setting.
|
danielebarchiesi@0
|
398 // Defaults to TRUE.
|
danielebarchiesi@0
|
399 'conditional' => TRUE,
|
danielebarchiesi@0
|
400
|
danielebarchiesi@0
|
401 // If this component allows other components to be grouped within it
|
danielebarchiesi@0
|
402 // (like a fieldset or tabs). Defaults to FALSE.
|
danielebarchiesi@0
|
403 'group' => FALSE,
|
danielebarchiesi@0
|
404
|
danielebarchiesi@0
|
405 // If this component can be used for SPAM analysis, usually with Mollom.
|
danielebarchiesi@0
|
406 'spam_analysis' => FALSE,
|
danielebarchiesi@0
|
407
|
danielebarchiesi@0
|
408 // If this component saves a file that can be used as an e-mail
|
danielebarchiesi@0
|
409 // attachment. Defaults to FALSE.
|
danielebarchiesi@0
|
410 'attachment' => FALSE,
|
danielebarchiesi@0
|
411 ),
|
danielebarchiesi@0
|
412 'file' => 'components/textfield.inc',
|
danielebarchiesi@0
|
413 );
|
danielebarchiesi@0
|
414
|
danielebarchiesi@0
|
415 return $components;
|
danielebarchiesi@0
|
416 }
|
danielebarchiesi@0
|
417
|
danielebarchiesi@0
|
418 /**
|
danielebarchiesi@0
|
419 * Alter the list of available Webform components.
|
danielebarchiesi@0
|
420 *
|
danielebarchiesi@0
|
421 * @param $components
|
danielebarchiesi@0
|
422 * A list of existing components as defined by hook_webform_component_info().
|
danielebarchiesi@0
|
423 *
|
danielebarchiesi@0
|
424 * @see hook_webform_component_info()
|
danielebarchiesi@0
|
425 */
|
danielebarchiesi@0
|
426 function hook_webform_component_info_alter(&$components) {
|
danielebarchiesi@0
|
427 // Completely remove a component.
|
danielebarchiesi@0
|
428 unset($components['grid']);
|
danielebarchiesi@0
|
429
|
danielebarchiesi@0
|
430 // Change the name of a component.
|
danielebarchiesi@0
|
431 $components['textarea']['label'] = t('Text box');
|
danielebarchiesi@0
|
432 }
|
danielebarchiesi@0
|
433
|
danielebarchiesi@0
|
434 /**
|
danielebarchiesi@0
|
435 * Alter access to a Webform submission.
|
danielebarchiesi@0
|
436 *
|
danielebarchiesi@0
|
437 * @param $node
|
danielebarchiesi@0
|
438 * The Webform node on which this submission was made.
|
danielebarchiesi@0
|
439 * @param $submission
|
danielebarchiesi@0
|
440 * The Webform submission.
|
danielebarchiesi@0
|
441 * @param $op
|
danielebarchiesi@0
|
442 * The operation to be performed on the submission. Possible values are:
|
danielebarchiesi@0
|
443 * - "view"
|
danielebarchiesi@0
|
444 * - "edit"
|
danielebarchiesi@0
|
445 * - "delete"
|
danielebarchiesi@0
|
446 * - "list"
|
danielebarchiesi@0
|
447 * @param $account
|
danielebarchiesi@0
|
448 * A user account object.
|
danielebarchiesi@0
|
449 * @return
|
danielebarchiesi@0
|
450 * TRUE if the current user has access to submission,
|
danielebarchiesi@0
|
451 * or FALSE otherwise.
|
danielebarchiesi@0
|
452 */
|
danielebarchiesi@0
|
453 function hook_webform_submission_access($node, $submission, $op = 'view', $account = NULL) {
|
danielebarchiesi@0
|
454 switch ($op) {
|
danielebarchiesi@0
|
455 case 'view':
|
danielebarchiesi@0
|
456 return TRUE;
|
danielebarchiesi@0
|
457 break;
|
danielebarchiesi@0
|
458 case 'edit':
|
danielebarchiesi@0
|
459 return FALSE;
|
danielebarchiesi@0
|
460 break;
|
danielebarchiesi@0
|
461 case 'delete':
|
danielebarchiesi@0
|
462 return TRUE;
|
danielebarchiesi@0
|
463 break;
|
danielebarchiesi@0
|
464 case 'list':
|
danielebarchiesi@0
|
465 return TRUE;
|
danielebarchiesi@0
|
466 break;
|
danielebarchiesi@0
|
467 }
|
danielebarchiesi@0
|
468 }
|
danielebarchiesi@0
|
469
|
danielebarchiesi@0
|
470 /**
|
danielebarchiesi@0
|
471 * Determine if a user has access to see the results of a webform.
|
danielebarchiesi@0
|
472 *
|
danielebarchiesi@0
|
473 * Note in addition to the view access to the results granted here, the $account
|
danielebarchiesi@0
|
474 * must also have view access to the Webform node in order to see results.
|
danielebarchiesi@0
|
475 *
|
danielebarchiesi@0
|
476 * @see webform_results_access().
|
danielebarchiesi@0
|
477 *
|
danielebarchiesi@0
|
478 * @param $node
|
danielebarchiesi@0
|
479 * The Webform node to check access on.
|
danielebarchiesi@0
|
480 * @param $account
|
danielebarchiesi@0
|
481 * The user account to check access on.
|
danielebarchiesi@0
|
482 * @return
|
danielebarchiesi@0
|
483 * TRUE or FALSE if the user can access the webform results.
|
danielebarchiesi@0
|
484 */
|
danielebarchiesi@0
|
485 function hook_webform_results_access($node, $account) {
|
danielebarchiesi@0
|
486 // Let editors view results of unpublished webforms.
|
danielebarchiesi@0
|
487 if ($node->status == 0 && in_array('editor', $account->roles)) {
|
danielebarchiesi@0
|
488 return TRUE;
|
danielebarchiesi@0
|
489 }
|
danielebarchiesi@0
|
490 else {
|
danielebarchiesi@0
|
491 return FALSE;
|
danielebarchiesi@0
|
492 }
|
danielebarchiesi@0
|
493 }
|
danielebarchiesi@0
|
494
|
danielebarchiesi@0
|
495 /**
|
danielebarchiesi@0
|
496 * Return an array of files associated with the component.
|
danielebarchiesi@0
|
497 *
|
danielebarchiesi@0
|
498 * The output of this function will be used to attach files to e-mail messages.
|
danielebarchiesi@0
|
499 *
|
danielebarchiesi@0
|
500 * @param $component
|
danielebarchiesi@0
|
501 * A Webform component array.
|
danielebarchiesi@0
|
502 * @param $value
|
danielebarchiesi@0
|
503 * An array of information containing the submission result, directly
|
danielebarchiesi@0
|
504 * correlating to the webform_submitted_data database schema.
|
danielebarchiesi@0
|
505 * @return
|
danielebarchiesi@0
|
506 * An array of files, each file is an array with following keys:
|
danielebarchiesi@0
|
507 * - filepath: The relative path to the file.
|
danielebarchiesi@0
|
508 * - filename: The name of the file including the extension.
|
danielebarchiesi@0
|
509 * - filemime: The mimetype of the file.
|
danielebarchiesi@0
|
510 * This will result in an array looking something like this:
|
danielebarchiesi@0
|
511 * @code
|
danielebarchiesi@0
|
512 * array[0] => array(
|
danielebarchiesi@0
|
513 * 'filepath' => '/sites/default/files/attachment.txt',
|
danielebarchiesi@0
|
514 * 'filename' => 'attachment.txt',
|
danielebarchiesi@0
|
515 * 'filemime' => 'text/plain',
|
danielebarchiesi@0
|
516 * );
|
danielebarchiesi@0
|
517 * @endcode
|
danielebarchiesi@0
|
518 */
|
danielebarchiesi@0
|
519 function _webform_attachments_component($component, $value) {
|
danielebarchiesi@0
|
520 $files = array();
|
danielebarchiesi@0
|
521 $files[] = (array) file_load($value[0]);
|
danielebarchiesi@0
|
522 return $files;
|
danielebarchiesi@0
|
523 }
|
danielebarchiesi@0
|
524
|
danielebarchiesi@0
|
525 /**
|
danielebarchiesi@0
|
526 * @}
|
danielebarchiesi@0
|
527 */
|
danielebarchiesi@0
|
528
|
danielebarchiesi@0
|
529 /**
|
danielebarchiesi@0
|
530 * @defgroup webform_component Sample Webform Component
|
danielebarchiesi@0
|
531 * @{
|
danielebarchiesi@0
|
532 * In each of these examples, the word "component" should be replaced with the,
|
danielebarchiesi@0
|
533 * name of the component type (such as textfield or select). These are not
|
danielebarchiesi@0
|
534 * actual hooks, but instead samples of how Webform integrates with its own
|
danielebarchiesi@0
|
535 * built-in components.
|
danielebarchiesi@0
|
536 */
|
danielebarchiesi@0
|
537
|
danielebarchiesi@0
|
538 /**
|
danielebarchiesi@0
|
539 * Specify the default properties of a component.
|
danielebarchiesi@0
|
540 *
|
danielebarchiesi@0
|
541 * @return
|
danielebarchiesi@0
|
542 * An array defining the default structure of a component.
|
danielebarchiesi@0
|
543 */
|
danielebarchiesi@0
|
544 function _webform_defaults_component() {
|
danielebarchiesi@0
|
545 return array(
|
danielebarchiesi@0
|
546 'name' => '',
|
danielebarchiesi@0
|
547 'form_key' => NULL,
|
danielebarchiesi@0
|
548 'mandatory' => 0,
|
danielebarchiesi@0
|
549 'pid' => 0,
|
danielebarchiesi@0
|
550 'weight' => 0,
|
danielebarchiesi@0
|
551 'extra' => array(
|
danielebarchiesi@0
|
552 'options' => '',
|
danielebarchiesi@0
|
553 'questions' => '',
|
danielebarchiesi@0
|
554 'optrand' => 0,
|
danielebarchiesi@0
|
555 'qrand' => 0,
|
danielebarchiesi@0
|
556 'description' => '',
|
danielebarchiesi@0
|
557 ),
|
danielebarchiesi@0
|
558 );
|
danielebarchiesi@0
|
559 }
|
danielebarchiesi@0
|
560
|
danielebarchiesi@0
|
561 /**
|
danielebarchiesi@0
|
562 * Generate the form for editing a component.
|
danielebarchiesi@0
|
563 *
|
danielebarchiesi@0
|
564 * Create a set of form elements to be displayed on the form for editing this
|
danielebarchiesi@0
|
565 * component. Use care naming the form items, as this correlates directly to the
|
danielebarchiesi@0
|
566 * database schema. The component "Name" and "Description" fields are added to
|
danielebarchiesi@0
|
567 * every component type and are not necessary to specify here (although they
|
danielebarchiesi@0
|
568 * may be overridden if desired).
|
danielebarchiesi@0
|
569 *
|
danielebarchiesi@0
|
570 * @param $component
|
danielebarchiesi@0
|
571 * A Webform component array.
|
danielebarchiesi@0
|
572 * @return
|
danielebarchiesi@0
|
573 * An array of form items to be displayed on the edit component page
|
danielebarchiesi@0
|
574 */
|
danielebarchiesi@0
|
575 function _webform_edit_component($component) {
|
danielebarchiesi@0
|
576 $form = array();
|
danielebarchiesi@0
|
577
|
danielebarchiesi@0
|
578 // Disabling the description if not wanted.
|
danielebarchiesi@0
|
579 $form['description'] = array();
|
danielebarchiesi@0
|
580
|
danielebarchiesi@0
|
581 // Most options are stored in the "extra" array, which stores any settings
|
danielebarchiesi@0
|
582 // unique to a particular component type.
|
danielebarchiesi@0
|
583 $form['extra']['options'] = array(
|
danielebarchiesi@0
|
584 '#type' => 'textarea',
|
danielebarchiesi@0
|
585 '#title' => t('Options'),
|
danielebarchiesi@0
|
586 '#default_value' => $component['extra']['options'],
|
danielebarchiesi@0
|
587 '#description' => t('Key-value pairs may be entered separated by pipes. i.e. safe_key|Some readable option') . theme('webform_token_help'),
|
danielebarchiesi@0
|
588 '#cols' => 60,
|
danielebarchiesi@0
|
589 '#rows' => 5,
|
danielebarchiesi@0
|
590 '#weight' => -3,
|
danielebarchiesi@0
|
591 '#required' => TRUE,
|
danielebarchiesi@0
|
592 );
|
danielebarchiesi@0
|
593 return $form;
|
danielebarchiesi@0
|
594 }
|
danielebarchiesi@0
|
595
|
danielebarchiesi@0
|
596 /**
|
danielebarchiesi@0
|
597 * Render a Webform component to be part of a form.
|
danielebarchiesi@0
|
598 *
|
danielebarchiesi@0
|
599 * @param $component
|
danielebarchiesi@0
|
600 * A Webform component array.
|
danielebarchiesi@0
|
601 * @param $value
|
danielebarchiesi@0
|
602 * If editing an existing submission or resuming a draft, this will contain
|
danielebarchiesi@0
|
603 * an array of values to be shown instead of the default in the component
|
danielebarchiesi@0
|
604 * configuration. This value will always be an array, keyed numerically for
|
danielebarchiesi@0
|
605 * each value saved in this field.
|
danielebarchiesi@0
|
606 * @param $filter
|
danielebarchiesi@0
|
607 * Whether or not to filter the contents of descriptions and values when
|
danielebarchiesi@0
|
608 * rendering the component. Values need to be unfiltered to be editable by
|
danielebarchiesi@0
|
609 * Form Builder.
|
danielebarchiesi@0
|
610 *
|
danielebarchiesi@0
|
611 * @see _webform_client_form_add_component()
|
danielebarchiesi@0
|
612 */
|
danielebarchiesi@0
|
613 function _webform_render_component($component, $value = NULL, $filter = TRUE) {
|
danielebarchiesi@0
|
614 $form_item = array(
|
danielebarchiesi@0
|
615 '#type' => 'textfield',
|
danielebarchiesi@0
|
616 '#title' => $filter ? _webform_filter_xss($component['name']) : $component['name'],
|
danielebarchiesi@0
|
617 '#required' => $component['mandatory'],
|
danielebarchiesi@0
|
618 '#weight' => $component['weight'],
|
danielebarchiesi@0
|
619 '#description' => $filter ? _webform_filter_descriptions($component['extra']['description']) : $component['extra']['description'],
|
danielebarchiesi@0
|
620 '#default_value' => $filter ? _webform_filter_values($component['value']) : $component['value'],
|
danielebarchiesi@0
|
621 '#prefix' => '<div class="webform-component-textfield" id="webform-component-' . $component['form_key'] . '">',
|
danielebarchiesi@0
|
622 '#suffix' => '</div>',
|
danielebarchiesi@0
|
623 );
|
danielebarchiesi@0
|
624
|
danielebarchiesi@0
|
625 if (isset($value)) {
|
danielebarchiesi@0
|
626 $form_item['#default_value'] = $value[0];
|
danielebarchiesi@0
|
627 }
|
danielebarchiesi@0
|
628
|
danielebarchiesi@0
|
629 return $form_item;
|
danielebarchiesi@0
|
630 }
|
danielebarchiesi@0
|
631
|
danielebarchiesi@0
|
632 /**
|
danielebarchiesi@0
|
633 * Display the result of a submission for a component.
|
danielebarchiesi@0
|
634 *
|
danielebarchiesi@0
|
635 * The output of this function will be displayed under the "Results" tab then
|
danielebarchiesi@0
|
636 * "Submissions". This should output the saved data in some reasonable manner.
|
danielebarchiesi@0
|
637 *
|
danielebarchiesi@0
|
638 * @param $component
|
danielebarchiesi@0
|
639 * A Webform component array.
|
danielebarchiesi@0
|
640 * @param $value
|
danielebarchiesi@0
|
641 * An array of information containing the submission result, directly
|
danielebarchiesi@0
|
642 * correlating to the webform_submitted_data database table schema.
|
danielebarchiesi@0
|
643 * @param $format
|
danielebarchiesi@0
|
644 * Either 'html' or 'text'. Defines the format that the content should be
|
danielebarchiesi@0
|
645 * returned as. Make sure that returned content is run through check_plain()
|
danielebarchiesi@0
|
646 * or other filtering functions when returning HTML.
|
danielebarchiesi@0
|
647 * @return
|
danielebarchiesi@0
|
648 * A renderable element containing at the very least these properties:
|
danielebarchiesi@0
|
649 * - #title
|
danielebarchiesi@0
|
650 * - #weight
|
danielebarchiesi@0
|
651 * - #component
|
danielebarchiesi@0
|
652 * - #format
|
danielebarchiesi@0
|
653 * - #value
|
danielebarchiesi@0
|
654 * Webform also uses #theme_wrappers to output the end result to the user,
|
danielebarchiesi@0
|
655 * which will properly format the label and content for use within an e-mail
|
danielebarchiesi@0
|
656 * (such as wrapping the text) or as HTML (ensuring consistent output).
|
danielebarchiesi@0
|
657 */
|
danielebarchiesi@0
|
658 function _webform_display_component($component, $value, $format = 'html') {
|
danielebarchiesi@0
|
659 return array(
|
danielebarchiesi@0
|
660 '#title' => $component['name'],
|
danielebarchiesi@0
|
661 '#weight' => $component['weight'],
|
danielebarchiesi@0
|
662 '#theme' => 'webform_display_textfield',
|
danielebarchiesi@0
|
663 '#theme_wrappers' => $format == 'html' ? array('webform_element') : array('webform_element_text'),
|
danielebarchiesi@0
|
664 '#post_render' => array('webform_element_wrapper'),
|
danielebarchiesi@0
|
665 '#field_prefix' => $component['extra']['field_prefix'],
|
danielebarchiesi@0
|
666 '#field_suffix' => $component['extra']['field_suffix'],
|
danielebarchiesi@0
|
667 '#component' => $component,
|
danielebarchiesi@0
|
668 '#format' => $format,
|
danielebarchiesi@0
|
669 '#value' => isset($value[0]) ? $value[0] : '',
|
danielebarchiesi@0
|
670 );
|
danielebarchiesi@0
|
671 }
|
danielebarchiesi@0
|
672
|
danielebarchiesi@0
|
673 /**
|
danielebarchiesi@0
|
674 * A hook for changing the input values before saving to the database.
|
danielebarchiesi@0
|
675 *
|
danielebarchiesi@0
|
676 * Webform expects a component to consist of a single field, or a single array
|
danielebarchiesi@0
|
677 * of fields. If you have a component that requires a deeper form tree
|
danielebarchiesi@0
|
678 * you must flatten the data into a single array using this callback
|
danielebarchiesi@0
|
679 * or by setting #parents on each field to avoid data loss and/or unexpected
|
danielebarchiesi@0
|
680 * behavior.
|
danielebarchiesi@0
|
681 *
|
danielebarchiesi@0
|
682 * Note that Webform will save the result of this function directly into the
|
danielebarchiesi@0
|
683 * database.
|
danielebarchiesi@0
|
684 *
|
danielebarchiesi@0
|
685 * @param $component
|
danielebarchiesi@0
|
686 * A Webform component array.
|
danielebarchiesi@0
|
687 * @param $value
|
danielebarchiesi@0
|
688 * The POST data associated with the user input.
|
danielebarchiesi@0
|
689 * @return
|
danielebarchiesi@0
|
690 * An array of values to be saved into the database. Note that this should be
|
danielebarchiesi@0
|
691 * a numerically keyed array.
|
danielebarchiesi@0
|
692 */
|
danielebarchiesi@0
|
693 function _webform_submit_component($component, $value) {
|
danielebarchiesi@0
|
694 // Clean up a phone number into 123-456-7890 format.
|
danielebarchiesi@0
|
695 if ($component['extra']['phone_number']) {
|
danielebarchiesi@0
|
696 $matches = array();
|
danielebarchiesi@0
|
697 $number = preg_replace('[^0-9]', $value[0]);
|
danielebarchiesi@0
|
698 if (strlen($number) == 7) {
|
danielebarchiesi@0
|
699 $number = substr($number, 0, 3) . '-' . substr($number, 3, 4);
|
danielebarchiesi@0
|
700 }
|
danielebarchiesi@0
|
701 else {
|
danielebarchiesi@0
|
702 $number = substr($number, 0, 3) . '-' . substr($number, 3, 3) . '-' . substr($number, 6, 4);
|
danielebarchiesi@0
|
703 }
|
danielebarchiesi@0
|
704 }
|
danielebarchiesi@0
|
705
|
danielebarchiesi@0
|
706 $value[0] = $number;
|
danielebarchiesi@0
|
707 return $value;
|
danielebarchiesi@0
|
708 }
|
danielebarchiesi@0
|
709
|
danielebarchiesi@0
|
710 /**
|
danielebarchiesi@0
|
711 * Delete operation for a component or submission.
|
danielebarchiesi@0
|
712 *
|
danielebarchiesi@0
|
713 * @param $component
|
danielebarchiesi@0
|
714 * A Webform component array.
|
danielebarchiesi@0
|
715 * @param $value
|
danielebarchiesi@0
|
716 * An array of information containing the submission result, directly
|
danielebarchiesi@0
|
717 * correlating to the webform_submitted_data database schema.
|
danielebarchiesi@0
|
718 */
|
danielebarchiesi@0
|
719 function _webform_delete_component($component, $value) {
|
danielebarchiesi@0
|
720 // Delete corresponding files when a submission is deleted.
|
danielebarchiesi@0
|
721 $filedata = unserialize($value['0']);
|
danielebarchiesi@0
|
722 if (isset($filedata['filepath']) && is_file($filedata['filepath'])) {
|
danielebarchiesi@0
|
723 unlink($filedata['filepath']);
|
danielebarchiesi@0
|
724 db_query("DELETE FROM {files} WHERE filepath = '%s'", $filedata['filepath']);
|
danielebarchiesi@0
|
725 }
|
danielebarchiesi@0
|
726 }
|
danielebarchiesi@0
|
727
|
danielebarchiesi@0
|
728 /**
|
danielebarchiesi@0
|
729 * Module specific instance of hook_help().
|
danielebarchiesi@0
|
730 *
|
danielebarchiesi@0
|
731 * This allows each Webform component to add information into hook_help().
|
danielebarchiesi@0
|
732 */
|
danielebarchiesi@0
|
733 function _webform_help_component($section) {
|
danielebarchiesi@0
|
734 switch ($section) {
|
danielebarchiesi@0
|
735 case 'admin/config/content/webform#grid_description':
|
danielebarchiesi@0
|
736 return t('Allows creation of grid questions, denoted by radio buttons.');
|
danielebarchiesi@0
|
737 }
|
danielebarchiesi@0
|
738 }
|
danielebarchiesi@0
|
739
|
danielebarchiesi@0
|
740 /**
|
danielebarchiesi@0
|
741 * Module specific instance of hook_theme().
|
danielebarchiesi@0
|
742 *
|
danielebarchiesi@0
|
743 * This allows each Webform component to add information into hook_theme(). If
|
danielebarchiesi@0
|
744 * you specify a file to include, you must define the path to the module that
|
danielebarchiesi@0
|
745 * this file belongs to.
|
danielebarchiesi@0
|
746 */
|
danielebarchiesi@0
|
747 function _webform_theme_component() {
|
danielebarchiesi@0
|
748 return array(
|
danielebarchiesi@0
|
749 'webform_grid' => array(
|
danielebarchiesi@0
|
750 'render element' => 'element',
|
danielebarchiesi@0
|
751 'file' => 'components/grid.inc',
|
danielebarchiesi@0
|
752 'path' => drupal_get_path('module', 'webform'),
|
danielebarchiesi@0
|
753 ),
|
danielebarchiesi@0
|
754 'webform_display_grid' => array(
|
danielebarchiesi@0
|
755 'render element' => 'element',
|
danielebarchiesi@0
|
756 'file' => 'components/grid.inc',
|
danielebarchiesi@0
|
757 'path' => drupal_get_path('module', 'webform'),
|
danielebarchiesi@0
|
758 ),
|
danielebarchiesi@0
|
759 );
|
danielebarchiesi@0
|
760 }
|
danielebarchiesi@0
|
761
|
danielebarchiesi@0
|
762 /**
|
danielebarchiesi@0
|
763 * Calculate and returns statistics about results for this component.
|
danielebarchiesi@0
|
764 *
|
danielebarchiesi@0
|
765 * This takes into account all submissions to this webform. The output of this
|
danielebarchiesi@0
|
766 * function will be displayed under the "Results" tab then "Analysis".
|
danielebarchiesi@0
|
767 *
|
danielebarchiesi@0
|
768 * @param $component
|
danielebarchiesi@0
|
769 * An array of information describing the component, directly correlating to
|
danielebarchiesi@0
|
770 * the webform_component database schema.
|
danielebarchiesi@0
|
771 * @param $sids
|
danielebarchiesi@0
|
772 * An optional array of submission IDs (sid). If supplied, the analysis will
|
danielebarchiesi@0
|
773 * be limited to these sids.
|
danielebarchiesi@0
|
774 * @param $single
|
danielebarchiesi@0
|
775 * Boolean flag determining if the details about a single component are being
|
danielebarchiesi@0
|
776 * shown. May be used to provided detailed information about a single
|
danielebarchiesi@0
|
777 * component's analysis, such as showing "Other" options within a select list.
|
danielebarchiesi@0
|
778 * @return
|
danielebarchiesi@0
|
779 * An array of data rows, each containing a statistic for this component's
|
danielebarchiesi@0
|
780 * submissions.
|
danielebarchiesi@0
|
781 */
|
danielebarchiesi@0
|
782 function _webform_analysis_component($component, $sids = array(), $single = FALSE) {
|
danielebarchiesi@0
|
783 // Generate the list of options and questions.
|
danielebarchiesi@0
|
784 $options = _webform_select_options_from_text($component['extra']['options'], TRUE);
|
danielebarchiesi@0
|
785 $questions = _webform_select_options_from_text($component['extra']['questions'], TRUE);
|
danielebarchiesi@0
|
786
|
danielebarchiesi@0
|
787 // Generate a lookup table of results.
|
danielebarchiesi@0
|
788 $query = db_select('webform_submitted_data', 'wsd')
|
danielebarchiesi@0
|
789 ->fields('wsd', array('no', 'data'))
|
danielebarchiesi@0
|
790 ->condition('nid', $component['nid'])
|
danielebarchiesi@0
|
791 ->condition('cid', $component['cid'])
|
danielebarchiesi@0
|
792 ->condition('data', '', '<>')
|
danielebarchiesi@0
|
793 ->groupBy('no')
|
danielebarchiesi@0
|
794 ->groupBy('data');
|
danielebarchiesi@0
|
795 $query->addExpression('COUNT(sid)', 'datacount');
|
danielebarchiesi@0
|
796
|
danielebarchiesi@0
|
797 if (count($sids)) {
|
danielebarchiesi@0
|
798 $query->condition('sid', $sids, 'IN');
|
danielebarchiesi@0
|
799 }
|
danielebarchiesi@0
|
800
|
danielebarchiesi@0
|
801 $result = $query->execute();
|
danielebarchiesi@0
|
802 $counts = array();
|
danielebarchiesi@0
|
803 foreach ($result as $data) {
|
danielebarchiesi@0
|
804 $counts[$data->no][$data->data] = $data->datacount;
|
danielebarchiesi@0
|
805 }
|
danielebarchiesi@0
|
806
|
danielebarchiesi@0
|
807 // Create an entire table to be put into the returned row.
|
danielebarchiesi@0
|
808 $rows = array();
|
danielebarchiesi@0
|
809 $header = array('');
|
danielebarchiesi@0
|
810
|
danielebarchiesi@0
|
811 // Add options as a header row.
|
danielebarchiesi@0
|
812 foreach ($options as $option) {
|
danielebarchiesi@0
|
813 $header[] = $option;
|
danielebarchiesi@0
|
814 }
|
danielebarchiesi@0
|
815
|
danielebarchiesi@0
|
816 // Add questions as each row.
|
danielebarchiesi@0
|
817 foreach ($questions as $qkey => $question) {
|
danielebarchiesi@0
|
818 $row = array($question);
|
danielebarchiesi@0
|
819 foreach ($options as $okey => $option) {
|
danielebarchiesi@0
|
820 $row[] = !empty($counts[$qkey][$okey]) ? $counts[$qkey][$okey] : 0;
|
danielebarchiesi@0
|
821 }
|
danielebarchiesi@0
|
822 $rows[] = $row;
|
danielebarchiesi@0
|
823 }
|
danielebarchiesi@0
|
824 $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('class' => array('webform-grid'))));
|
danielebarchiesi@0
|
825
|
danielebarchiesi@0
|
826 return array(array(array('data' => $output, 'colspan' => 2)));
|
danielebarchiesi@0
|
827 }
|
danielebarchiesi@0
|
828
|
danielebarchiesi@0
|
829 /**
|
danielebarchiesi@0
|
830 * Return the result of a component value for display in a table.
|
danielebarchiesi@0
|
831 *
|
danielebarchiesi@0
|
832 * The output of this function will be displayed under the "Results" tab then
|
danielebarchiesi@0
|
833 * "Table".
|
danielebarchiesi@0
|
834 *
|
danielebarchiesi@0
|
835 * @param $component
|
danielebarchiesi@0
|
836 * A Webform component array.
|
danielebarchiesi@0
|
837 * @param $value
|
danielebarchiesi@0
|
838 * An array of information containing the submission result, directly
|
danielebarchiesi@0
|
839 * correlating to the webform_submitted_data database schema.
|
danielebarchiesi@0
|
840 * @return
|
danielebarchiesi@0
|
841 * Textual output formatted for human reading.
|
danielebarchiesi@0
|
842 */
|
danielebarchiesi@0
|
843 function _webform_table_component($component, $value) {
|
danielebarchiesi@0
|
844 $questions = array_values(_webform_component_options($component['extra']['questions']));
|
danielebarchiesi@0
|
845 $output = '';
|
danielebarchiesi@0
|
846 // Set the value as a single string.
|
danielebarchiesi@0
|
847 if (is_array($value)) {
|
danielebarchiesi@0
|
848 foreach ($value as $item => $value) {
|
danielebarchiesi@0
|
849 if ($value !== '') {
|
danielebarchiesi@0
|
850 $output .= $questions[$item] . ': ' . check_plain($value) . '<br />';
|
danielebarchiesi@0
|
851 }
|
danielebarchiesi@0
|
852 }
|
danielebarchiesi@0
|
853 }
|
danielebarchiesi@0
|
854 else {
|
danielebarchiesi@0
|
855 $output = check_plain(!isset($value['0']) ? '' : $value['0']);
|
danielebarchiesi@0
|
856 }
|
danielebarchiesi@0
|
857 return $output;
|
danielebarchiesi@0
|
858 }
|
danielebarchiesi@0
|
859
|
danielebarchiesi@0
|
860 /**
|
danielebarchiesi@0
|
861 * Return the header for this component to be displayed in a CSV file.
|
danielebarchiesi@0
|
862 *
|
danielebarchiesi@0
|
863 * The output of this function will be displayed under the "Results" tab then
|
danielebarchiesi@0
|
864 * "Download".
|
danielebarchiesi@0
|
865 *
|
danielebarchiesi@0
|
866 * @param $component
|
danielebarchiesi@0
|
867 * A Webform component array.
|
danielebarchiesi@0
|
868 * @param $export_options
|
danielebarchiesi@0
|
869 * An array of options that may configure export of this field.
|
danielebarchiesi@0
|
870 * @return
|
danielebarchiesi@0
|
871 * An array of data to be displayed in the first three rows of a CSV file, not
|
danielebarchiesi@0
|
872 * including either prefixed or trailing commas.
|
danielebarchiesi@0
|
873 */
|
danielebarchiesi@0
|
874 function _webform_csv_headers_component($component, $export_options) {
|
danielebarchiesi@0
|
875 $header = array();
|
danielebarchiesi@0
|
876 $header[0] = array('');
|
danielebarchiesi@0
|
877 $header[1] = array($component['name']);
|
danielebarchiesi@0
|
878 $items = _webform_component_options($component['extra']['questions']);
|
danielebarchiesi@0
|
879 $count = 0;
|
danielebarchiesi@0
|
880 foreach ($items as $key => $item) {
|
danielebarchiesi@0
|
881 // Empty column per sub-field in main header.
|
danielebarchiesi@0
|
882 if ($count != 0) {
|
danielebarchiesi@0
|
883 $header[0][] = '';
|
danielebarchiesi@0
|
884 $header[1][] = '';
|
danielebarchiesi@0
|
885 }
|
danielebarchiesi@0
|
886 // The value for this option.
|
danielebarchiesi@0
|
887 $header[2][] = $item;
|
danielebarchiesi@0
|
888 $count++;
|
danielebarchiesi@0
|
889 }
|
danielebarchiesi@0
|
890
|
danielebarchiesi@0
|
891 return $header;
|
danielebarchiesi@0
|
892 }
|
danielebarchiesi@0
|
893
|
danielebarchiesi@0
|
894 /**
|
danielebarchiesi@0
|
895 * Format the submitted data of a component for CSV downloading.
|
danielebarchiesi@0
|
896 *
|
danielebarchiesi@0
|
897 * The output of this function will be displayed under the "Results" tab then
|
danielebarchiesi@0
|
898 * "Download".
|
danielebarchiesi@0
|
899 *
|
danielebarchiesi@0
|
900 * @param $component
|
danielebarchiesi@0
|
901 * A Webform component array.
|
danielebarchiesi@0
|
902 * @param $export_options
|
danielebarchiesi@0
|
903 * An array of options that may configure export of this field.
|
danielebarchiesi@0
|
904 * @param $value
|
danielebarchiesi@0
|
905 * An array of information containing the submission result, directly
|
danielebarchiesi@0
|
906 * correlating to the webform_submitted_data database schema.
|
danielebarchiesi@0
|
907 * @return
|
danielebarchiesi@0
|
908 * An array of items to be added to the CSV file. Each value within the array
|
danielebarchiesi@0
|
909 * will be another column within the file. This function is called once for
|
danielebarchiesi@0
|
910 * every row of data.
|
danielebarchiesi@0
|
911 */
|
danielebarchiesi@0
|
912 function _webform_csv_data_component($component, $export_options, $value) {
|
danielebarchiesi@0
|
913 $questions = array_keys(_webform_select_options($component['extra']['questions']));
|
danielebarchiesi@0
|
914 $return = array();
|
danielebarchiesi@0
|
915 foreach ($questions as $key => $question) {
|
danielebarchiesi@0
|
916 $return[] = isset($value[$key]) ? $value[$key] : '';
|
danielebarchiesi@0
|
917 }
|
danielebarchiesi@0
|
918 return $return;
|
danielebarchiesi@0
|
919 }
|
danielebarchiesi@0
|
920
|
danielebarchiesi@0
|
921 /**
|
danielebarchiesi@0
|
922 * @}
|
danielebarchiesi@0
|
923 */
|