View source
<?php
define('WEBFORM_CALCULATOR_REGEX', '/\\{\\w+\\}/');
function webform_calculator_webform_component_info() {
$components = array();
$components['formula'] = array(
'label' => t('Formula'),
'description' => t('Computes values of other fields.'),
'features' => array(
'required' => FALSE,
),
'file' => 'components/formula.inc',
'conditional_type' => 'numeric',
);
return $components;
}
function webform_calculator_webform_submission_presave($node, &$submission) {
foreach ($node->webform['components'] as $component) {
if ($component['type'] == 'formula') {
$submission->data[$component['cid']][0] = webform_calculator_replace_formula_values($component, $node, $submission);
}
}
foreach ($node->webform['components'] as $component) {
if ($component['type'] == 'formula') {
$submission->data[$component['cid']][0] = webform_calculator_replace_formula_values($component, $node, $submission);
}
}
}
function webform_calculator_eval($formula, $precision = 1, $separator = '', $point = '.') {
module_load_include('php', 'webform_calculator', 'matheval.class');
$parser = new WebformEvalMath();
$result = $parser
->evaluate($formula);
$result = (string) round($result, $precision);
if ($separator || $point != '.') {
$pieces = explode($point, $result);
$pieces[0] = number_format($pieces[0], 0, '.', $separator);
$result = implode($point, $pieces);
}
return $result;
}
function webform_calculator_theme() {
return array(
webform_component_invoke('formula', 'theme'),
);
}
function webform_calculator_get_components_from_formula($formula) {
$components = array();
if (preg_match_all(WEBFORM_CALCULATOR_REGEX, $formula, $matches)) {
foreach ((array) $matches[0] as $match) {
$components[] = str_replace(array(
'{',
'}',
), array(
'',
'',
), $match);
}
}
return $components;
}
function webform_calculator_replace_formula_values($formula_component, $webform_node, $submission) {
$formula = $formula_component['value'];
$components_from_formula = webform_calculator_get_components_from_formula($formula);
$components_by_key = array();
foreach ($webform_node->webform['components'] as $component) {
$components_by_key[$component['form_key']] = $component;
}
foreach ($components_from_formula as $component_key) {
if (isset($components_by_key[$component_key])) {
$component = $components_by_key[$component_key];
$values = $submission->data[$component['cid']];
$sum = 0;
foreach ($values as $value) {
$sum += $value;
}
$formula = str_replace('{' . $component_key . '}', '(' . $sum . ')', $formula);
}
}
try {
return webform_calculator_eval($formula, $formula_component['extra']['precision']);
} catch (Exception $e) {
watchdog_exception('webform_calculator', $e);
return 0;
}
}
function webform_calculator_form_builder_element_types($form_type, $form_id) {
if ($form_type == 'webform') {
drupal_add_css(drupal_get_path('module', 'webform_calculator') . '/formula.css');
$fields = array(
'formula' => array(
'title' => t('Formula'),
'weight' => -30,
'properties' => array(
'title',
'value',
'description',
'field_prefix',
'field_suffix',
'hidden',
'size',
'title_display',
'error_message',
'precision',
),
),
);
if (function_exists('_form_builder_webform_default')) {
$fields['formula']['default'] = _form_builder_webform_default('formula', array(), array(
'name' => t('New formula'),
));
}
return $fields;
}
}
function webform_calculator_form_builder_preview_alter(&$element, $form_type, $form_id) {
if ($form_type == 'webform' && $element['#webform_component']['type'] == 'formula') {
$element['#attributes']['placeholder'] = $element['#webform_component']['value'];
}
}