webform3.php in Webform steps 7.2
This file contains functions needed to add the webform-7.x-4.x progressbar to webform-7.x-3.x.
Code is largely copied from the webform module.
File
webform_steps_w3/webform3.phpView source
<?php
/**
* @file
* This file contains functions needed to add the webform-7.x-4.x progressbar
* to webform-7.x-3.x.
*
* Code is largely copied from the webform module.
*/
/**
* Implements hook_theme().
*/
function webform_steps_w3_theme() {
$theme['webform_progressbar'] = array(
'variables' => array(
'node' => NULL,
'page_num' => NULL,
'page_count' => NULL,
'page_labels' => array(),
),
'template' => 'templates/webform-progressbar',
);
return $theme;
}
/**
* Implements hook_theme_registry_alter().
*/
function webform_steps_w3_theme_registry_alter(&$theme) {
$hook =& $theme['webform_form'];
if ($hook['theme path'] == drupal_get_path('module', 'webform')) {
$w3 = drupal_get_path('module', 'webform_steps_w3');
$hook['template'] = $w3 . '/templates/webform-form';
}
}
/**
* Prepare for theming of the webform progressbar.
*/
function template_preprocess_webform_progressbar(&$vars) {
// Add CSS used by the progress bar.
drupal_add_css(drupal_get_path('module', 'webform_steps_w3') . '/css/webform_steps_w3.css');
$vars['progressbar_page_number'] = $vars['node']->webform['progressbar_page_number'];
$vars['progressbar_percent'] = $vars['node']->webform['progressbar_percent'];
$vars['progressbar_bar'] = $vars['node']->webform['progressbar_bar'];
$vars['progressbar_pagebreak_labels'] = $vars['node']->webform['progressbar_pagebreak_labels'];
$vars['percent'] = ($vars['page_num'] - 1) / ($vars['page_count'] - 1) * 100;
}
/**
* Add the progressbar to a webform_client_form().
*/
function webform_steps_w3_progressbar(&$form, &$form_state) {
$node = $form['#node'];
if (isset($form['submitted'])) {
$page_count = $form_state['webform']['page_count'];
$page_num = $form_state['webform']['page_num'];
if ($page_count > 1) {
$page_labels = webform_steps_w3_page_labels($node, $form_state);
$form['progressbar'] = array(
'#theme' => 'webform_progressbar',
'#node' => $node,
'#page_num' => $page_num,
'#page_count' => count($page_labels),
'#page_labels' => $page_labels,
'#weight' => -100,
);
}
}
}
/**
* Find the label of a given page based on page breaks.
*
* @param $webform
* The webform node.
* @param $form_state
* The form's state, if available
* @return array
* An array of all page labels, indexed by page number.
*/
function webform_steps_w3_page_labels($node, $form_state = array()) {
$page_count = 1;
$page_labels = array();
$page_labels[0] = $node->webform['progressbar_label_first'];
foreach ($node->webform['components'] as $component) {
if ($component['type'] == 'pagebreak') {
$page_labels[$page_count] = $component['name'];
$page_count++;
}
}
return $page_labels;
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function webform_steps_w3_form_webform_configure_form_alter(&$form, &$form_state) {
$node = $form['#node'];
/* Start progress bar settings form */
$form['progressbar'] = array(
'#type' => 'fieldset',
'#title' => t('Progress bar'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
'#weight' => 15,
);
$progress_bar_style = array();
foreach (array(
'page_number',
'percent',
'bar',
'pagebreak_labels',
) as $name) {
if (!empty($node->webform['progressbar_' . $name])) {
$progress_bar_style[] = 'progressbar_' . $name;
}
}
$form['progressbar']['webform_progressbar_style'] = array(
'#type' => 'checkboxes',
'#title' => t('Progress bar style'),
'#options' => array(
'progressbar_bar' => t('Show progress bar'),
'progressbar_page_number' => t('Show page number as number of completed (i.e. Page 1 of 10)'),
'progressbar_percent' => t('Show percentage completed (i.e. 10%)'),
'progressbar_pagebreak_labels' => t('Show page labels from page break components'),
),
'#default_value' => $progress_bar_style,
'#description' => t('Choose how the progress bar should be displayed for multi-page forms.'),
);
$form['progressbar']['progressbar_label_first'] = array(
'#type' => 'textfield',
'#title' => t('First page label'),
'#default_value' => $node->webform['progressbar_label_first'],
'#maxlength' => 255,
'#description' => t('The first page label in the progress bar. Subseqent pages are titled by their page break label.'),
'#states' => array(
'visible' => array(
':input[name="webform_progressbar_style[progressbar_pagebreak_labels]"]' => array(
'checked' => TRUE,
),
),
),
);
/* End progress bar settings form */
// Add our own submit-handler right after webform_configure_submit().
$submit = array();
foreach ($form['#submit'] as $handler) {
$submit[] = $handler;
if ($handler == 'webform_configure_form_submit') {
$submit[] = 'webform_steps_w3_webform_configure_form_submit';
}
}
$form['#submit'] = $submit;
}
/**
* Submit callback for webform_steps_w3_webform_configure_form_alter().
*/
function webform_steps_w3_webform_configure_form_submit($form, &$form_state) {
$node = $form['#node'];
// Set the progress bar preferences.
$progress_bar_settings = array_filter($form_state['values']['webform_progressbar_style']);
$node->webform['progressbar_page_number'] = (int) in_array('progressbar_page_number', $progress_bar_settings);
$node->webform['progressbar_percent'] = (int) in_array('progressbar_percent', $progress_bar_settings);
$node->webform['progressbar_bar'] = (int) in_array('progressbar_bar', $progress_bar_settings);
$node->webform['progressbar_pagebreak_labels'] = (int) in_array('progressbar_pagebreak_labels', $progress_bar_settings);
$node->webform['progressbar_label_first'] = $form_state['values']['progressbar_label_first'];
}
/**
* Implements hook_webform_node_defaults_alter().
*/
function webform_steps_w3_webform_node_defaults_alter(&$defaults) {
$defaults += webform_steps_w3_node_defaults();
}
/**
* Implements hook_node_load().
*/
function webform_steps_w3_node_load($nodes, $types) {
// Quick check to see if we need to do anything at all for these nodes.
$webform_types = webform_variable_get('webform_node_types');
if (count(array_intersect($types, $webform_types)) == 0) {
return;
}
$defaults = webform_steps_w3_node_defaults();
// Select all webforms that match these node IDs.
$q = db_select('webform', 'w');
$q
->leftJoin('webform_steps_w3_progressbar', 'settings', 'w.nid=settings.nid');
$q
->addfield('settings', 'nid', 'has_settings');
$result = $q
->fields('w', array(
'nid',
))
->fields('settings', array_keys($defaults))
->condition('w.nid', array_keys($nodes), 'IN')
->execute()
->fetchAllAssoc('nid', PDO::FETCH_ASSOC);
foreach ($result as $nid => $settings) {
// Add progressbar settings to each node.
if ($settings['has_settings']) {
unset($settings['has_settings']);
$nodes[$nid]->webform += $settings;
}
else {
$nodes[$nid]->webform += $defaults;
}
}
}
/**
* Implements hook_form_FORM_ID_alter().
*/
function webform_steps_w3_form_webform_admin_settings_alter(&$form, &$form_state) {
$form['#submit'][] = 'webform_steps_w3_admin_settings_submit';
$form['progressbar'] = array(
'#type' => 'fieldset',
'#title' => t('Progress bar'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['progressbar']['webform_progressbar_style'] = array(
'#type' => 'checkboxes',
'#title' => t('Progress bar style'),
'#options' => array(
'progressbar_bar' => t('Show progress bar'),
'progressbar_page_number' => t('Show page number as number of completed (i.e. Page 1 of 10)'),
'progressbar_percent' => t('Show percentage completed (i.e. 10%)'),
'progressbar_pagebreak_labels' => t('Show page labels from page break components'),
'progressbar_include_confirmation' => t('Include confirmation page in progress bar'),
),
'#default_value' => webform_steps_w3_variable_get('webform_progressbar_style'),
'#description' => t('Choose how the progress bar should be displayed for multi-page forms.'),
);
$form['progressbar']['webform_progressbar_label_first'] = array(
'#type' => 'textfield',
'#title' => t('First page label'),
'#default_value' => webform_steps_w3_variable_get('webform_progressbar_label_first'),
'#maxlength' => 255,
);
}
/**
* Submit handler for webform_steps_w3_form_webform_admin_settings_alter().
*/
function webform_steps_w3_webform_admin_settings_submit($form, &$form_state) {
// Trim out empty options in the progress bar options.
$form_state['values']['webform_progressbar_style'] = array_keys(array_filter($form_state['values']['webform_progressbar_style']));
}
Functions
Name![]() |
Description |
---|---|
template_preprocess_webform_progressbar | Prepare for theming of the webform progressbar. |
webform_steps_w3_form_webform_admin_settings_alter | Implements hook_form_FORM_ID_alter(). |
webform_steps_w3_form_webform_configure_form_alter | Implements hook_form_FORM_ID_alter(). |
webform_steps_w3_node_load | Implements hook_node_load(). |
webform_steps_w3_page_labels | Find the label of a given page based on page breaks. |
webform_steps_w3_progressbar | Add the progressbar to a webform_client_form(). |
webform_steps_w3_theme | Implements hook_theme(). |
webform_steps_w3_theme_registry_alter | Implements hook_theme_registry_alter(). |
webform_steps_w3_webform_admin_settings_submit | Submit handler for webform_steps_w3_form_webform_admin_settings_alter(). |
webform_steps_w3_webform_configure_form_submit | Submit callback for webform_steps_w3_webform_configure_form_alter(). |
webform_steps_w3_webform_node_defaults_alter | Implements hook_webform_node_defaults_alter(). |