View source
<?php
function webform_help($section = 'admin/help#webform', $arg = NULL) {
$output = '';
switch ($section) {
case 'admin/settings/webform':
module_load_include('inc', 'webform', 'includes/webform.admin');
$type_list = webform_admin_type_list();
$output = t('Webform enables nodes to have attached forms and questionnaires.');
if ($type_list) {
$output .= ' ' . t('To add one, create a !types piece of content.', array(
'!types' => $type_list,
));
}
else {
$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.');
}
$output = '<p>' . $output . '</p>';
break;
case 'admin/content/webform':
$output = '<p>' . t('This page lists all of the content on the site that may have a webform attached to it.') . '</p>';
break;
case 'admin/help#webform':
module_load_include('inc', 'webform', 'includes/webform.admin');
$types = webform_admin_type_list();
if (empty($types)) {
$types = t('Webform-enabled piece of content');
$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/settings/webform'),
));
}
else {
$types_message = t('Optional: Enable Webform on multiple types by visiting the <a href="!url">Webform settings</a> page.', array(
'!url' => url('admin/settings/webform'),
));
}
$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>\n <p>Here is how to create one:</p>\n <ul>\n <li>!webform-types-message</li>\n <li>Go to <a href=\"!create-content\">Create content</a> and add a !types piece of content.</li>\n <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>\n <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>\n <li>Finally, visit the <em>Form settings</em> sub-tab under the <em>Webform</em> tab to configure remaining configurations options for your form.\n <ul>\n <li>Add a confirmation message and/or redirect URL that is to be displayed after successful submission.</li>\n <li>Set a submission limit.</li>\n <li>Determine which roles may submit the form.</li>\n <li>Advanced configuration options such as allowing drafts or show users a message indicating how they can edit their submissions.</li>\n </ul>\n </li>\n <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>\n </ul>\n <p>Help on adding and configuring the components will be shown after you add your first component.</p>\n ", array(
'!webform-types-message' => $types_message,
'!create-content' => url('node/add'),
'!types' => $types,
));
break;
case 'node/%/submission/%/resend':
$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>';
break;
}
return $output;
}
function webform_menu() {
$items = array();
$items['admin/content/webform'] = array(
'title' => 'Webforms',
'page callback' => 'webform_admin_content',
'access callback' => 'user_access',
'access arguments' => array(
'access all webform results',
),
'description' => 'View and edit all the available webforms on your site.',
'file' => 'includes/webform.admin.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['admin/settings/webform'] = array(
'title' => 'Webform settings',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_admin_settings',
),
'access callback' => 'user_access',
'access arguments' => array(
'administer site configuration',
),
'description' => 'Global configuration of webform functionality.',
'file' => 'includes/webform.admin.inc',
'type' => MENU_NORMAL_ITEM,
);
$items['node/%webform_menu/done'] = array(
'title' => 'Webform confirmation',
'page callback' => '_webform_confirmation',
'page arguments' => array(
1,
),
'access callback' => 'node_access',
'access arguments' => array(
'view',
1,
),
'type' => MENU_CALLBACK,
);
$items['node/%webform_menu/webform'] = array(
'title' => 'Webform',
'page callback' => 'webform_components_page',
'page arguments' => array(
1,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.components.inc',
'weight' => 1,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/components'] = array(
'title' => 'Form components',
'page callback' => 'webform_components_page',
'page arguments' => array(
1,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.components.inc',
'weight' => 0,
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['node/%webform_menu/webform/configure'] = array(
'title' => 'Form settings',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_configure_form',
1,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.pages.inc',
'weight' => 2,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/emails'] = array(
'title' => 'E-mails',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_emails_form',
1,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.emails.inc',
'weight' => 1,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/emails/%webform_menu_email'] = array(
'title' => 'Edit e-mail settings',
'load arguments' => array(
1,
),
'page arguments' => array(
'webform_email_edit_form',
1,
4,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.emails.inc',
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/emails/%webform_menu_email/delete'] = array(
'title' => 'Delete e-mail settings',
'load arguments' => array(
1,
),
'page arguments' => array(
'webform_email_delete_form',
1,
4,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/components/%webform_menu_component'] = array(
'load arguments' => array(
1,
5,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_component_edit_form',
1,
4,
FALSE,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.components.inc',
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/components/%webform_menu_component/clone'] = array(
'load arguments' => array(
1,
5,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_component_edit_form',
1,
4,
TRUE,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.components.inc',
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform/components/%webform_menu_component/delete'] = array(
'load arguments' => array(
1,
5,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_component_delete_form',
1,
4,
),
'access callback' => 'node_access',
'access arguments' => array(
'update',
1,
),
'file' => 'includes/webform.components.inc',
'type' => MENU_LOCAL_TASK,
);
$items['webform/ajax/options/%webform_menu'] = array(
'load arguments' => array(
3,
),
'page callback' => 'webform_select_options_ajax',
'access callback' => 'node_access',
'access arguments' => array(
'update',
3,
),
'file' => 'components/select.inc',
'type' => MENU_CALLBACK,
);
$items['node/%webform_menu/webform-results'] = array(
'title' => 'Results',
'page callback' => 'webform_results_submissions',
'page arguments' => array(
1,
FALSE,
'50',
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'weight' => 2,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/submissions'] = array(
'title' => 'Submissions',
'page callback' => 'webform_results_submissions',
'page arguments' => array(
1,
FALSE,
'50',
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'weight' => 4,
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/analysis'] = array(
'title' => 'Analysis',
'page callback' => 'webform_results_analysis',
'page arguments' => array(
1,
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'weight' => 5,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/analysis/%webform_menu_component'] = array(
'title' => 'Analysis',
'load arguments' => array(
1,
4,
),
'page callback' => 'webform_results_analysis',
'page arguments' => array(
1,
array(),
4,
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'type' => MENU_CALLBACK,
);
$items['node/%webform_menu/webform-results/table'] = array(
'title' => 'Table',
'page callback' => 'webform_results_table',
'page arguments' => array(
1,
'50',
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'weight' => 6,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/download'] = array(
'title' => 'Download',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_results_download_form',
1,
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'weight' => 7,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/webform-results/clear'] = array(
'title' => 'Clear',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_results_clear_form',
1,
),
'access callback' => 'webform_results_clear_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.report.inc',
'weight' => 8,
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/submissions'] = array(
'title' => 'Submissions',
'page callback' => 'webform_results_submissions',
'page arguments' => array(
1,
TRUE,
'50',
),
'access callback' => 'webform_submission_access',
'access arguments' => array(
1,
NULL,
'list',
),
'file' => 'includes/webform.report.inc',
'type' => MENU_CALLBACK,
);
$items['node/%webform_menu/submission/%webform_menu_submission'] = array(
'title' => 'Webform submission',
'load arguments' => array(
1,
),
'page callback' => 'webform_submission_page',
'page arguments' => array(
1,
3,
'html',
),
'title callback' => 'webform_submission_title',
'title arguments' => array(
1,
3,
),
'access callback' => 'webform_submission_access',
'access arguments' => array(
1,
3,
'view',
),
'file' => 'includes/webform.submissions.inc',
'type' => MENU_CALLBACK,
);
$items['node/%webform_menu/submission/%webform_menu_submission/view'] = array(
'title' => 'View',
'load arguments' => array(
1,
),
'page callback' => 'webform_submission_page',
'page arguments' => array(
1,
3,
'html',
),
'access callback' => 'webform_submission_access',
'access arguments' => array(
1,
3,
'view',
),
'weight' => 0,
'file' => 'includes/webform.submissions.inc',
'type' => MENU_DEFAULT_LOCAL_TASK,
);
$items['node/%webform_menu/submission/%webform_menu_submission/edit'] = array(
'title' => 'Edit',
'load arguments' => array(
1,
),
'page callback' => 'webform_submission_page',
'page arguments' => array(
1,
3,
'form',
),
'access callback' => 'webform_submission_access',
'access arguments' => array(
1,
3,
'edit',
),
'weight' => 1,
'file' => 'includes/webform.submissions.inc',
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/submission/%webform_menu_submission/delete'] = array(
'title' => 'Delete',
'load arguments' => array(
1,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_submission_delete_form',
1,
3,
),
'access callback' => 'webform_submission_access',
'access arguments' => array(
1,
3,
'delete',
),
'weight' => 2,
'file' => 'includes/webform.submissions.inc',
'type' => MENU_LOCAL_TASK,
);
$items['node/%webform_menu/submission/%webform_menu_submission/resend'] = array(
'title' => 'Resend e-mails',
'load arguments' => array(
1,
),
'page callback' => 'drupal_get_form',
'page arguments' => array(
'webform_submission_resend',
1,
3,
),
'access callback' => 'webform_results_access',
'access arguments' => array(
1,
),
'file' => 'includes/webform.submissions.inc',
'type' => MENU_CALLBACK,
);
return $items;
}
function webform_menu_load($nid) {
if (!is_numeric($nid)) {
return FALSE;
}
$node = node_load($nid);
if (!isset($node->type) || !in_array($node->type, webform_variable_get('webform_node_types'))) {
return FALSE;
}
return $node;
}
function webform_menu_submission_load($sid, $nid) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
$submission = webform_get_submission($nid, $sid);
return empty($submission) ? FALSE : $submission;
}
function webform_menu_component_load($cid, $nid, $type) {
module_load_include('inc', 'webform', 'includes/webform.components');
if ($cid == 'new') {
$components = webform_components();
$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;
}
else {
$node = node_load($nid);
$component = isset($node->webform['components'][$cid]) ? $node->webform['components'][$cid] : FALSE;
}
if ($component) {
webform_component_defaults($component);
}
return $component;
}
function webform_menu_email_load($eid, $nid) {
module_load_include('inc', 'webform', 'includes/webform.emails');
$node = node_load($nid);
$email = webform_email_load($eid, $nid);
if ($eid == 'new') {
if (isset($_GET['option']) && isset($_GET['email'])) {
$type = $_GET['option'];
if ($type == 'custom') {
$email['email'] = $_GET['email'];
}
elseif ($type == 'component' && isset($node->webform['components'][$_GET['email']])) {
$email['email'] = $_GET['email'];
}
}
}
return $email;
}
function webform_submission_access($node, $submission, $op = 'view', $account = NULL) {
global $user;
$account = isset($account) ? $account : $user;
$access_all = user_access('access all webform results', $account);
$access_own_submission = isset($submission) && user_access('access own webform submissions', $account) && ($account->uid && $account->uid == $submission->uid || isset($_SESSION['webform_submission'][$submission->sid]));
$access_node_submissions = user_access('access own webform results', $account) && $account->uid == $node->uid;
$general_access = $access_all || $access_own_submission || $access_node_submissions;
if (!$account->uid && user_access('access own webform submissions', $account)) {
webform_disable_page_cache();
}
$module_access = count(array_filter(module_invoke_all('webform_submission_access', $node, $submission, $op, $account))) > 0;
switch ($op) {
case 'view':
return $module_access || $general_access;
case 'edit':
return $module_access || $general_access && (user_access('edit all webform submissions', $account) || user_access('edit own webform submissions', $account) && $account->uid == $submission->uid);
case 'delete':
return $module_access || $general_access && (user_access('delete all webform submissions', $account) || user_access('delete own webform submissions', $account) && $account->uid == $submission->uid);
case 'list':
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;
}
}
function webform_results_access($node, $account = NULL) {
global $user;
$account = isset($account) ? $account : $user;
$module_access = count(array_filter(module_invoke_all('webform_results_access', $node, $account))) > 0;
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);
}
function webform_results_clear_access($node, $account = NULL) {
global $user;
$account = isset($account) ? $account : $user;
$module_access = count(array_filter(module_invoke_all('webform_results_clear_access', $node, $account))) > 0;
return webform_results_access($node, $account) && ($module_access || user_access('delete all webform submissions', $account));
}
function webform_init() {
if (variable_get('node_admin_theme', '0') && arg(0) == 'node' && (arg(2) == 'webform' || arg(2) == 'webform-results')) {
global $custom_theme;
$custom_theme = variable_get('admin_theme', '0');
drupal_add_css(drupal_get_path('module', 'system') . '/admin.css', 'module');
if (function_exists('_admin_init_theme') && empty($custom_theme)) {
_admin_init_theme();
}
}
}
function webform_perm() {
return array(
'access all webform results',
'access own webform results',
'edit all webform submissions',
'delete all webform submissions',
'access own webform submissions',
'edit own webform submissions',
'delete own webform submissions',
);
}
function webform_theme() {
$theme = array(
'webform_view' => array(
'arguments' => array(
'node' => NULL,
'teaser' => NULL,
'page' => NULL,
'form' => NULL,
'enabled' => NULL,
),
),
'webform_view_messages' => array(
'arguments' => array(
'node' => NULL,
'teaser' => NULL,
'page' => NULL,
'submission_count' => NULL,
'user_limit_exceeded' => NULL,
'total_limit_exceeded' => NULL,
'allowed_roles' => NULL,
'closed' => NULL,
'cached' => FALSE,
),
),
'webform_form' => array(
'arguments' => array(
'form' => NULL,
),
'template' => 'templates/webform-form',
'pattern' => 'webform_form_[0-9]+',
),
'webform_confirmation' => array(
'arguments' => array(
'node' => NULL,
'sid' => NULL,
),
'template' => 'templates/webform-confirmation',
'pattern' => 'webform_confirmation_[0-9]+',
),
'webform_element' => array(
'arguments' => array(
'element' => NULL,
'value' => NULL,
),
),
'webform_element_wrapper' => array(
'arguments' => array(
'element' => NULL,
'content' => NULL,
),
),
'webform_element_text' => array(
'arguments' => array(
'element' => NULL,
'value' => NULL,
),
),
'webform_mail_message' => array(
'arguments' => array(
'node' => NULL,
'submission' => NULL,
'email' => NULL,
),
'template' => 'templates/webform-mail',
'pattern' => 'webform_mail(_[0-9]+)?',
),
'webform_mail_headers' => array(
'arguments' => array(
'node' => NULL,
'submission' => NULL,
'email' => NULL,
),
'pattern' => 'webform_mail_headers_[0-9]+',
),
'webform_token_help' => array(
'arguments' => array(
'groups' => array(),
),
),
'webform_admin_settings' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.admin.inc',
),
'webform_admin_content' => array(
'arguments' => array(
'nodes' => NULL,
),
'file' => 'includes/webform.admin.inc',
),
'webform_emails_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.emails.inc',
),
'webform_email_add_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.emails.inc',
),
'webform_email_edit_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.emails.inc',
),
'webform_components_page' => array(
'arguments' => array(
'node' => NULL,
'form' => NULL,
),
'file' => 'includes/webform.components.inc',
),
'webform_components_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.components.inc',
),
'webform_component_select' => array(
'arguments' => array(
'element' => NULL,
),
'file' => 'includes/webform.components.inc',
),
'webform_advanced_redirection_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.pages.inc',
),
'webform_advanced_submit_limit_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.pages.inc',
),
'webform_advanced_total_submit_limit_form' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.pages.inc',
),
'webform_results_per_page' => array(
'arguments' => array(
'total_count' => NULL,
'pager_count' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_results_submissions_header' => array(
'arguments' => array(
'node' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_results_submissions' => array(
'arguments' => array(
'element' => NULL,
),
'template' => 'templates/webform-results-submissions',
'file' => 'includes/webform.report.inc',
),
'webform_results_table_header' => array(
'arguments' => array(
'node' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_results_table' => array(
'arguments' => array(
'node' => NULL,
'components' => NULL,
'submissions' => NULL,
'node' => NULL,
'total_count' => NULL,
'pager_count' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_results_download_range' => array(
'arguments' => array(
'element' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_results_download_select_format' => array(
'arguments' => array(
'element' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_results_analysis' => array(
'arguments' => array(
'node' => NULL,
'data' => NULL,
'sids' => array(),
'component' => NULL,
),
'file' => 'includes/webform.report.inc',
),
'webform_submission' => array(
'arguments' => array(
'renderable' => NULL,
),
'template' => 'templates/webform-submission',
'pattern' => 'webform_submission_[0-9]+',
'file' => 'includes/webform.submissions.inc',
),
'webform_submission_page' => array(
'arguments' => array(
'node' => NULL,
'submission' => NULL,
'submission_content' => NULL,
'submission_navigation' => NULL,
'submission_information' => NULL,
'submission_actions' => NULL,
'mode' => NULL,
),
'template' => 'templates/webform-submission-page',
'file' => 'includes/webform.submissions.inc',
),
'webform_submission_information' => array(
'arguments' => array(
'node' => NULL,
'submission' => NULL,
'mode' => 'display',
),
'template' => 'templates/webform-submission-information',
'file' => 'includes/webform.submissions.inc',
),
'webform_submission_navigation' => array(
'arguments' => array(
'node' => NULL,
'submission' => NULL,
'mode' => NULL,
),
'template' => 'templates/webform-submission-navigation',
'file' => 'includes/webform.submissions.inc',
),
'webform_submission_resend' => array(
'arguments' => array(
'form' => NULL,
),
'file' => 'includes/webform.submissions.inc',
),
);
$components = webform_components(TRUE);
foreach ($components as $type => $component) {
if ($theme_additions = webform_component_invoke($type, 'theme')) {
$theme = array_merge($theme, $theme_additions);
}
}
return $theme;
}
function webform_elements() {
$elements['webform_time'] = array(
'#input' => 'TRUE',
);
$elements['webform_grid'] = array(
'#input' => 'TRUE',
);
$elements['webform_email'] = array(
'#input' => TRUE,
'#theme' => 'webform_email',
'#size' => 60,
);
$elements['webform_number'] = array(
'#input' => TRUE,
'#theme' => 'webform_number',
'#min' => NULL,
'#max' => NULL,
'#step' => NULL,
);
return $elements;
}
function webform_webform_component_info() {
return array(
'date' => array(
'label' => t('Date'),
'description' => t('Presents month, day, and year fields.'),
'features' => array(
'conditional' => FALSE,
),
'file' => 'components/date.inc',
),
'email' => array(
'label' => t('E-mail'),
'description' => t('A special textfield that accepts e-mail addresses.'),
'file' => 'components/email.inc',
'features' => array(
'email_address' => TRUE,
'spam_analysis' => TRUE,
),
),
'fieldset' => array(
'label' => t('Fieldset'),
'description' => t('Fieldsets allow you to organize multiple fields into groups.'),
'features' => array(
'csv' => FALSE,
'default_value' => FALSE,
'required' => FALSE,
'conditional' => FALSE,
'group' => TRUE,
'title_inline' => FALSE,
),
'file' => 'components/fieldset.inc',
),
'file' => array(
'label' => t('File'),
'description' => t('Allow users to upload files of configurable types.'),
'features' => array(
'conditional' => FALSE,
'default_value' => FALSE,
'attachment' => TRUE,
),
'file' => 'components/file.inc',
),
'grid' => array(
'label' => t('Grid'),
'description' => t('Allows creation of grid questions, denoted by radio buttons.'),
'features' => array(
'conditional' => FALSE,
'default_value' => FALSE,
'title_inline' => FALSE,
),
'file' => 'components/grid.inc',
),
'hidden' => array(
'label' => t('Hidden'),
'description' => t('A field which is not visible to the user, but is recorded with the submission.'),
'file' => 'components/hidden.inc',
'features' => array(
'required' => FALSE,
'description' => FALSE,
'email_address' => TRUE,
'email_name' => TRUE,
'title_display' => FALSE,
'private' => FALSE,
),
),
'markup' => array(
'label' => t('Markup'),
'description' => t('Displays text as HTML in the form; does not render a field.'),
'features' => array(
'csv' => FALSE,
'default_value' => FALSE,
'description' => FALSE,
'email' => FALSE,
'required' => FALSE,
'conditional' => FALSE,
'title_display' => FALSE,
'private' => FALSE,
),
'file' => 'components/markup.inc',
),
'number' => array(
'label' => t('Number'),
'description' => t('A numeric input field (either as textfield or select list).'),
'features' => array(),
'file' => 'components/number.inc',
),
'pagebreak' => array(
'label' => t('Page break'),
'description' => t('Organize forms into multiple pages.'),
'features' => array(
'csv' => FALSE,
'default_value' => FALSE,
'description' => FALSE,
'private' => FALSE,
'required' => FALSE,
'title_display' => FALSE,
),
'file' => 'components/pagebreak.inc',
),
'select' => array(
'label' => t('Select options'),
'description' => t('Allows creation of checkboxes, radio buttons, or select menus.'),
'file' => 'components/select.inc',
'features' => array(
'default_value' => FALSE,
'email_address' => TRUE,
'email_name' => TRUE,
),
),
'textarea' => array(
'label' => t('Textarea'),
'description' => t('A large text area that allows for multiple lines of input.'),
'file' => 'components/textarea.inc',
'features' => array(
'spam_analysis' => TRUE,
'title_inline' => FALSE,
),
),
'textfield' => array(
'label' => t('Textfield'),
'description' => t('Basic textfield type.'),
'file' => 'components/textfield.inc',
'features' => array(
'email_name' => TRUE,
'spam_analysis' => TRUE,
),
),
'time' => array(
'label' => t('Time'),
'description' => t('Presents the user with hour and minute fields. Optional am/pm fields.'),
'features' => array(
'conditional' => FALSE,
),
'file' => 'components/time.inc',
),
);
}
function webform_forms($form_id) {
$forms = array();
if (strpos($form_id, 'webform_client_form_') === 0) {
$forms[$form_id]['callback'] = 'webform_client_form';
}
return $forms;
}
function webform_webform_select_options_info() {
module_load_include('inc', 'webform', 'includes/webform.options');
return _webform_options_info();
}
function webform_webform_submission_actions($node, $submission) {
$actions = array();
$destination = drupal_get_destination();
if (module_exists('print_pdf') && user_access('access PDF version')) {
$actions['printpdf'] = array(
'title' => t('Download PDF'),
'href' => 'printpdf/' . $node->nid . '/submission/' . $submission->sid,
'query' => $destination,
);
}
if (module_exists('print') && user_access('access print')) {
$actions['print'] = array(
'title' => t('Print'),
'href' => 'print/' . $node->nid . '/submission/' . $submission->sid,
);
}
if (webform_results_access($node) && count($node->webform['emails'])) {
$actions['resend'] = array(
'title' => t('Resend e-mails'),
'href' => 'node/' . $node->nid . '/submission/' . $submission->sid . '/resend',
'query' => drupal_get_destination(),
);
}
return $actions;
}
function webform_webform_submission_render_alter(&$renderable) {
$node = $renderable['#node'];
$is_admin = webform_results_access($node);
if (empty($renderable['#email']) && !$is_admin) {
module_load_include('inc', 'webform', 'includes/webform.components');
foreach ($node->webform['components'] as $cid => $component) {
if ($component['type'] == 'hidden') {
$parents = webform_component_parent_keys($node, $component);
$element =& $renderable;
foreach ($parents as $pid) {
$element =& $element[$pid];
}
$element['#access'] = FALSE;
}
}
}
}
function webform_file_download($file) {
global $user;
$webform_directory = file_directory_path() . '/webform/';
if (!is_dir($webform_directory)) {
return;
}
$file = file_check_location(file_directory_path() . '/' . $file, $webform_directory);
if ($file && (user_access('access all webform results') || user_access('access own webform results'))) {
$info = image_get_info(file_create_path($file));
if (isset($info['mime_type'])) {
$headers = array(
'Content-type: ' . $info['mime_type'],
);
}
else {
$headers = array(
'Content-type: force-download',
'Content-disposition: attachment',
);
}
return $headers;
}
}
function webform_node_type($op, $info) {
$webform_types = webform_variable_get('webform_node_types');
$affected_type = isset($info->old_type) ? $info->old_type : $info->type;
$key = array_search($affected_type, $webform_types);
if ($key !== FALSE) {
if ($op == 'update') {
$webform_types[$key] = $info->type;
}
if ($op == 'delete') {
unset($webform_types[$key]);
}
variable_set('webform_node_types', $webform_types);
}
}
function webform_nodeapi(&$node, $op, $teaser = NULL, $page = NULL) {
if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
return;
}
switch ($op) {
case 'insert':
webform_node_insert($node);
break;
case 'update':
webform_node_update($node);
break;
case 'delete':
webform_node_delete($node);
break;
case 'prepare':
webform_node_prepare($node);
break;
case 'prepare translation':
webform_node_prepare_translation($node);
break;
case 'load':
return webform_node_load($node);
case 'view':
return webform_node_view($node, $teaser, $page);
}
}
function webform_node_insert($node) {
if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
return;
}
if (!isset($node->webform)) {
$node->webform = webform_node_defaults();
}
if ($node->webform == webform_node_defaults() && !in_array($node->type, webform_variable_get('webform_node_types_primary'))) {
return;
}
module_load_include('inc', 'webform', 'includes/webform.components');
module_load_include('inc', 'webform', 'includes/webform.emails');
$node->webform['nid'] = $node->nid;
$node->webform['record_exists'] = (bool) drupal_write_record('webform', $node->webform);
if (isset($node->webform['components']) && !empty($node->webform['components'])) {
foreach ($node->webform['components'] as $cid => $component) {
$component['nid'] = $node->nid;
webform_component_insert($component);
}
}
if (isset($node->webform['emails']) && !empty($node->webform['emails'])) {
foreach ($node->webform['emails'] as $eid => $email) {
$email['nid'] = $node->nid;
webform_email_insert($email);
}
}
foreach (array_filter($node->webform['roles']) as $rid) {
db_query('INSERT INTO {webform_roles} (nid, rid) VALUES (%d, %d)', $node->nid, $rid);
}
}
function webform_node_update($node) {
if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
return;
}
webform_check_record($node);
if (!$node->webform['record_exists']) {
webform_node_insert($node);
return;
}
$node->webform['nid'] = $node->nid;
drupal_write_record('webform', $node->webform, array(
'nid',
));
$original = node_load($node->nid);
if ($original->webform['components'] != $node->webform['components']) {
module_load_include('inc', 'webform', 'includes/webform.components');
$original_cids = array_keys($original->webform['components']);
$current_cids = array_keys($node->webform['components']);
$all_cids = array_unique(array_merge($original_cids, $current_cids));
$deleted_cids = array_diff($original_cids, $current_cids);
$inserted_cids = array_diff($current_cids, $original_cids);
foreach ($all_cids as $cid) {
if (in_array($cid, $inserted_cids)) {
webform_component_insert($node->webform['components'][$cid]);
}
elseif (in_array($cid, $deleted_cids)) {
webform_component_delete($node, $original->webform['components'][$cid]);
}
elseif ($node->webform['components'][$cid] != $original->webform['components'][$cid]) {
$node->webform['components'][$cid]['nid'] = $node->nid;
webform_component_update($node->webform['components'][$cid]);
}
}
}
if ($original->webform['emails'] != $node->webform['emails']) {
module_load_include('inc', 'webform', 'includes/webform.emails');
$original_eids = array_keys($original->webform['emails']);
$current_eids = array_keys($node->webform['emails']);
$all_eids = array_unique(array_merge($original_eids, $current_eids));
$deleted_eids = array_diff($original_eids, $current_eids);
$inserted_eids = array_diff($current_eids, $original_eids);
foreach ($all_eids as $eid) {
if (in_array($eid, $inserted_eids)) {
webform_email_insert($node->webform['emails'][$eid]);
}
elseif (in_array($eid, $deleted_eids)) {
webform_email_delete($node, $original->webform['emails'][$eid]);
}
elseif ($node->webform['emails'][$eid] != $original->webform['emails'][$eid]) {
$node->webform['emails'][$eid]['nid'] = $node->nid;
webform_email_update($node->webform['emails'][$eid]);
}
}
}
if ($original->webform['roles'] != $node->webform['roles']) {
db_query('DELETE FROM {webform_roles} WHERE nid = %d', $node->nid);
foreach (array_filter($node->webform['roles']) as $rid) {
db_query('INSERT INTO {webform_roles} (nid, rid) VALUES (%d, %d)', $node->nid, $rid);
}
}
}
function webform_node_delete($node) {
if (!in_array($node->type, webform_variable_get('webform_node_types'))) {
return;
}
module_load_include('inc', 'webform', 'includes/webform.components');
foreach ($node->webform['components'] as $cid => $component) {
webform_component_delete($node, $component);
}
db_query('DELETE FROM {webform} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {webform_component} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {webform_emails} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {webform_roles} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {webform_submissions} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {webform_submitted_data} WHERE nid = %d', $node->nid);
db_query('DELETE FROM {webform_last_download} WHERE nid = %d', $node->nid);
}
function webform_node_defaults() {
$defaults = array(
'confirmation' => '',
'confirmation_format' => (string) filter_resolve_format(FILTER_FORMAT_DEFAULT),
'redirect_url' => '<confirmation>',
'teaser' => '0',
'block' => '0',
'allow_draft' => '0',
'auto_save' => '0',
'submit_notice' => '1',
'submit_text' => '',
'submit_limit' => '-1',
'submit_interval' => '-1',
'total_submit_limit' => '-1',
'total_submit_interval' => '-1',
'status' => '1',
'record_exists' => FALSE,
'roles' => array(
'1',
'2',
),
'emails' => array(),
'components' => array(),
);
drupal_alter('webform_node_defaults', $defaults);
return $defaults;
}
function webform_node_prepare(&$node) {
if (!isset($node->webform)) {
$node->webform = webform_node_defaults();
}
}
function webform_node_prepare_translation(&$node) {
if (isset($node->translation_source)) {
$source_node = node_load($node->translation_source->nid);
$node->webform = $source_node->webform;
}
}
function webform_node_load($node) {
module_load_include('inc', 'webform', 'includes/webform.components');
$additions = array();
if (isset($node->nid)) {
$webform = db_fetch_array(db_query('SELECT * FROM {webform} WHERE nid = %d', $node->nid));
if (!$webform) {
$additions['webform'] = webform_node_defaults();
return $additions;
}
$additions['webform'] = $webform;
$additions['webform']['record_exists'] = TRUE;
$additions['webform']['roles'] = array();
$result = db_query('SELECT rid FROM {webform_roles} WHERE nid = %d', $node->nid);
while ($role = db_fetch_object($result)) {
$additions['webform']['roles'][] = $role->rid;
}
$additions['webform']['emails'] = array();
$result = db_query('SELECT * FROM {webform_emails} WHERE nid = %d', $node->nid);
while ($email = db_fetch_array($result)) {
$additions['webform']['emails'][$email['eid']] = $email;
$additions['webform']['emails'][$email['eid']]['excluded_components'] = array_filter(explode(',', $email['excluded_components']));
if (variable_get('webform_format_override', 0)) {
$additions['webform']['emails'][$email['eid']]['html'] = variable_get('webform_default_format', 0);
}
}
}
$additions['webform']['components'] = array();
$result = db_query('SELECT * FROM {webform_component} WHERE nid = %d ORDER BY weight, name', $node->nid);
while ($c = db_fetch_array($result)) {
$component =& $additions['webform']['components'][$c['cid']];
$component['nid'] = $node->nid;
$component['cid'] = $c['cid'];
$component['form_key'] = $c['form_key'] ? $c['form_key'] : $c['cid'];
$component['name'] = $c['name'];
$component['type'] = $c['type'];
$component['value'] = $c['value'];
$component['extra'] = unserialize($c['extra']);
$component['mandatory'] = $c['mandatory'];
$component['pid'] = $c['pid'];
$component['weight'] = $c['weight'];
webform_component_defaults($component);
}
if (!empty($additions['webform']['components'])) {
$component_tree = array();
$page_count = 1;
_webform_components_tree_build($additions['webform']['components'], $component_tree, 0, $page_count);
$additions['webform']['components'] = _webform_components_tree_flatten($component_tree['children']);
}
return $additions;
}
function webform_link($type, $node = NULL, $teaser = FALSE) {
$links = array();
if (isset($node->type) && $node->type === 'webform') {
if ($teaser && !$node->webform['teaser']) {
$links['webform_goto'] = array(
'title' => t('Go to form'),
'href' => 'node/' . $node->nid,
'attributes' => array(
'title' => t('View this form.'),
'class' => 'read-more',
),
);
}
}
return $links;
}
function webform_form_alter(&$form, $form_state, $form_id) {
$matches = array();
if (isset($form['#node']->type) && $form_id == $form['#node']->type . '_node_form' && in_array($form['#node']->type, webform_variable_get('webform_node_types'))) {
$node = $form['#node'];
$form['webform'] = array(
'#type' => 'value',
'#value' => $node->webform,
);
if (empty($node->nid) && in_array($node->type, webform_variable_get('webform_node_types_primary'))) {
$form['buttons']['submit']['#submit'][] = 'webform_form_submit';
}
}
}
function webform_form_submit($form, &$form_state) {
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'],
)));
$form_state['redirect'] = 'node/' . $form_state['nid'] . '/webform/components';
}
function webform_node_view(&$node, $teaser, $page) {
global $user;
if (empty($node->webform['components']) || $teaser && !$node->webform['teaser'] || empty($node->nid)) {
return;
}
if (module_exists('search') && isset($node->build_mode) && $node->build_mode == NODE_BUILD_SEARCH_INDEX && !variable_get('webform_search_index', 1)) {
return;
}
$info = array();
$submission = array();
$submission_count = 0;
$enabled = TRUE;
$logging_in = FALSE;
$total_limit_exceeded = FALSE;
$user_limit_exceeded = FALSE;
$closed = FALSE;
$allowed_roles = array();
$node->webform['is_teaser'] = $teaser;
if ($teaser && !isset($node->webform['action'])) {
$query = array_diff_key($_GET, array(
'q' => '',
));
$node->webform['action'] = url('node/' . $node->nid, array(
'query' => $query,
));
}
if (isset($_POST['op']) && isset($_POST['name']) && isset($_POST['pass'])) {
$logging_in = TRUE;
}
if ($node->webform['status'] == 0) {
$closed = TRUE;
$enabled = FALSE;
}
else {
if (variable_get('webform_submission_access_control', 1)) {
foreach ($node->webform['roles'] as $rid) {
$allowed_roles[$rid] = isset($user->roles[$rid]) ? TRUE : FALSE;
}
if (array_search(TRUE, $allowed_roles) === FALSE && $user->uid != 1) {
$enabled = FALSE;
}
}
else {
$allowed_roles = array_keys(user_roles());
}
}
if ($page && webform_submission_access($node, NULL, 'list')) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
$submission_count = webform_get_submission_count($node->nid, $user->uid);
}
$cached = $user->uid == 0 && (variable_get('cache', 0) || function_exists('drupal_page_is_cacheable') && drupal_page_is_cacheable() === FALSE);
if ($node->webform['submit_limit'] != -1) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
if (($user_limit_exceeded = _webform_submission_user_limit_check($node)) && !$cached) {
$enabled = FALSE;
}
}
if ($node->webform['total_submit_limit'] != -1) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
if (($total_limit_exceeded = _webform_submission_total_limit_check($node)) && !$cached) {
$enabled = FALSE;
}
}
$is_draft = FALSE;
if (($node->webform['allow_draft'] || $node->webform['auto_save']) && $user->uid != 0) {
if ($draft_sid = _webform_fetch_draft_sid($node->nid, $user->uid)) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
$submission = webform_get_submission($node->nid, $draft_sid);
$enabled = TRUE;
$is_draft = TRUE;
}
}
$form = !empty($node->webform['components']) ? drupal_get_form('webform_client_form_' . $node->nid, $node, $submission, $is_draft) : '';
$output = theme('webform_view', $node, $teaser, $page, $form, $enabled);
if (isset($node->build_mode) && $node->build_mode == NODE_BUILD_PREVIEW) {
$output = preg_replace('/<\\/?form[^>]*>/', '', $output);
}
if ((!isset($node->build_mode) || $node->build_mode != NODE_BUILD_PREVIEW) && !isset($node->webform_block) && !$logging_in) {
theme('webform_view_messages', $node, $teaser, $page, $submission_count, $user_limit_exceeded, $total_limit_exceeded, $allowed_roles, $closed, $cached);
}
if (isset($output)) {
if (module_exists('content')) {
$weight = content_extra_field_weight($node->type, 'webform');
}
$node->content['webform'] = array(
'#value' => $output,
'#weight' => isset($weight) ? $weight : 10,
);
}
}
function theme_webform_view($node, $teaser, $page, $form, $enabled) {
if ($enabled) {
return $form;
}
}
function theme_webform_view_messages($node, $teaser, $page, $submission_count, $user_limit_exceeded, $total_limit_exceeded, $allowed_roles, $closed, $cached) {
global $user;
$type = 'status';
if ($closed) {
$message = t('Submissions for this form are closed.');
}
elseif (array_search(TRUE, $allowed_roles) === FALSE && $user->uid != 1) {
if (empty($allowed_roles)) {
$message = t('Submissions for this form are closed.');
}
elseif (isset($allowed_roles[2])) {
$login = url('user/login', array(
'query' => drupal_get_destination(),
));
$register = url('user/register', array(
'query' => drupal_get_destination(),
));
if (variable_get('user_register', 1) == 0) {
$message = t('You must <a href="!login">login</a> to view this form.', array(
'!login' => $login,
));
}
else {
$message = t('You must <a href="!login">login</a> or <a href="!register">register</a> to view this form.', array(
'!login' => $login,
'!register' => $register,
));
}
}
else {
$message = t('You do not have permission to view this form.');
$type = 'error';
}
}
elseif ($user_limit_exceeded && !$cached) {
if ($node->webform['submit_interval'] == -1 && $node->webform['submit_limit'] > 1) {
$message = t('You have submitted this form the maximum number of times (@count).', array(
'@count' => $node->webform['submit_limit'],
));
}
elseif ($node->webform['submit_interval'] == -1 && $node->webform['submit_limit'] == 1) {
$message = t('You have already submitted this form.');
}
else {
$message = t('You may not submit another entry at this time.');
}
$type = 'error';
}
elseif ($total_limit_exceeded && !$cached) {
if ($node->webform['total_submit_interval'] == -1 && $node->webform['total_submit_limit'] > 1) {
$message = t('This form has received the maximum number of entries.');
}
else {
$message = t('You may not submit another entry at this time.');
}
}
if ($submission_count > 0 && $node->webform['submit_notice'] == 1 && !$cached) {
if (empty($message)) {
$message = t('You have already submitted this form.') . ' ' . t('<a href="!url">View your previous submissions</a>.', array(
'!url' => url('node/' . $node->nid . '/submissions'),
));
}
else {
$message .= ' ' . t('<a href="!url">View your previous submissions</a>.', array(
'!url' => url('node/' . $node->nid . '/submissions'),
));
}
}
if ($page && isset($message)) {
drupal_set_message($message, $type, FALSE);
}
}
function webform_mail($key, &$message, $params) {
$message['headers'] = array_merge($message['headers'], $params['headers']);
$message['subject'] = $params['subject'];
$message['body'][] = $params['message'];
}
function webform_block($op = 'list', $delta = 0, $edit = array()) {
$nid = drupal_substr($delta, strrpos($delta, '-') + 1);
if ($op != 'list' && !db_result(db_query("SELECT block FROM {webform} WHERE nid = %d", $nid))) {
return;
}
switch ($op) {
case 'list':
return webform_block_info();
case 'view':
return webform_block_view($delta);
case 'configure':
return webform_block_configure($delta);
case 'save':
webform_block_save($delta, $edit);
break;
}
}
function webform_block_info() {
$blocks = array();
$webform_node_types = webform_variable_get('webform_node_types');
if (!empty($webform_node_types)) {
$placeholders = db_placeholders($webform_node_types, 'varchar');
$result = db_query("SELECT n.title, n.nid FROM {webform} w LEFT JOIN {node} n ON w.nid = n.nid WHERE w.block = 1 AND n.type IN ({$placeholders})", $webform_node_types);
while ($data = db_fetch_object($result)) {
$blocks['client-block-' . $data->nid] = array(
'info' => t('Webform: !title', array(
'!title' => $data->title,
)),
'cache' => BLOCK_NO_CACHE,
);
}
}
return $blocks;
}
function webform_block_view($delta = '') {
global $user;
$webform_blocks = variable_get('webform_blocks', array());
$settings = isset($webform_blocks[$delta]) ? $webform_blocks[$delta] : array();
$settings += array(
'display' => 'form',
'pages_block' => 0,
);
$nid = drupal_substr($delta, strrpos($delta, '-') + 1);
if (module_exists('translation')) {
global $language;
if (($translations = translation_node_get_translations($nid)) && isset($translations[$language->language])) {
$nid = $translations[$language->language]->nid;
}
}
$node = node_load($nid);
if (!node_access('view', $node)) {
return;
}
$node->webform_block = TRUE;
if ($settings['pages_block']) {
$node->webform['action'] = FALSE;
}
else {
$query = array_diff_key($_GET, array(
'q' => '',
));
$node->webform['action'] = url('node/' . $node->nid, array(
'query' => $query,
));
}
if ($settings['display'] == 'form') {
webform_node_view($node, FALSE, TRUE, FALSE);
$content = $node->content['webform']['#value'];
}
else {
$teaser = $settings['display'] == 'teaser' ? TRUE : FALSE;
$content = node_view($node, $teaser, TRUE, FALSE);
}
$block = array(
'subject' => check_plain($node->title),
'content' => $content,
);
return $block;
}
function webform_block_configure($delta = '') {
$webform_blocks = variable_get('webform_blocks', array());
$settings = isset($webform_blocks[$delta]) ? $webform_blocks[$delta] : array();
$settings += array(
'display' => 'form',
'pages_block' => 0,
);
$form = array();
$form['display'] = array(
'#type' => 'radios',
'#title' => t('Display mode'),
'#default_value' => $settings['display'],
'#options' => array(
'form' => t('Form only'),
'full' => t('Full node'),
'teaser' => t('Teaser'),
),
'#description' => t('The display mode determines how much of the webform to show within the block.'),
);
$form['pages_block'] = array(
'#type' => 'checkbox',
'#title' => t('Show all webform pages in block'),
'#default_value' => $settings['pages_block'],
'#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.'),
);
return $form;
}
function webform_block_save($delta = '', $edit = array()) {
$settings = variable_get('webform_blocks', array());
$new_settings[$delta] = array(
'display' => $edit['display'],
'pages_block' => $edit['pages_block'],
);
variable_set('webform_blocks', array_merge($settings, $new_settings));
}
function webform_client_form(&$form_state, $node, $submission, $is_draft = FALSE, $filter = TRUE) {
global $user;
module_load_include('inc', 'webform', 'includes/webform.components');
module_load_include('inc', 'webform', 'includes/webform.submissions');
$form['#process'] = array(
'webform_client_form_includes',
);
if (empty($submission) && !empty($form_state['values']['details']['sid'])) {
$submission = webform_get_submission($node->nid, $form_state['values']['details']['sid']);
$is_draft = $submission->is_draft;
}
$form['#node'] = $node;
$form['#submission'] = $submission;
$form['#is_draft'] = $is_draft;
$form['#filter'] = $filter;
$form['#theme'] = array(
'webform_form_' . $node->nid,
'webform_form',
);
$form['#attributes'] = array(
'class' => 'webform-client-form',
);
$form['#attributes']['enctype'] = 'multipart/form-data';
if (!empty($node->webform['action'])) {
$form['#action'] = $node->webform['action'];
}
$form['#submit'] = array(
'webform_client_form_pages',
'webform_client_form_submit',
);
$form['#validate'] = array(
'webform_client_form_validate',
);
if (is_array($node->webform['components']) && !empty($node->webform['components'])) {
$form['submitted'] = array(
'#tree' => TRUE,
);
$form['details'] = array(
'#tree' => TRUE,
);
if (!isset($form_state['storage']['component_tree'])) {
$form_state['webform']['component_tree'] = array();
$form_state['webform']['page_count'] = 1;
$form_state['webform']['page_num'] = 1;
_webform_components_tree_build($node->webform['components'], $form_state['webform']['component_tree'], 0, $form_state['webform']['page_count']);
}
else {
$form_state['webform']['component_tree'] = $form_state['storage']['component_tree'];
$form_state['webform']['page_count'] = $form_state['storage']['page_count'];
$form_state['webform']['page_num'] = $form_state['storage']['page_num'];
}
$component_tree = $form_state['webform']['component_tree'];
$page_count = $form_state['webform']['page_count'];
$page_num = $form_state['webform']['page_num'];
if ($page_count > 1) {
$next_page_labels = array();
$prev_page_labels = array();
}
foreach ($component_tree['children'] as $cid => $component) {
$component_value = isset($form_state['values']['submitted'][$cid]) ? $form_state['values']['submitted'][$cid] : NULL;
if ($filter == FALSE || _webform_client_form_rule_check($node, $component, $page_num, $form_state)) {
if ($component['type'] == 'pagebreak') {
$next_page_labels[$component['page_num'] - 1] = !empty($component['extra']['next_page_label']) ? t($component['extra']['next_page_label']) : t('Next Page >');
$prev_page_labels[$component['page_num']] = !empty($component['extra']['prev_page_label']) ? t($component['extra']['prev_page_label']) : t('< Previous Page');
}
_webform_client_form_add_component($node, $component, $component_value, $form['submitted'], $form, $form_state, $submission, 'form', $page_num, $filter);
}
}
$form['details']['nid'] = array(
'#type' => 'value',
'#value' => $node->nid,
);
$form['details']['sid'] = array(
'#type' => 'hidden',
'#value' => isset($submission->sid) ? $submission->sid : '',
);
$form['details']['uid'] = array(
'#type' => 'value',
'#value' => isset($submission->uid) ? $submission->uid : $user->uid,
);
$form['details']['page_num'] = array(
'#type' => 'hidden',
'#value' => $page_num,
);
$form['details']['page_count'] = array(
'#type' => 'hidden',
'#value' => $page_count,
);
$form['details']['finished'] = array(
'#type' => 'hidden',
'#value' => isset($submission->is_draft) ? !$submission->is_draft : 0,
);
$form['actions'] = array(
'#tree' => FALSE,
'#weight' => 1000,
'#prefix' => '<div id="edit-actions" class="form-actions form-wrapper">',
'#suffix' => '</div>',
);
if ($node->webform['allow_draft'] && (empty($submission) || $submission->is_draft) && $user->uid != 0) {
$form['actions']['draft'] = array(
'#type' => 'submit',
'#value' => t('Save Draft'),
'#weight' => -2,
'#validate' => array(),
'#attributes' => array(
'formnovalidate' => 'formnovalidate',
),
);
}
if ($page_count > 1) {
if ($page_num > 1) {
$form['actions']['previous'] = array(
'#type' => 'submit',
'#value' => $prev_page_labels[$page_num],
'#weight' => 5,
'#validate' => array(),
'#attributes' => array(
'formnovalidate' => 'formnovalidate',
),
);
}
if ($page_num == $page_count) {
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => empty($node->webform['submit_text']) ? t('Submit') : t($node->webform['submit_text']),
'#weight' => 10,
);
}
elseif ($page_num < $page_count) {
$form['actions']['next'] = array(
'#type' => 'submit',
'#value' => $next_page_labels[$page_num],
'#weight' => 10,
);
}
}
else {
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => empty($node->webform['submit_text']) ? t('Submit') : t($node->webform['submit_text']),
'#weight' => 10,
);
}
}
return $form;
}
function webform_client_form_includes($form, $form_state) {
$components = webform_components();
foreach ($components as $component_type => $component) {
webform_component_include($component_type);
}
return $form;
}
function _webform_client_form_rule_check($node, $component, $page_num, $form_state = NULL, $submission = NULL) {
$conditional_values = isset($component['extra']['conditional_values']) ? $component['extra']['conditional_values'] : NULL;
$conditional_component = isset($component['extra']['conditional_component']) && isset($node->webform['components'][$component['extra']['conditional_component']]) ? $node->webform['components'][$component['extra']['conditional_component']] : NULL;
$conditional_cid = $conditional_component['cid'];
$show_page = TRUE;
if ($component['page_num'] > 1 && $component['type'] != 'pagebreak') {
foreach ($node->webform['components'] as $cid => $page_component) {
if ($page_component['type'] == 'pagebreak' && $page_component['page_num'] == $page_num) {
$show_page = _webform_client_form_rule_check($node, $page_component, $page_num, $form_state, $submission);
break;
}
}
}
$show_parent = $show_page;
if ($show_parent && $component['pid'] && isset($node->webform['components'][$component['pid']])) {
$parent_component = $node->webform['components'][$component['pid']];
$show_parent = _webform_client_form_rule_check($node, $parent_component, $page_num, $form_state, $submission);
}
$show_component = $show_parent;
if ($show_component && ($page_num == 0 || $component['page_num'] == $page_num) && $conditional_component && strlen(trim($conditional_values))) {
$input_values = array();
if (isset($form_state)) {
$input_value = isset($form_state['values']['submitted'][$conditional_cid]) ? $form_state['values']['submitted'][$conditional_cid] : NULL;
$input_values = is_array($input_value) ? $input_value : array(
$input_value,
);
}
elseif (isset($submission)) {
$input_values = isset($submission->data[$conditional_cid]['value']) ? $submission->data[$conditional_cid]['value'] : array();
}
$test_values = array_map('trim', explode("\n", $conditional_values));
if (empty($input_values) && !empty($test_values)) {
$show_component = FALSE;
}
else {
foreach ($input_values as $input_value) {
if ($show_component = in_array($input_value, $test_values)) {
break;
}
}
}
if ($component['extra']['conditional_operator'] == '!=') {
$show_component = !$show_component;
}
}
return $show_component;
}
function _webform_client_form_add_component($node, $component, $component_value, &$parent_fieldset, &$form, $form_state, $submission, $format = 'form', $page_num = 0, $filter = TRUE) {
$cid = $component['cid'];
$component_access = empty($component['extra']['private']) || webform_results_access($node);
if ($format != 'form') {
$data = empty($submission->data[$cid]['value']) ? NULL : $submission->data[$cid]['value'];
if ($display_element = webform_component_invoke($component['type'], 'display', $component, $data, $format)) {
$element['#access'] = $component_access;
$display_element['#webform_component'] = $component;
drupal_alter('webform_component_display', $display_element, $component);
if (!isset($display_element['#parents'])) {
$parents = isset($parent_fieldset['#parents']) ? $parent_fieldset['#parents'] : array(
'submitted',
);
$parents[] = $component['form_key'];
$display_element['#parents'] = $parents;
}
if (!isset($display_element['#id'])) {
$display_element['#id'] = form_clean_id('edit-' . implode('-', $display_element['#parents']));
}
$parent_fieldset[$component['form_key']] = $display_element;
}
}
elseif ($component['page_num'] == $page_num || $filter == FALSE) {
$data = isset($submission->data[$cid]['value']) ? $submission->data[$cid]['value'] : NULL;
if ($element = webform_component_invoke($component['type'], 'render', $component, $data, $filter)) {
$element['#access'] = $component_access;
$element['#webform_component'] = $component;
if (webform_component_feature($component['type'], 'private')) {
$element['#webform_private'] = $component['extra']['private'];
}
drupal_alter('webform_component_render', $element, $component);
$parent_fieldset[$component['form_key']] = $element;
if (isset($component_value)) {
$parent_fieldset[$component['form_key']]['#default_value'] = $component_value;
if (is_array($component_value)) {
foreach ($component_value as $key => $value) {
if (isset($parent_fieldset[$component['form_key']][$key])) {
$parent_fieldset[$component['form_key']][$key]['#default_value'] = $value;
}
}
}
}
}
else {
drupal_set_message(t('The webform component @type is not able to be displayed', array(
'@type' => $component['type'],
)));
}
}
if (isset($parent_fieldset[$component['form_key']])) {
$parent_fieldset[$component['form_key']]['#validated'] = TRUE;
$parent_fieldset[$component['form_key']]['#webform_validated'] = FALSE;
}
if (isset($component['children']) && is_array($component['children'])) {
foreach ($component['children'] as $scid => $subcomponent) {
$subcomponent_value = isset($form_state['values']['submitted'][$scid]) ? $form_state['values']['submitted'][$scid] : NULL;
if (_webform_client_form_rule_check($node, $subcomponent, $page_num, $form_state, $submission)) {
_webform_client_form_add_component($node, $subcomponent, $subcomponent_value, $parent_fieldset[$component['form_key']], $form, $form_state, $submission, $format, $page_num, $filter);
}
}
}
}
function webform_client_form_validate($form, &$form_state) {
$node = node_load($form_state['values']['details']['nid']);
$finished = $form_state['values']['details']['finished'];
if ($node->webform['total_submit_limit'] != -1) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
if (!$finished && ($total_limit_exceeded = _webform_submission_total_limit_check($node))) {
theme('webform_view_messages', $node, 0, 1, 0, NULL, $total_limit_exceeded, array_keys(user_roles()), FALSE, FALSE);
form_set_error('', NULL);
return;
}
}
if ($node->webform['submit_limit'] != -1) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
if (!$finished && ($user_limit_exceeded = _webform_submission_user_limit_check($node))) {
theme('webform_view_messages', $node, 0, 1, 0, $user_limit_exceeded, NULL, array_keys(user_roles()), FALSE, FALSE);
form_set_error('', NULL);
return;
}
}
_webform_client_form_validate($form, $form_state);
}
function _webform_client_form_validate($elements, &$form_state, $first_run = TRUE) {
static $form;
if ($first_run) {
$form = $elements;
}
foreach (element_children($elements) as $key) {
if (isset($elements[$key]) && $elements[$key]) {
_webform_client_form_validate($elements[$key], $form_state, FALSE);
}
}
if (isset($elements['#webform_validated']) && $elements['#webform_validated'] == FALSE) {
if (isset($elements['#needs_validation'])) {
if ($elements['#required'] && (!count($elements['#value']) || is_string($elements['#value']) && strlen(trim($elements['#value'])) == 0 || $elements['#value'] === FALSE)) {
form_error($elements, t('!name field is required.', array(
'!name' => $elements['#title'],
)));
}
if (isset($elements['#maxlength']) && drupal_strlen($elements['#value']) > $elements['#maxlength']) {
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']),
)));
}
if (isset($elements['#options']) && isset($elements['#value'])) {
if ($elements['#type'] == 'select') {
$options = form_options_flatten($elements['#options']);
}
else {
$options = $elements['#options'];
}
if (is_array($elements['#value'])) {
$value = $elements['#type'] == 'checkboxes' ? array_keys(array_filter($elements['#value'])) : $elements['#value'];
foreach ($value as $v) {
if (!isset($options[$v])) {
form_error($elements, t('An illegal choice has been detected. Please contact the site administrator.'));
watchdog('form', 'Illegal choice %choice in !name element.', array(
'%choice' => $v,
'!name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'],
), WATCHDOG_ERROR);
}
}
}
elseif ($elements['#value'] !== '' && !isset($options[$elements['#value']])) {
form_error($elements, t('An illegal choice has been detected. Please contact the site administrator.'));
watchdog('form', 'Illegal choice %choice in %name element.', array(
'%choice' => $elements['#value'],
'%name' => empty($elements['#title']) ? $elements['#parents'][0] : $elements['#title'],
), WATCHDOG_ERROR);
}
}
}
if (isset($elements['#element_validate'])) {
foreach ($elements['#element_validate'] as $function) {
if (function_exists($function)) {
$function($elements, $form_state, $form);
}
}
}
$elements['#webform_validated'] = TRUE;
}
}
function webform_client_form_pages($form, &$form_state) {
$node = node_load($form_state['values']['details']['nid']);
if (!isset($form_state['values']['submitted'])) {
$form_state['values']['submitted'] = array();
}
if (isset($form_state['webform']['component_tree'])) {
$form_state['storage']['component_tree'] = $form_state['webform']['component_tree'];
$form_state['storage']['page_count'] = $form_state['webform']['page_count'];
$form_state['storage']['page_num'] = $form_state['webform']['page_num'];
}
_webform_client_form_submit_process($node, $form_state['values']['submitted']);
$form_state['values']['submitted_tree'] = $form_state['values']['submitted'];
$form_state['values']['submitted'] = _webform_client_form_submit_flatten($node, $form_state['values']['submitted']);
$form_state['webform_completed'] = TRUE;
$submit_op = !empty($form['actions']['submit']['#value']) ? $form['actions']['submit']['#value'] : t('Submit');
$draft_op = !empty($form['actions']['draft']['#value']) ? $form['actions']['draft']['#value'] : t('Save Draft');
if (!in_array($form_state['values']['op'], array(
$submit_op,
$draft_op,
))) {
if (is_array($form_state['values']['submitted'])) {
foreach ($form_state['values']['submitted'] as $key => $val) {
$form_state['storage']['submitted'][$key] = $val;
}
}
if (isset($form_state['storage']['submitted'])) {
foreach ($form_state['storage']['submitted'] as $key => $val) {
$form_state['values']['submitted'][$key] = $val;
}
}
if (!isset($form_state['storage']['page_num'])) {
$form_state['storage']['page_num'] = 1;
}
if (end($form_state['clicked_button']['#parents']) == 'next') {
$direction = 1;
}
else {
$direction = 0;
}
if (isset($direction)) {
$components = $direction ? $node->webform['components'] : array_reverse($node->webform['components'], TRUE);
$last_component = end($node->webform['components']);
foreach ($components as $component) {
if ($component['type'] == 'pagebreak' && ($direction == 1 && $component['page_num'] > $form_state['storage']['page_num'] || $direction == 0 && $component['page_num'] <= $form_state['storage']['page_num'])) {
$previous_pagebreak = $component;
continue;
}
if (isset($previous_pagebreak)) {
$page_num = $previous_pagebreak['page_num'] + $direction - 1;
if ($component['page_num'] == $page_num && _webform_client_form_rule_check($node, $component, $page_num, $form_state)) {
$form_state['storage']['page_num'] = $page_num;
break;
}
elseif ($direction && $component['cid'] == $last_component['cid']) {
$form_state['storage']['page_num'] = $page_num + 1;
}
}
}
}
$form_state['webform_completed'] = $form_state['storage']['page_num'] > $form_state['storage']['page_count'];
}
if (isset($form_state['storage']['submitted'])) {
$original_values = is_array($form_state['values']['submitted']) ? $form_state['values']['submitted'] : array();
unset($form_state['values']['submitted']);
foreach ($form_state['storage']['submitted'] as $key => $val) {
$form_state['values']['submitted'][$key] = $val;
}
foreach ($original_values as $key => $val) {
$form_state['values']['submitted'][$key] = $val;
}
unset($original_values);
}
$form_state['save_draft'] = $form_state['values']['op'] == $draft_op || $node->webform['auto_save'] && !$form_state['webform_completed'];
if (!empty($form_state['save_draft']) || !$form_state['webform_completed']) {
$form_state['rebuild'] = TRUE;
}
else {
$form_state['rebuild'] = FALSE;
unset($form_state['storage']);
}
}
function webform_client_form_submit($form, &$form_state) {
module_load_include('inc', 'webform', 'includes/webform.submissions');
module_load_include('inc', 'webform', 'includes/webform.components');
global $user;
if (empty($form_state['save_draft']) && empty($form_state['webform_completed'])) {
return;
}
$node = $form['#node'];
$sid = $form_state['values']['details']['sid'] ? (int) $form_state['values']['details']['sid'] : NULL;
$is_draft = (int) (!empty($form_state['save_draft']));
if (!$sid) {
$submission = (object) array(
'nid' => $node->nid,
'uid' => $user->uid,
'submitted' => time(),
'remote_addr' => ip_address(),
'is_draft' => $is_draft,
'data' => webform_submission_data($node, $form_state['values']['submitted']),
);
}
else {
$submission = webform_get_submission($node->webform['nid'], $sid);
$submission->is_draft = $is_draft;
$new_data = webform_submission_data($node, $form_state['values']['submitted']);
$submission->data = $new_data + $submission->data;
}
if (empty($submission->data)) {
return;
}
if (!$sid) {
$form_state['values']['details']['sid'] = $sid = webform_submission_insert($node, $submission);
$form_state['values']['details']['is_new'] = TRUE;
if (variable_get('webform_use_cookies', 0)) {
$cookie_name = 'webform-' . $node->nid;
$time = time();
$params = session_get_cookie_params();
setcookie($cookie_name . '[' . $time . ']', $time, $time + $node->webform['submit_interval'] + 86400, $params['path'], $params['domain'], $params['secure']);
}
if (!$user->uid && user_access('access own webform submissions')) {
$_SESSION['webform_submission'][$form_state['values']['details']['sid']] = $node->nid;
}
}
else {
webform_submission_update($node, $submission);
$form_state['values']['details']['is_new'] = FALSE;
}
if (!$is_draft && !$form_state['values']['details']['finished']) {
$submission = webform_get_submission($node->webform['nid'], $sid, TRUE);
webform_submission_send_mail($node, $submission);
}
$confirmation = strlen(trim(strip_tags($node->webform['confirmation']))) ? $node->webform['confirmation'] : '';
$redirect_url = trim($node->webform['redirect_url']);
$redirect_url = _webform_filter_values($redirect_url, $node, $submission, NULL, FALSE, TRUE);
$redirect_url = preg_replace('/^' . preg_quote($GLOBALS['base_url'], '/') . '\\//', '', $redirect_url);
$message = NULL;
$redirect = NULL;
$external_url = FALSE;
if (isset($form['actions']['draft']['#value']) && $form_state['values']['op'] == $form['actions']['draft']['#value']) {
$message = t('Submission saved. You may return to this form later and it will restore the current values.');
}
elseif ($is_draft) {
$redirect = NULL;
}
elseif (!empty($form_state['values']['details']['finished'])) {
$message = t('Submission updated.');
}
elseif ($redirect_url == '<none>') {
$redirect = NULL;
}
elseif ($redirect_url == '<confirmation>') {
$redirect = array(
'node/' . $node->nid . '/done',
'sid=' . $sid,
);
}
elseif (valid_url($redirect_url, TRUE)) {
$redirect = $redirect_url;
$external_url = TRUE;
}
elseif ($redirect_url && strpos($redirect_url, 'http') !== 0) {
$parts = parse_url($redirect_url);
$query = $parts['query'] ? $parts['query'] . '&sid=' . $sid : 'sid=' . $sid;
$redirect = array(
$parts['path'],
$query,
$parts['fragment'],
);
}
if (isset($message)) {
drupal_set_message($message);
}
elseif (!$is_draft && !$external_url && (!empty($redirect_url) && $redirect_url != '<confirmation>') && !empty($confirmation)) {
drupal_set_message(check_markup($confirmation, $node->webform['confirmation_format'], FALSE));
}
$form_state['redirect'] = $redirect;
}
function _webform_client_form_submit_process($node, &$form_values, $types = NULL, $parent = 0) {
if (is_array($form_values)) {
foreach ($form_values as $form_key => $value) {
$cid = webform_get_cid($node, $form_key, $parent);
if (is_array($value) && isset($node->webform['components'][$cid]['type']) && webform_component_feature($node->webform['components'][$cid]['type'], 'group')) {
_webform_client_form_submit_process($node, $form_values[$form_key], $types, $cid);
}
if (isset($node->webform['components'][$cid])) {
$component = $node->webform['components'][$cid];
if ((!isset($types) || in_array($component['type'], $types)) && webform_component_implements($component['type'], 'submit')) {
$form_values[$component['form_key']] = webform_component_invoke($component['type'], 'submit', $component, $form_values[$component['form_key']]);
}
}
}
}
}
function _webform_client_form_submit_flatten($node, $fieldset, $parent = 0) {
$values = array();
if (is_array($fieldset)) {
foreach ($fieldset as $form_key => $value) {
$cid = webform_get_cid($node, $form_key, $parent);
if (is_array($value) && webform_component_feature($node->webform['components'][$cid]['type'], 'group')) {
$values += _webform_client_form_submit_flatten($node, $value, $cid);
}
else {
$values[$cid] = $value;
}
}
}
return $values;
}
function _webform_confirmation($node) {
drupal_set_title(check_plain($node->title));
webform_set_breadcrumb($node);
$sid = isset($_GET['sid']) ? $_GET['sid'] : NULL;
return theme(array(
'webform_confirmation_' . $node->nid,
'webform_confirmation',
), $node, $sid);
}
function template_preprocess_webform_form(&$vars) {
drupal_add_css(drupal_get_path('module', 'webform') . '/css/webform.css');
drupal_add_js(drupal_get_path('module', 'webform') . '/js/webform.js');
if (isset($vars['form']['details']['nid']['#value'])) {
$vars['nid'] = $vars['form']['details']['nid']['#value'];
}
elseif (isset($vars['form']['submission']['#value'])) {
$vars['nid'] = $vars['form']['submission']['#value']->nid;
}
}
function template_preprocess_webform_confirmation(&$vars) {
$confirmation = check_markup($vars['node']->webform['confirmation'], $vars['node']->webform['confirmation_format'], FALSE);
$vars['confirmation_message'] = strlen(trim(strip_tags($confirmation))) ? $confirmation : '';
}
function template_preprocess_webform_mail_message(&$vars) {
global $user;
$vars['user'] = $user;
$vars['ip_address'] = ip_address();
}
function webform_element_title_display($element) {
if (isset($element['#title_display']) && strcmp($element['#title_display'], 'none') === 0) {
$element['#title'] = NULL;
}
return $element;
}
function webform_element_wrapper($content, $elements) {
if (isset($elements['#theme_wrappers'])) {
foreach ($elements['#theme_wrappers'] as $theme_wrapper) {
$content = theme($theme_wrapper, $elements, $content);
}
}
return $content;
}
function theme_webform_element($element, $value) {
$wrapper_classes = array(
'form-item',
);
$output = '<div class="' . implode(' ', $wrapper_classes) . '" id="' . $element['#id'] . '-wrapper">' . "\n";
$required = !empty($element['#required']) ? '<span class="form-required" title="' . t('This field is required.') . '">*</span>' : '';
if (!empty($element['#title'])) {
$title = $element['#title'];
$output .= ' <label for="' . $element['#id'] . '">' . t('!title: !required', array(
'!title' => filter_xss_admin($title),
'!required' => $required,
)) . "</label>\n";
}
$output .= '<div id="' . $element['#id'] . '">' . $value . '</div>' . "\n";
if (!empty($element['#description'])) {
$output .= ' <div class="description">' . $element['#description'] . "</div>\n";
}
$output .= "</div>\n";
return $output;
}
function theme_webform_element_wrapper($element, $content) {
if (isset($element['#format']) && $element['#format'] == 'html') {
$type = 'display';
}
else {
$type = isset($element['#type']) && !in_array($element['#type'], array(
'markup',
'textfield',
'webform_email',
'webform_number',
)) ? $element['#type'] : $element['#webform_component']['type'];
}
$nested_level = $element['#parents'][0] == 'submitted' ? 1 : 0;
$parents = str_replace('_', '-', implode('--', array_slice($element['#parents'], $nested_level)));
$wrapper_classes = array(
'webform-component',
'webform-component-' . $type,
);
if (isset($element['#title_display']) && strcmp($element['#title_display'], 'inline') === 0) {
$wrapper_classes[] = 'webform-container-inline';
}
$output = '';
$output .= '<div class="' . implode(' ', $wrapper_classes) . '" id="webform-component-' . $parents . '">';
$output .= $content;
$output .= '</div>';
return $output;
}
function theme_webform_element_text($element, $value) {
$output = '';
$is_group = webform_component_feature($element['#webform_component']['type'], 'group');
if (isset($element['#title'])) {
if ($is_group) {
$output .= '--' . $element['#title'] . '--';
}
elseif (!in_array(drupal_substr($element['#title'], -1), array(
'?',
':',
'!',
'%',
';',
'@',
))) {
$output .= $element['#title'] . ':';
}
else {
$output .= $element['#title'];
}
}
if ($is_group && drupal_strlen($value) > 65) {
$value = wordwrap($value, 65, "\n");
$lines = explode("\n", $value);
foreach ($lines as $key => $line) {
$lines[$key] = ' ' . $line;
}
$value = implode("\n", $lines);
}
$output .= (strpos($value, "\n") === FALSE ? ' ' : "\n") . $value;
if ($is_group) {
$lines = explode("\n", $output);
foreach ($lines as $number => $line) {
if (strlen($line)) {
$lines[$number] = ' ' . $line;
}
}
$output = implode("\n", $lines);
$output .= "\n";
}
if ($output) {
$output .= "\n";
}
return $output;
}
function theme_webform_mail_headers($node, $submission, $email) {
$headers = array(
'X-Mailer' => 'Drupal Webform (PHP/' . phpversion() . ')',
);
return $headers;
}
function _webform_fetch_draft_sid($nid, $uid) {
$result = db_query("SELECT * FROM {webform_submissions} WHERE nid = %d AND uid = %d AND is_draft = 1 ORDER BY submitted DESC", $nid, $uid);
$row = db_fetch_array($result);
if (isset($row['sid'])) {
return (int) $row['sid'];
}
return FALSE;
}
function _webform_filter_values($string, $node = NULL, $submission = NULL, $email = NULL, $strict = TRUE, $allow_anonymous = FALSE) {
global $user;
static $replacements;
if (strlen(trim($string)) == 0) {
return $string;
}
if (!isset($replacements)) {
$replacements['unsafe'] = array();
$replacements['safe']['%site'] = variable_get('site_name', 'drupal');
$replacements['safe']['%date'] = format_date(time(), 'large');
}
if (isset($node) && !array_key_exists('%nid', $replacements['safe'])) {
$replacements['safe']['%nid'] = $node->nid;
$replacements['safe']['%title'] = $node->title;
}
$format = isset($email['html']) && $email['html'] ? 'html' : 'text';
if (isset($submission) && (!isset($replacements['email'][$format]) || isset($replacements['unsafe']['%sid']) && $replacements['unsafe']['%sid'] != $submission->sid)) {
module_load_include('inc', 'webform', 'includes/webform.components');
$replacements['unsafe']['%sid'] = $submission->sid;
$replacements['email'][$format] = array();
foreach ($submission->data as $cid => $value) {
$component = $node->webform['components'][$cid];
$parents = webform_component_parent_keys($node, $component);
$form_key = implode('][', $parents);
$display_element = webform_component_invoke($component['type'], 'display', $component, $value['value'], $format);
$display_element['#webform_component'] = $component;
if (empty($display_element['#parents'])) {
$display_element['#parents'] = array_merge(array(
'submitted',
), $parents);
}
if (empty($display_element['#id'])) {
$display_element['#id'] = form_clean_id('edit-' . implode('-', $display_element['#parents']));
}
$replacements['email'][$format]['%email[' . $form_key . ']'] = drupal_render($display_element);
$replacements['email'][$format]['%value[' . $form_key . ']'] = isset($display_element['#children']) ? $display_element['#children'] : '';
}
$missing_components = array_diff_key($node->webform['components'], $submission->data);
foreach ($missing_components as $component) {
$parents = webform_component_parent_keys($node, $component);
$form_key = implode('][', $parents);
$replacements['email'][$format]['%email[' . $form_key . ']'] = '';
$replacements['email'][$format]['%value[' . $form_key . ']'] = '';
}
$replacements['unsafe']['%submission_url'] = url('node/' . $node->nid . '/submission/' . $submission->sid, array(
'absolute' => TRUE,
));
}
if (isset($submission) && isset($email)) {
$replacements['email'][$format]['%email_values'] = webform_submission_render($node, $submission, $email, $format);
}
$special_tokens = array(
'safe' => array(
'%get' => $_GET,
'%post' => $_POST,
),
'unsafe' => array(
'%cookie' => isset($_COOKIE) ? $_COOKIE : array(),
'%session' => isset($_SESSION) ? $_SESSION : array(),
'%request' => $_REQUEST,
'%server' => $_SERVER,
'%profile' => (array) $user,
),
);
if (!isset($replacements['specials_set'])) {
$replacements['specials_set'] = TRUE;
if ($user->uid) {
$account = user_load($user->uid);
$special_tokens['unsafe']['%profile'] = (array) $account;
}
if (!array_key_exists('%uid', $replacements['unsafe'])) {
$replacements['unsafe']['%uid'] = !empty($user->uid) ? $user->uid : '';
$replacements['unsafe']['%username'] = isset($user->name) ? $user->name : '';
$replacements['unsafe']['%useremail'] = isset($user->mail) ? $user->mail : '';
$replacements['unsafe']['%ip_address'] = ip_address();
}
foreach ($special_tokens as $safe_state => $tokens) {
foreach ($tokens as $token => $variable) {
if (!is_array($variable)) {
continue;
}
foreach ($variable as $key => $value) {
if ($token == '%profile' && is_array($value) && isset($value['year'])) {
$replacement = webform_strtodate(webform_date_format(), $value['month'] . '/' . $value['day'] . '/' . $value['year'], 'UTC');
}
else {
$replacement = is_string($value) || is_bool($value) || is_numeric($value) ? $value : '';
}
$replacements[$safe_state][$token . '[' . $key . ']'] = $replacement;
}
}
}
}
$safe_replacements = $replacements['safe'];
if ($user->uid || $allow_anonymous) {
$safe_replacements += $replacements['unsafe'];
if (isset($replacements['email'][$format])) {
$safe_replacements += $replacements['email'][$format];
}
}
else {
foreach ($replacements['unsafe'] as $key => $value) {
$safe_replacements[$key] = '';
}
}
$find = array_keys($safe_replacements);
$replace = array_values($safe_replacements);
$string = str_replace($find, $replace, $string);
foreach ($special_tokens as $safe_state => $tokens) {
foreach (array_keys($tokens) as $token) {
$string = preg_replace('/\\' . $token . '\\[\\w+\\]/', '', $string);
}
}
return $strict ? _webform_filter_xss($string) : $string;
}
function _webform_filter_descriptions($string, $node = NULL, $submission = NULL) {
return strlen($string) == 0 ? '' : check_markup(_webform_filter_values($string, $node, $submission, NULL, FALSE));
}
function _webform_filter_xss($string) {
static $allowed_tags;
$allowed_tags = isset($allowed_tags) ? $allowed_tags : webform_variable_get('webform_allowed_tags');
return filter_xss($string, $allowed_tags);
}
function webform_ensure_record(&$node) {
if (!$node->webform['record_exists']) {
$node->webform['record_exists'] = TRUE;
webform_node_insert($node);
}
return $node->webform['record_exists'];
}
function webform_check_record(&$node) {
$webform = $node->webform;
$webform['record_exists'] = FALSE;
unset($webform['nid']);
$webform = array_filter($webform);
$defaults = array_filter(webform_node_defaults());
if ($webform == $defaults && !in_array($node->type, webform_variable_get('webform_node_types_primary'))) {
webform_node_delete($node);
$node->webform = webform_node_defaults();
}
return $node->webform['record_exists'];
}
function webform_get_cid(&$node, $form_key, $pid) {
foreach ($node->webform['components'] as $cid => $component) {
if ($component['form_key'] == $form_key && $component['pid'] == $pid) {
return $cid;
}
}
}
function webform_variable_get($variable) {
switch ($variable) {
case 'webform_allowed_tags':
$result = variable_get('webform_allowed_tags', array(
'a',
'em',
'strong',
'code',
'img',
));
break;
case 'webform_default_from_name':
$result = variable_get('webform_default_from_name', variable_get('site_name', ''));
break;
case 'webform_default_from_address':
$result = variable_get('webform_default_from_address', variable_get('site_mail', ini_get('sendmail_from')));
break;
case 'webform_default_subject':
$result = variable_get('webform_default_subject', t('Form submission from: %title'));
break;
case 'webform_node_types':
$result = variable_get('webform_node_types', array(
'webform',
));
break;
case 'webform_node_types_primary':
$result = variable_get('webform_node_types_primary', array(
'webform',
));
break;
}
return $result;
}
function theme_webform_token_help($groups = array()) {
$groups = empty($groups) ? array(
'basic',
'node',
'special',
) : $groups;
static $tokens = array();
if (empty($tokens)) {
$tokens['basic'] = array(
'title' => t('Basic tokens'),
'tokens' => array(
'%username' => t('The name of the user if logged in. Blank for anonymous users.'),
'%useremail' => t('The e-mail address of the user if logged in. Blank for anonymous users.'),
'%ip_address' => t('The IP address of the user.'),
'%site' => t('The name of the site (i.e. %site_name)', array(
'%site_name' => variable_get('site_name', ''),
)),
'%date' => t('The current date, formatted according to the site settings.'),
),
);
$tokens['node'] = array(
'title' => t('Node tokens'),
'tokens' => array(
'%nid' => t('The node ID.'),
'%title' => t('The node title.'),
),
);
$tokens['special'] = array(
'title' => t('Special tokens'),
'tokens' => array(
'%profile[' . t('key') . ']' => t('Any user profile field or value, such as %profile[name] or %profile[profile_first_name]'),
'%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".'),
'%post[' . t('key') . ']' => t('Tokens may also be populated from POST values that are submitted by forms.'),
),
'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].'),
);
$tokens['email'] = array(
'title' => t('E-mail tokens'),
'tokens' => array(
'%email_values' => t('All included components in a hierarchical structure.'),
'%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.'),
'%submission_url' => t('The URL for viewing the completed submission.'),
),
);
$tokens['submission'] = array(
'title' => t('Submission tokens'),
'tokens' => array(
'%sid' => t('The unique submission ID.'),
'%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.'),
),
);
}
$output = '';
$output .= '<p>' . t('You may use special tokens in this field that will be replaced with dynamic values.') . '</p>';
foreach ($tokens as $group_name => $group) {
if (!is_array($groups) || in_array($group_name, $groups)) {
$items = array();
foreach ($group['tokens'] as $token => $token_description) {
$items[] = $token . ' - ' . $token_description;
}
$output .= theme('item_list', $items, $group['title']);
$output .= isset($group['description']) ? '<p>' . $group['description'] . '</p>' : '';
}
}
$fieldset = array(
'#title' => t('Token values'),
'#type' => 'fieldset',
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#children' => '<div>' . $output . '</div>',
);
return theme('fieldset', $fieldset);
}
function _webform_safe_name($name) {
$new = trim($name);
if (function_exists('transliteration_get')) {
$new = transliteration_get($new, '');
$new = str_replace(array(
' ',
'-',
'/',
), array(
'_',
'_',
'_',
), $new);
}
else {
$new = str_replace(array(
' ',
'-',
'/',
'€',
'ƒ',
'Š',
'Ž',
'š',
'ž',
'Ÿ',
'¢',
'¥',
'µ',
'À',
'Á',
'Â',
'Ã',
'Ä',
'Å',
'Ç',
'È',
'É',
'Ê',
'Ë',
'Ì',
'Í',
'Î',
'Ï',
'Ñ',
'Ò',
'Ó',
'Ô',
'Õ',
'Ö',
'Ø',
'Ù',
'Ú',
'Û',
'Ü',
'Ý',
'à',
'á',
'â',
'ã',
'ä',
'å',
'ç',
'è',
'é',
'ê',
'ë',
'ì',
'í',
'î',
'ï',
'ñ',
'ò',
'ó',
'ô',
'õ',
'ö',
'ø',
'ù',
'ú',
'û',
'ü',
'ý',
'ÿ',
'Œ',
'œ',
'Æ',
'Ð',
'Þ',
'ß',
'æ',
'ð',
'þ',
), 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',
), $new);
}
$new = drupal_strtolower($new);
$new = preg_replace('/[^a-z0-9_]/', '', $new);
return $new;
}
function webform_format_email_address($address, $name, $node = NULL, $submission = NULL, $encode = TRUE, $single = TRUE, $format = NULL) {
if (!isset($format)) {
$format = variable_get('webform_email_address_format', 'long');
}
if ($name == 'default') {
$name = webform_variable_get('webform_default_from_name');
}
elseif (is_numeric($name) && isset($node->webform['components'][$name])) {
if (isset($submission->data[$name]['value'])) {
$name = $submission->data[$name]['value'];
}
else {
$name = t('Value of !component', array(
'!component' => $node->webform['components'][$name]['name'],
));
}
}
if ($address == 'default') {
$address = webform_variable_get('webform_default_from_address');
}
elseif (is_numeric($address) && isset($node->webform['components'][$address])) {
if (isset($submission->data[$address]['value'])) {
$values = $submission->data[$address]['value'];
$address = array();
foreach ($values as $value) {
$address = array_merge($address, explode(',', $value));
}
}
else {
$address = t('Value of "!component"', array(
'!component' => $node->webform['components'][$address]['name'],
));
}
}
if ($single) {
$address = is_array($address) ? reset($address) : $address;
$name = is_array($name) ? reset($name) : $name;
}
if (is_array($address)) {
foreach ($address as $key => $individual_address) {
$address[$key] = _webform_filter_values($individual_address, $node, $submission, NULL, FALSE, TRUE);
}
}
else {
$address = _webform_filter_values($address, $node, $submission, NULL, FALSE, TRUE);
}
if ($format == 'long' && !empty($name)) {
$name = _webform_filter_values($name, $node, $submission, NULL, FALSE, TRUE);
if ($encode) {
$name = mime_header_encode($name);
}
$name = trim($name);
return '"' . $name . '" <' . $address . '>';
}
else {
return $address;
}
}
function webform_format_email_subject($subject, $node = NULL, $submission = NULL) {
if ($subject == 'default') {
$subject = webform_variable_get('webform_default_subject');
}
elseif (is_numeric($subject) && isset($node->webform['components'][$subject])) {
$component = $node->webform['components'][$subject];
if (isset($submission->data[$subject]['value'])) {
$display_function = '_webform_display_' . $component['type'];
$value = $submission->data[$subject]['value'];
if (function_exists($display_function)) {
$display = $display_function($component, $value, 'text');
$display['#theme_wrappers'] = array();
$display['#webform_component'] = $component;
$subject = str_replace("\n", ' ', drupal_render($display));
}
else {
$subject = $value;
}
}
else {
$subject = t('Value of "!component"', array(
'!component' => $component['name'],
));
}
}
if (is_array($subject)) {
$subject = reset($subject);
}
return _webform_filter_values($subject, $node, $submission, NULL, FALSE, TRUE);
}
function _webform_components_tree_build($src, &$tree, $parent, &$page_count) {
foreach ($src as $cid => $component) {
if ($component['pid'] == $parent) {
_webform_components_tree_build($src, $component, $cid, $page_count);
if ($component['type'] == 'pagebreak') {
$page_count++;
}
$tree['children'][$cid] = $component;
$tree['children'][$cid]['page_num'] = $page_count;
}
}
return $tree;
}
function _webform_components_tree_flatten($tree) {
$components = array();
foreach ($tree as $cid => $component) {
if (isset($component['children'])) {
unset($component['children']);
$components[$cid] = $component;
$children = _webform_components_tree_flatten($tree[$cid]['children']);
foreach ($children as $ccid => $ccomponent) {
$components[$ccid] = $ccomponent;
}
}
else {
$components[$cid] = $component;
}
}
return $components;
}
function _webform_components_sort($a, $b) {
if ($a['weight'] == $b['weight']) {
return strcasecmp($a['name'], $b['name']);
}
return $a['weight'] < $b['weight'] ? -1 : 1;
}
function _webform_components_tree_sort($tree) {
if (isset($tree['children']) && is_array($tree['children'])) {
$children = array();
uasort($tree['children'], '_webform_components_sort');
foreach ($tree['children'] as $cid => $component) {
$children[$cid] = _webform_components_tree_sort($component);
}
$tree['children'] = $children;
}
return $tree;
}
function webform_components($include_disabled = FALSE, $reset = FALSE) {
static $components, $disabled;
if (!isset($components) || $reset) {
$components = array();
$disabled = array_flip(variable_get('webform_disabled_components', array()));
foreach (module_implements('webform_component_info') as $module) {
$module_components = module_invoke($module, 'webform_component_info');
foreach ($module_components as $type => $info) {
$module_components[$type]['module'] = $module;
$module_components[$type]['enabled'] = !array_key_exists($type, $disabled);
}
$components += $module_components;
}
drupal_alter('webform_component_info', $components);
ksort($components);
}
return $include_disabled ? $components : array_diff_key($components, $disabled);
}
function webform_component_options($include_disabled = FALSE) {
$component_info = webform_components($include_disabled);
$options = array();
foreach ($component_info as $type => $info) {
$options[$type] = $info['label'];
}
return $options;
}
function webform_component_include($component_type) {
static $included = array();
if (!isset($included[$component_type])) {
$components = webform_components(TRUE);
$included[$component_type] = TRUE;
if (($info = $components[$component_type]) && isset($info['file'])) {
$pathinfo = pathinfo($info['file']);
$basename = basename($pathinfo['basename'], '.' . $pathinfo['extension']);
$path = (!empty($pathinfo['dirname']) ? $pathinfo['dirname'] . '/' : '') . $basename;
module_load_include($pathinfo['extension'], $info['module'], $path);
}
}
}
function webform_component_invoke($type, $callback) {
$args = func_get_args();
$type = array_shift($args);
$callback = array_shift($args);
$function = '_webform_' . $callback . '_' . $type;
webform_component_include($type);
if (function_exists($function)) {
return call_user_func_array($function, $args);
}
}
function webform_component_implements($type, $callback) {
$function = '_webform_' . $callback . '_' . $type;
webform_component_include($type);
return function_exists($function);
}
function webform_disable_page_cache() {
if (function_exists('drupal_page_is_cacheable')) {
drupal_page_is_cacheable(FALSE);
}
else {
$GLOBALS['conf']['cache'] = CACHE_DISABLED;
}
}
function webform_set_breadcrumb($node, $submission = NULL) {
$breadcrumb = drupal_get_breadcrumb();
if (isset($node)) {
$webform_breadcrumb = array();
$webform_breadcrumb[] = array_shift($breadcrumb);
$webform_breadcrumb[] = l($node->title, 'node/' . $node->nid);
if (isset($submission)) {
$last_link = array_shift($breadcrumb);
$webform_breadcrumb[] = l(t('Submissions'), 'node/' . $node->nid . '/submissions');
if (isset($last_link)) {
$webform_breadcrumb[] = $last_link;
}
}
$breadcrumb = $webform_breadcrumb;
}
drupal_set_breadcrumb($breadcrumb);
}
function webform_date_array($string, $type = NULL) {
$pattern = '/((\\d{4}?)-(\\d{2}?)-(\\d{2}?))?(T?(\\d{2}?):(\\d{2}?):(\\d{2}?))?/';
$matches = array();
preg_match($pattern, $string, $matches);
$matches += array_fill(0, 9, '');
$return = array();
if ($type == 'date' || !isset($type)) {
$return['year'] = $matches[2] !== '' ? (int) $matches[2] : '';
$return['month'] = $matches[3] !== '' ? (int) $matches[3] : '';
$return['day'] = $matches[4] !== '' ? (int) $matches[4] : '';
}
if ($type == 'time' || !isset($type)) {
$return['hour'] = $matches[6] !== '' ? (int) $matches[6] : '';
$return['minute'] = $matches[7] !== '' ? (int) $matches[7] : '';
$return['second'] = $matches[8] !== '' ? (int) $matches[8] : '';
}
return $return;
}
function webform_date_string($array, $type = NULL) {
$string = '';
if ($type == 'date' || !isset($type)) {
$string .= empty($array['year']) ? '0000' : sprintf('%04d', $array['year']);
$string .= '-';
$string .= empty($array['month']) ? '00' : sprintf('%02d', $array['month']);
$string .= '-';
$string .= empty($array['day']) ? '00' : sprintf('%02d', $array['day']);
}
if (!isset($type)) {
$string .= 'T';
}
if ($type == 'time' || !isset($type)) {
$string .= empty($array['hour']) ? '00' : sprintf('%02d', $array['hour']);
$string .= ':';
$string .= empty($array['minute']) ? '00' : sprintf('%02d', $array['minute']);
$string .= ':';
$string .= empty($array['second']) ? '00' : sprintf('%02d', $array['second']);
}
return $string;
}
function webform_date_format($size = 'medium') {
$format = variable_get('date_format_' . $size, 'D, m/d/Y - H:i');
$time = 'aABgGhHisueIOPTZ';
$day_of_week = 'Dlw';
$special = ',-: ';
$date_format = trim($format, $time . $day_of_week . $special);
if (!preg_match('/[dj]/', $date_format) || !preg_match('/[FmMn]/', $date_format) || !preg_match('/[oYy]/', $date_format)) {
$date_format = 'm/d/Y';
}
return $date_format;
}
function webform_strtodate($format, $string, $timezone_name = NULL) {
global $user;
if (variable_get('configurable_timezones', 1) && $timezone_name == 'user' && $user->uid) {
$timezone_name = isset($GLOBALS['user']->timezone_name) ? $GLOBALS['user']->timezone_name : NULL;
}
if (empty($timezone_name) || $timezone_name == 'user') {
$timezone_name = variable_get('date_default_timezone_name', NULL);
}
if (!empty($timezone_name) && class_exists('DateTimeZone')) {
try {
@($timezone = new DateTimeZone($timezone_name));
@($datetime = new DateTime($string, $timezone));
return @$datetime
->format($format);
} catch (Exception $e) {
return '';
}
}
else {
return date($format, strtotime($string));
}
}
function webform_strtotime($date) {
$current_tz = date_default_timezone_get();
date_default_timezone_set('UTC');
$timestamp = strtotime($date);
date_default_timezone_set($current_tz);
return $timestamp;
}
function webform_tt($name, $string, $langcode = NULL, $update = FALSE) {
if (function_exists('tt')) {
return tt($name, $string, $langcode, $update);
}
else {
return $string;
}
}
function webform_email_html_capable() {
return module_exists('mimemail');
}
function webform_views_api() {
return array(
'api' => 2.0,
'path' => drupal_get_path('module', 'webform') . '/views',
);
}
function webform_content_extra_fields($type_name) {
$extra = array();
if (in_array($type_name, webform_variable_get('webform_node_types'))) {
$extra['webform'] = array(
'label' => t('Webform'),
'description' => t('Webform client form.'),
'weight' => 10,
);
}
return $extra;
}
function webform_mollom_form_list() {
$forms = array();
$webform_types = webform_variable_get('webform_node_types');
if (empty($webform_types)) {
return $forms;
}
$placeholders = db_placeholders($webform_types, 'varchar');
$result = db_query("SELECT n.title, n.nid FROM {webform} w LEFT JOIN {node} n ON w.nid = n.nid WHERE n.type IN ({$placeholders})", $webform_types);
while ($node = db_fetch_object($result)) {
$form_id = 'webform_client_form_' . $node->nid;
$forms[$form_id] = array(
'title' => t('@name form', array(
'@name' => $node->title,
)),
'entity' => 'webform',
'delete form' => 'webform_submission_delete_form',
);
}
return $forms;
}
function webform_mollom_form_info($form_id) {
module_load_include('inc', 'webform', 'includes/webform.components');
$nid = drupal_substr($form_id, 20);
$node = node_load($nid);
$form_info = array(
'title' => t('@name form', array(
'@name' => $node->title,
)),
'mode' => MOLLOM_MODE_ANALYSIS,
'bypass access' => array(
'edit all webform submissions',
'edit any webform content',
),
'entity' => 'webform',
'elements' => array(),
'mapping' => array(
'post_id' => 'details][sid',
'author_id' => 'details][uid',
),
);
foreach ($node->webform['components'] as $cid => $component) {
if (webform_component_feature($component['type'], 'spam_analysis')) {
$parents = implode('][', webform_component_parent_keys($node, $component));
$form_info['elements']['submitted][' . $parents] = check_plain(t($component['name']));
}
}
foreach ($node->webform['emails'] as $email) {
if (!isset($form_info['mapping']['post_title'])) {
$cid = $email['subject'];
if (is_numeric($cid)) {
$parents = implode('][', webform_component_parent_keys($node, $node->webform['components'][$cid]));
$form_info['mapping']['post_title'] = 'submitted][' . $parents;
}
}
if (!isset($form_info['mapping']['author_name'])) {
$cid = $email['from_name'];
if (is_numeric($cid)) {
$parents = implode('][', webform_component_parent_keys($node, $node->webform['components'][$cid]));
$form_info['mapping']['author_name'] = 'submitted][' . $parents;
}
}
if (!isset($form_info['mapping']['author_mail'])) {
$cid = $email['from_address'];
if (is_numeric($cid)) {
$parents = implode('][', webform_component_parent_keys($node, $node->webform['components'][$cid]));
$form_info['mapping']['author_mail'] = 'submitted][' . $parents;
}
}
}
return $form_info;
}