annotate sites/all/modules/webform/webform.module @ 0:ff03f76ab3fe

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