Index: components/vocabulary.inc =================================================================== RCS file: components/vocabulary.inc diff -N components/vocabulary.inc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ components/vocabulary.inc 23 Sep 2007 20:21:58 -0000 @@ -0,0 +1,375 @@ +vid] = $v->name; + } + $edit_fields['extra']['vocabulary'] = array( + '#type' => 'select', + '#title' => t("Vocabulary"), + '#options' => $vocabularies, + '#default_value' => $currfield['extra']['vocabulary'], + '#description' => t('The terms of this vocabulary can be selected by the user'), + '#weight' => -2, + '#required' => TRUE, + ); + $edit_fields['extra']['multiple'] = array( + '#type' => 'checkbox', + '#title' => t("Multiple"), + '#return_value' => 'Y', + '#default_value' => ($currfield['extra']['multiple']=='Y'?TRUE:FALSE), + '#description' => t('Check this option if the user should be allowed to choose multiple values.'), + ); + $edit_fields['extra']['aslist'] = array( + '#type' => 'checkbox', + '#title' => t("Listbox"), + '#return_value' => 'Y', + '#default_value' => ($currfield['extra']['aslist']=='Y'?TRUE:FALSE), + '#description' => t('Check this option if you want the select component to be of listbox type instead of radiobuttons or checkboxes.'), + ); + return $edit_fields; +} + +/** + * function webform_render_vocabulary + * 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 + * @returns An array of a form item to be displayed on the client-side webform + **/ +function _webform_render_vocabulary($component) { + $form_item = array( + '#title' => htmlspecialchars($component['name'], ENT_QUOTES), + '#required' => $component['mandatory'], + '#weight' => $component['weight'], + '#description' => _webform_filtervalues($component['extra']['description']), + '#prefix' => '
', + '#suffix' => '
', + ); + + if ($component['extra']['aslist'] == 'Y' && $component['extra']['multiple'] != 'Y') { + $options = array('' => t('select...')); + } + else { + $options = array(); + } + + // Extract terms from user-selected vocabulary + $tree = taxonomy_get_tree($component['extra']['vocabulary']); + if ($tree && count($tree) > 0) { + foreach ($tree as $term) { + $options[$term->name] = str_repeat('-', $term->depth). $term->name; + } + } + $default_value = current($options); // first element of the array is the default value + + // Set the component options + $form_item['#options'] = $options; + + // Set the default value + if ($default_value) { + // Convert default value to a list if necessary + if ($component['extra']['multiple'] == 'Y') { + if (strpos($default_value, ',')) { + $varray = explode(',', $default_value); + foreach ($varray as $key => $v) { + if (array_key_exists(_webform_safe_name($v), $options)) { + $form_item['#default_value'][] = _webform_safe_name($v); + } + else { + $form_item['#default_value'][] = $v; + } + } + } + else { + if (array_key_exists(_webform_safe_name($default_value), $options)) { + $form_item['#default_value'] = _webform_safe_name($default_value); + } + else { + $form_item['#default_value'] = $default_value; + } + } + } + else { + if (array_key_exists(_webform_safe_name($default_value), $options)) { + $form_item['#default_value'] = _webform_safe_name($default_value); + } + else { + $form_item['#default_value'] = $default_value; + } + } + } + + if ($component['extra']['aslist'] == 'Y') { + // Set display as a select list: + $form_item['#type'] = 'select'; + if ($component['extra']['multiple'] == 'Y') { + $form_item['#multiple'] = TRUE; + } + } + else { + if ($component['extra']['multiple'] == 'Y') { + // Set display as a checkbox set + $form_item['#type'] = 'checkboxes'; + + } + else { + // Set display as a radio set + $form_item['#type'] = 'radios'; + } + } + return $form_item; +} + + +/** + * function _webform_submission_display_vocabulary + * 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 + * @returns Textual output formatted for human reading. + **/ +function _webform_submission_display_vocabulary($data, $component) { + $form_item = _webform_render_vocabulary($component); + if ($component['extra']['multiple'] == 'Y') { + // Set the value as an array + foreach ((array)$data['value'] as $key => $value) { + if (array_key_exists(_webform_safe_name($value), $form_item['#options'])) { + $form_item['#default_value'][] = _webform_safe_name($value); + } + else { + $form_item['#default_value'][] = $value; + } + } + } + else { + // Set the value as a single string + foreach ((array)$data['value'] as $value) { + if ($value !== '0') { + if (array_key_exists(_webform_safe_name($value), $form_item['#options'])) { + $form_item['#default_value'] = _webform_safe_name($value); + } + else { + $form_item['#default_value'] = $value; + } + break; + } + } + } + $form_item['#attributes'] = array("disabled" => "disabled"); + return $form_item; +} + + +/** + * function webform_submit_vocabulary + * Translates the submitted 'safe' form values back into their un-edited original form + * @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 + * @returns Nothing + **/ +function _webform_submit_vocabulary(&$data, $component) { + $value = _webform_filtervalues($component['value']); + $tree = taxonomy_get_tree($component['extra']['vocabulary']); + if ($tree && count($tree) > 0) { + foreach ($tree as $term) { + $options[$term->name] = str_repeat('-', $term->depth). $term->name; + } + } + + if (is_array($data)) { + foreach ($data as $key => $value) { + if ($value) { + $data[$key] = $options[$key]; + } + } + } + elseif (!empty($data)) { + $data = $options[$data]; + } +} + +/** + * theme_webform_mail_vocabulary + * Format the output of emailed data for this component + * + * @param mixed $data A string or array of the submitted data + * @param array $component An array of information describing the component, directly correlating to the webform_component database schema + * @returns string Textual output to be included in the email + */ +function theme_webform_mail_vocabulary($data, $component) { + // Extract terms from user-selected vocabulary + $tree = taxonomy_get_tree($component['extra']['vocabulary']); + if ($tree && count($tree) > 0) { + foreach ($tree as $term) { + $options[$term->name] = str_repeat('-', $term->depth). $term->name; + } + } + $options = array(); + + // Generate the output + if ($component['extra']['multiple']) { + $output = $component['name'] .":\n"; + foreach ($data as $value) { + if ($value) { + if ($options[$value]) { + $output .= " • ". $options[$value] ."\n"; + } + else { + $output .= " • ". $options[_webform_safe_name($value)] ."\n"; + } + } + } + } + else { + $output = $component['name'] .": ". $data ."\n"; + } + return $output; +} + +/** + * function _webform_help_vocabulary + * Module specific instance of hook_help + **/ +function _webform_help_vocabulary($section) { + switch ($section) { + case 'admin/settings/webform#vocabulary_description': + $output = t("Allows creation of checkboxes, radio buttons, or select menus with taxonomy terms."); + break; + } + return $output; +} + +/** + * function _webform_analysis_view_vocabulary + * 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 + * @returns An array of data rows, each containing a statistic for this component's submissions. + **/ +function _webform_analysis_rows_vocabulary($component) { + $component['extra'] = unserialize($component['extra']); + // Extract terms from user-selected vocabulary + $tree = taxonomy_get_tree($component['extra']['vocabulary']); + if ($tree && count($tree) > 0) { + foreach ($tree as $term) { + $options[$term->name] = str_repeat('-', $term->depth). $term->name; + } + } + $options = array(); + + $query = 'SELECT data, count(data) as datacount '. + ' FROM {webform_submitted_data} '. + ' WHERE nid = %d '. + ' AND cid = %d '. + " AND data != '0' AND data != '' ". + ' GROUP BY data '; + $result = db_query($query, $component['nid'], $component['cid']); + $rows = array(); + while ($data = db_fetch_array($result)) { + if ($options[$data['data']]) { + $display_option = $options[$data['data']]; + } + else { + $display_option = $data['data']; + } + $rows[] = array($display_option, $data['datacount']); + } + return $rows; +} + +/** + * function _webform_table_data_vocabulary + * 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 + * @returns Textual output formatted for human reading. + **/ +function _webform_table_data_vocabulary($data) { + // Set the value as a single string + if (is_array($data['value'])) { + foreach ($data['value'] as $value) { + if ($value !== '0') { + $output .= check_plain($value) ."
"; + } + } + } + else { + $output = check_plain(empty($data['value']['0']) ? "" : $data['value']['0']); + } + return $output; +} + + +/** + * function _webform_csv_headers_vocabulary + * 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 + * @returns 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_vocabulary($component) { + $header = array(); + $header[0] = ''; + + if ($component['extra']['multiple']) { + $header[1] = $component['name']; + $tree = taxonomy_get_tree($component['extra']['vocabulary']); + if ($tree && count($tree) > 0) { + foreach ($tree as $term) { + $items[] = $term->name; + } + } + foreach ($items as $item) { + $header[2] .= "\,". $item; + } + // Remove the preceding extra comma + $header[2] = substr($header[2], 2); + } + else { + $header[2] = $component['name']; + } + return $header; +} + +/** + * function _webform_csv_data_vocabulary + * 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 + * @returns Textual output formatted for CSV, not including either prefixed or trailing commas + **/ +function _webform_csv_data_vocabulary($data, $component) { + $value = _webform_filtervalues($component['value']); + $options = array(); + // Extract terms from user-selected vocabulary + $tree = taxonomy_get_tree($component['extra']['vocabulary']); + if ($tree && count($tree) > 0) { + foreach ($tree as $term) { + $options[$term->name] = $term->name; + } + } + + if ($component['extra']['multiple']) { + foreach ($options as $key => $item) { + if (in_array($key, (array)$data['value']) === true) { + $output .= '\,Yes'; + } + else { + $output .= '\,No'; + } + } + // Remove the preceding extra comma + $output = substr($output, 2); + } + else { + $output = $data['value'][0]; + } + return $output; +}