'',
'form_key' => NULL,
'pid' => 0,
'weight' => 0,
'value' => '',
'mandatory' => 0,
'email' => 1,
'extra' => array(
'check_daylight_savings' => 0,
'year_start' => '1900',
'year_end' => '2050',
'year_textfield' => 0,
'description' => '',
),
);
}
/**
* Create a set of form items to be displayed on the form for editing this
* component. Use care naming the form items, as this correlates directly to the
* database schema. The component "Name" and "Description" fields are added to
* every component type and are not necessary to specify here (although they may
* be overridden if desired).
* @return
* An array of form items to be displayed on the edit component page.
*/
function _webform_edit_date($currfield) {
$edit_fields = array();
$edit_fields['value'] = array(
'#type' => 'textfield',
'#title' => t('Default value'),
'#default_value' => $currfield['value'],
'#description' => t('The default value of the field.') .'
'. t('Accepts any date in any GNU Date Input Format. Strings such as today, +2 months, and Dec 9 2004 are all valid.'),
'#size' => 60,
'#maxlength' => 127,
'#weight' => 0,
);
$edit_fields['extra']['timezone'] = array(
'#type' => 'radios',
'#title' => t('Timezone'),
'#default_value' => empty($currfield['extra']['timezone']) ? 'site' : $currfield['extra']['timezone'],
'#description' => t('Adjust the date according to a specific timezone. Website timezone is defined in the Site Settings and is the default.', array('!settings' => url('admin/settings/date-time'))),
'#options' => array('site' => t('Website timezone'), 'user' => t('User timezone'), 'gmt' => t('GMT')),
'#weight' => 1,
);
$edit_fields['extra']['check_daylight_savings'] = array(
'#type' => 'checkbox',
'#title' => t('Observe Daylight Savings'),
'#default_value' => $currfield['extra']['check_daylight_savings'],
'#checked_value' => 1,
'#description' => t('Automatically adjust the time during daylight savings.'),
'#weight' => 2,
);
$edit_fields['extra']['year_start'] = array(
'#type' => 'textfield',
'#title' => t('Start year'),
'#default_value' => empty($currfield['extra']['year_start']) ? '1900' : $currfield['extra']['year_start'],
'#description' => t('The first year that is allowed to be entered.'),
'#size' => 10,
'#maxlength' => 4,
'#weight' => 3,
);
$edit_fields['extra']['year_end'] = array(
'#type' => 'textfield',
'#title' => t('End year'),
'#default_value' => empty($currfield['extra']['year_end']) ? '2050' : $currfield['extra']['year_end'],
'#description' => t('The last year that is allowed to be entered.'),
'#size' => 10,
'#maxlength' => 4,
'#weight' => 4,
);
$edit_fields['extra']['year_textfield'] = array(
'#type' => 'checkbox',
'#title' => t('Use a textfield for year'),
'#default_value' => $currfield['extra']['year_textfield'],
'#description' => t('If checked, the generated date field will use a textfield for the year. Otherwise it will use a select list.'),
'#weight' => 5,
);
return $edit_fields;
}
/**
* Build a form item array containing all the properties of this component.
* @param $component
* An array of information describing the component, directly correlating to
* the webform_component database schema.
* @return
* An array of a form item to be displayed on the client-side webform.
*/
function _webform_render_date($component) {
$form_item = array(
'#title' => $component['name'],
'#weight' => $component['weight'],
'#type' => 'date',
'#description' => _webform_filter_descriptions($component['extra']['description']),
'#prefix' => '
',
'#suffix' => '
',
'#required' => $component['mandatory'],
'#webform_component' => $component,
'#process' => array('webform_expand_date' => array()),
'#validate' => array('webform_validate_date' => array($component)),
);
return $form_item;
}
function webform_expand_date($element) {
$component = $element['#webform_component'];
// Set defaults according to existing #default_value (set by Form API)
if (isset($element['month']['#default_value']) || isset($element['day']['#default_value']) || isset($element['year']['#default_value'])) {
$default_values = array(
'month' => $element['month']['#default_value'],
'day' => $element['day']['#default_value'],
'year' => $element['year']['#default_value'],
);
// Remove the default values, or the elements will be forced into month/day/year order.
unset($element['month']);
unset($element['day']);
unset($element['year']);
}
// Or, if none, use set the defaults of the component.
elseif (drupal_strlen($component['value']) > 0) {
// Calculate the timestamp in GMT.
$timestamp = strtotime(_webform_filter_values($component['value']));
if ($component['extra']['timezone'] == 'user') {
// Use the users timezone.
global $user;
$timestamp += (int)$user->timezone;
}
elseif ($component['extra']['timezone'] == 'gmt') {
// Use GMT.
$timestamp += 0;
}
else {
// Use the Drupal site time.
$timestamp += variable_get('date_default_timezone', 0);
}
// Check for daylight savings time.
if ($component['extra']['check_daylight_savings'] && date('I')) {
$timestamp += 3600;
}
$default_values = array(
'day' => gmdate('j', $timestamp),
'month' => gmdate('n', $timestamp),
'year' => gmdate('Y', $timestamp),
);
}
else {
$default_values = array(
'day' => NULL,
'month' => NULL,
'year' => NULL,
);
}
// Let Drupal do it's normal expansion.
$element = expand_date($element);
// Set default values.
foreach ($default_values as $type => $value) {
switch ($type) {
case 'month':
$none = t('Month');
break;
case 'day':
$none = t('Day');
break;
case 'year':
$none = t('Year');
break;
}
unset($element[$type]['#value']);
$element[$type]['#default_value'] = isset($default_values[$type]) ? $default_values[$type] : NULL;
$element[$type]['#options'] = array('' => $none) + $element[$type]['#options'];
}
// Tweak the year field.
if ($component['extra']['year_textfield']) {
$element['year']['#type'] = 'textfield';
$element['year']['#size'] = 5;
$element['year']['#maxlength'] = 4;
unset($element['year']['#options']);
}
elseif (is_numeric($component['extra']['year_start']) && is_numeric($component['extra']['year_end'])) {
$element['year']['#options'] = array('' => t('Year')) + drupal_map_assoc(range($component['extra']['year_start'], $component['extra']['year_end']));
}
return $element;
}
/**
* Element validation for Webform date fields.
*/
function webform_validate_date($form_item, $component) {
$component = $form_item['#webform_component'];
$form_key = $component['form_key'];
$name = $component['name'];
// Check if the user filled the required fields.
foreach (array('day', 'month', 'year') as $field_type) {
if (!is_numeric($form_item[$field_type]['#value']) && $form_item['#required']) {
form_set_error($form_key, t('!name field is required.', array('!name' => $name)));
return;
}
}
// Check for a valid date.
if ($form_item['month']['#value'] !== '' || $form_item['day']['#value'] !== '' || $form_item['year']['#value'] !== '') {
if (!checkdate((int)$form_item['month']['#value'], (int)$form_item['day']['#value'], (int)$form_item['year']['#value'])) {
form_set_error($form_key, t('Entered !name is not a valid date.', array('!name' => $name)));
return;
}
}
// Check the date is between allowed years.
if ($form_item['year']['#value'] !== '' && is_numeric($component['extra']['year_start']) && is_numeric($component['extra']['year_end'])) {
if ($form_item['year']['#value'] < $component['extra']['year_start'] || $form_item['year']['#value'] > $component['extra']['year_end']) {
form_set_error($form_key .'][year', t('The entered date needs to be between the years @start and @end.', array('@start' => $component['extra']['year_start'], '@end' => $component['extra']['year_end'])));
return;
}
}
}
/**
* Convert internationalized Date formats into the US order expected by Webform.
*
* @param $data
* The POST data associated with the component.
* @param $component
* An array of information describing the component, directly correlating to
* the webform_component database schema.
* @return
* Nothing.
*/
function _webform_submit_date(&$data, $component) {
// Webform stores dates in month/day/year rows.
// Ensure consistency when using international date formats.
$data = array($data['month'], $data['day'], $data['year']);
}
/**
* Display the result of a textfield submission. The output of this function
* will be displayed under the "results" tab then "submissions".
* @param $data
* An array of information containing the submission result, directly
* correlating to the webform_submitted_data database schema.
* @param $component
* An array of information describing the component, directly correlating to
* the webform_component database schema.
* @param $enabled
* If enabled, the value may be changed. Otherwise it will set to readonly.
* @return
* Textual output formatted for human reading.
*/
function _webform_submission_display_date($data, $component, $enabled = FALSE) {
$form_item = _webform_render_date($component);
$form_item['month']['#default_value'] = $data['value']['0'];
$form_item['day']['#default_value'] = $data['value']['1'];
$form_item['year']['#default_value'] = $data['value']['2'];
$form_item['#disabled'] = !$enabled;
return $form_item;
}
/**
* Format the output of emailed data for this component
*
* @param $data
* A string or array of the submitted data
* @param $component
* An array of information describing the component,
* directly correlating to the webform_component database schema.
* @return string
* Textual output to be included in the email.
*/
function theme_webform_mail_date($data, $component) {
$output = $component['name'] .':';
if ($data[0] && $data[1]) {
$timestamp = strtotime($data[0] .'/'. $data[1] .'/'. $data[2]);
$format = webform_date_format('medium');
$output .= ' '. format_date($timestamp, 'custom', $format, 0);
}
return $output;
}
/**
* Module specific instance of hook_help().
*/
function _webform_help_date($section) {
switch ($section) {
case 'admin/settings/webform#date_description':
return t('Presents month, day, and year fields.');
}
}
/**
* Calculate and returns statistics about results for this component from all
* submission to this webform. The output of this function will be displayed
* under the "results" tab then "analysis".
* @param $component
* An array of information describing the component, directly correlating to
* the webform_component database schema
* @param $sids
* An optional array of submission IDs (sid). If supplied, the analysis will be limited
* to these sids.
* @return
* An array of data rows, each containing a statistic for this component's
* submissions.
*/
function _webform_analysis_rows_date($component, $sids = array()) {
$placeholders = count($sids) ? array_fill(0, count($sids), "'%s'") : array();
$sidfilter = count($sids) ? " AND sid in (".implode(",", $placeholders).")" : "";
$query = 'SELECT no,data '.
' FROM {webform_submitted_data} '.
' WHERE nid = %d '.
' AND cid = %d '. $sidfilter.
' ORDER BY sid,no ASC ';
$result = db_query($query, array_merge(array($component['nid'], $component['cid']), $sids));
// build an array of timestamps from entered values.
$timestamps = array();
$submissions = 1;
while ($row = db_fetch_array($result)) {
if ($row['no'] == '0') {
$submissions++;
$month = $row['data'];
if ($row = db_fetch_array($result)) {
if ($row['no'] == '1') {
$day = $row['data'];
if ($row = db_fetch_array($result)) {
if ($row['no'] == '2') {
$year = $row['data'];
// Build the full timestamp.
if (drupal_strlen($month) > 0 && drupal_strlen($day) > 0 && drupal_strlen($year) > 0) {
$timestamp = strtotime($month .'/'. $day .'/'. $year);
// Add usefull information about this date into an array.
$timestamps[$timestamp] = array(
date('l', $timestamp), // Day of the week (Monday, Tuesday, etc.).
date('F', $timestamp), // Full Month name (January, February, etc.).
$year, // Year.
$day, // Day of the month (1,2,...,31).
);
}
}
}
}
}
}
}
// Display stats.
// TODO: display date statistics in javascript tabs.
$nonblanks = count($timestamps);
$rows[0] = array( t('Left Blank'), ($submissions - $nonblanks));
$rows[1] = array( t('User entered value'), $nonblanks);
return $rows;
}
/**
* Return the result of this component's submission for display in a table. The
* output of this function will be displayed under the "results" tab then "table".
* @param $data
* An array of information containing the submission result, directly
* correlating to the webform_submitted_data database schema
* @return
* Textual output formatted for human reading.
*/
function _webform_table_data_date($data) {
if (drupal_strlen($data['value']['0']) > 0 && drupal_strlen($data['value']['1']) > 0 && drupal_strlen($data['value']['2']) > 0) {
$timestamp = strtotime($data['value']['0'] ."/". $data['value']['1'] ."/". $data['value']['2']);
$format = webform_date_format('short');
return date($format, $timestamp);
}
else {
return '';
}
}
/**
* Return the header information for this component to be displayed in a comma
* seperated value file. The output of this function will be displayed under the
* "results" tab then "download".
* @param $component
* An array of information describing the component, directly correlating to
* the webform_component database schema.
* @return
* An array of data to be displayed in the first three rows of a CSV file, not
* including either prefixed or trailing commas.
*/
function _webform_csv_headers_date($component) {
$header = array();
$header[0] = '';
$header[1] = '';
$header[2] = $component['name'];
return $header;
}
/**
* Return the result of a textfield submission. The output of this function will
* be displayed under the "results" tab then "submissions".
* @param $data
* An array of information containing the submission result, directly
* correlating to the webform_submitted_data database schema.
* @return
* Textual output formatted for CSV, not including either prefixed or trailing
* commas.
*/
function _webform_csv_data_date($data) {
if (drupal_strlen($data['value']['0']) > 0 && drupal_strlen($data['value']['1']) > 0 && drupal_strlen($data['value']['2']) > 0) {
$timestamp = strtotime($data['value']['0'] .'/'. $data['value']['1'] .'/'. $data['value']['2']);
$format = webform_date_format('short');
return date($format, $timestamp);
}
else {
return '';
}
}
/**
* Get a date format according to the site settings.
*
* @param $size
* A choice of 'short', 'medium', or 'long' date formats.
*/
function webform_date_format($size = 'medium') {
// Format date according to site's given format.
$format = variable_get('date_format_'. $size, 'D, m/d/Y - H:i');
$time = 'aABgGhHisueIOPTZ';
$day_of_week = 'Dlw';
$special = ',-: ';
return trim($format, $time . $day_of_week . $special);
}