annotate sites/all/modules/webform/webform.api.php @ 11:b0ee71395280

deleted .DS_Store files
author danieleb <danielebarchiesi@me.com>
date Mon, 28 Oct 2013 16:12:13 +0000
parents ff03f76ab3fe
children
rev   line source
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 */