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;
+}