'',
'form_key' => NULL,
'pid' => 0,
'weight' => 0,
'value' => '4',
'mandatory' => 0,
'email' => 1,
'extra' => array(
'admin_display' => 'stars',
'field_prefix' => '',
'field_suffix' => '',
'disabled' => 0,
'unique' => 0,
'description' => '',
'attributes' => array(),
'default_value' => 0,
'count_zero_ratings' => 0,
),
);
}
/**
* Implements _webform_edit_component().
*/
function _webform_edit_fivestar($component) {
$form = array();
// Disabling the description if not wanted.
$form['description'] = array();
$form['value'] = array(
'#type' => 'radios',
'#title' => t('Number of stars'),
'#default_value' => $component['value'],
'#description' => t('The number of stars to display'),
'#weight' => 5,
'#required' => TRUE,
'#options' => array(
'2' => t('Two stars'),
'3' => t('Three stars'),
'4' => t('Four stars'),
'5' => t('Five stars'),
'6' => t('Six stars'),
'7' => t('Seven stars'),
'8' => t('Eight stars'),
'9' => t('Nine stars'),
'10' => t('Ten stars'),
),
);
$form['extra']['count_zero_ratings'] = array(
'#type' => 'radios',
'#title' => t('Count zero ratings'),
'#default_value' => $component['extra']['count_zero_ratings'],
'#description' => t('Use zero ratings in calculations of averages.'),
'#weight' => 6,
'#required' => TRUE,
'#options' => array(
'0' => t('No'),
'1' => t('Yes'),
),
);
$form['extra']['default_value'] = array(
'#type' => 'radios',
'#title' => t('Default number of stars'),
'#default_value' => $component['extra']['default_value'],
'#description' => t('The default number of stars to mark when the user first looks at the form.'),
'#weight' => 5,
'#required' => TRUE,
'#options' => array(
'0' => t('None'),
'50' => t('Half'),
'100' => t('All'),
),
);
$form['display']['admin_display'] = array(
'#type' => 'radios',
'#title' => t('Administration display settings'),
'#default_value' => isset($component['extra']['admin_display']) ? $component['extra']['admin_display'] : 'stars',
'#description' => t('Chooses between displaying results in absolute or starred values.'),
'#weight' => 5,
'#options' => array(
'stars' => t('Use stars in the results display.'),
'percentage' => t('Use numbers in the results display.'),
),
'#parents' => array('extra', 'admin_display'),
);
return $form;
}
/**
* Implements _webform_render_component().
*/
function _webform_render_fivestar($component, $value = NULL, $filter = TRUE) {
$element = array(
'#type' => 'fivestar',
'#title' => $component['name'],
'#stars' => $component['value'],
'#default_value' => $component['extra']['default_value'],
'#required' => $component['mandatory'],
'#weight' => $component['weight'],
'#description' => $component['extra']['description'],
'#attributes' => $component['extra']['attributes'],
'#prefix' => '
',
'#suffix' => '
',
'#webform_component' => $component,
'#element_validate' => array(),
'#title_display' => $component['extra']['title_display'] ? $component['extra']['title_display'] : 'before',
'#theme_wrappers' => array('webform_element'),
);
// If resuming the form, put in the current value
if (isset($value)) {
$element['#default_value'] = $value[0];
}
return $element;
}
/**
* Implements _webform_display_component().
*/
function _webform_display_fivestar($component, $value, $format = 'html') {
/*
* Component holds values for this instance of fivestar.
* $component['value'] hold the number of stars to show
*/
// We are using fivestar's theme function, so add in it's CSS
drupal_add_css(drupal_get_path('module', 'fivestar') . '/css/fivestar.css');
return array(
'#title' => $component['name'],
'#weight' => $component['weight'],
'#theme' => $component['extra']['admin_display'] == 'stars' ? 'fivestar_static' : 'webform_fivestar_formatter_percentage',
'#theme_wrappers' => $format == 'html' ? array('webform_element') : array('webform_element_text'),
'#post_render' => array('webform_element_wrapper'),
'#component' => $component,
'#format' => $format,
'#rating' => $value[0],
'#stars' => $component['value'],
);
}
/**
* Implements _webform_analysis_component().
*/
function _webform_analysis_fivestar($component, $sids = array(), $single = FALSE) {
$submission_count = 0;
$rating_total = 0;
$star_weight = (100/$component['value']);
$ranges = array_fill(0, $component['value']+1, '0');
// Generate a lookup table of results.
$query = db_select('webform_submitted_data', 'wsd')
->fields('wsd', array('no', 'data'))
->condition('nid', $component['nid'])
->condition('cid', $component['cid'])
->condition('data', '', '<>')
->groupBy('no')
->groupBy('data');
$query->addExpression('COUNT(sid)', 'datacount');
if (count($sids)) {
$query->condition('sid', $sids, 'IN');
}
$result = $query->execute();
foreach ($result as $data) {
$submission_count ++;
$rating_total += $data->data;
$stars = ceil($data->data / $star_weight);
$ranges[$stars] ++;
}
if ($component['extra']['count_zero_ratings']) {
//Calculating of average with zero ratings
$average_rating = $submission_count ? round(($rating_total/$submission_count), 1) : 0;
$rows[] = array( t('Average rating (using zero ratings)'), $average_rating . '%');
}
else { //Calculating of average without zero ratings
$average_rating = $submission_count ? round($rating_total/($submission_count- $ranges[0]), 1) : 0;
$rows[] = array( t('Average rating (without using zero ratings)'), $average_rating . '%');
}
// Special case of zero percent
if (!empty($ranges[0])) {
$rows[]= array( t('Number of 0 star reviews (0%)'), empty($ranges[0]) ? 0 : $ranges[0] );
}
for ($i = 1; $i <= $component['value']; $i++) {
$ranges[$i] = empty($ranges[$i]) ? 0 : $ranges[$i];
$lower_bound = round($star_weight*($i-1)) ;
$upper_bound = round($star_weight*$i);
$row_name = t('Number of !i star reviews (>!lower_bound% - !upper_bound%) ', array('!i' => $i, '!lower_bound' => $lower_bound, '!upper_bound' => $upper_bound ));
$rows[] = array( $row_name, $ranges[$i]);
}
$row_name = '' . t('Total number of submissions') . '';
$row_value = '' . $submission_count . '';
$rows[] = array($row_name , $row_value);
return $rows;
}
/**
* Implements _webform_table_component().
*/
function _webform_table_fivestar($component, $value) {
return _webform_fivestar_render_score($component, $value[0]);
}
/**
* Implements _webform_csv_headers_component().
*/
function _webform_csv_headers_fivestar($component, $export_options) {
$header = array();
$header[2] = array($component['name']);
return $header;
}
/**
* Implements _webform_csv_data_component().
*/
function _webform_csv_data_fivestar($component, $export_options, $value) {
return $value;
}
/**
* Our helper function to return rendered static fivestar output.
*
* @param $component
* A Webform component array.
* @param $score
* The rating(value) to display as a percentage.
* @return
* Themed HTML output of stars.
*/
function _webform_fivestar_render_score($component, $score) {
if (isset($component['extra']['admin_display'])) {
if ($component['extra']['admin_display'] == 'stars') {
$output = theme('fivestar_static', array(
'rating' => $score,
'stars' => $component['value'],
)
);
// We are using fivestar's theme function, so add in it's CSS
drupal_add_css(drupal_get_path('module', 'fivestar') . '/css/fivestar.css');
}
else {
$output = $score . '%';
}
}
return $output;
}