diff --git a/gender.install b/gender.install index 635c6d8..be13b8a 100644 --- a/gender.install +++ b/gender.install @@ -12,9 +12,23 @@ function gender_field_schema($field) { $schema = array(); $schema['columns'] = array( - 'value' => array( + 'part_1' => array( 'type' => 'varchar', - 'length' => 255, + 'length' => 32, + 'not null' => TRUE, + ), + 'part_2' => array( + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + ), + 'part_3' => array( + 'type' => 'varchar', + 'length' => 32, + 'not null' => TRUE, + ), + 'part_4' => array( + 'type' => 'text', 'not null' => FALSE, ), ); diff --git a/gender.module b/gender.module index db945e4..4650dc3 100644 --- a/gender.module +++ b/gender.module @@ -14,12 +14,10 @@ function gender_field_info() { $fields['gender'] = array( 'label' => t('Gender'), 'description' => t('This field stores gender in the database.'), - 'settings' => array('allowed_values' => gender_options(), 'allowed_values_function' => ''), + 'settings' => array(), + 'instance_settings' => array(), 'default_widget' => 'gender_default', - 'default_formatter' => 'list_default', - 'behaviors' => array( - 'multiple values' => FIELD_BEHAVIOR_CUSTOM, - ), + 'default_formatter' => 'gender_default', ); return $fields; @@ -29,42 +27,121 @@ function gender_field_info() { * Implements hook_field_is_empty(). */ function gender_field_is_empty($item, $field) { - return empty($item['value']); + return empty($item['part_1']) && empty($item['part_2']) && empty($item['part_3']) && empty($item['part_4']); } /** - * Implements hook_field_widget_info_alter(). + * Implements hook_field_widget_info(). */ -function gender_field_widget_info_alter(&$info) { - $info['select_or_other_buttons']['field types'][] = 'gender'; +function gender_field_widget_info() { + $widgets = array(); + + $widgets['gender_default'] = array( + 'label' => t('Gender'), + 'field types' => array( + 'gender', + ), + 'settings' => array(), + 'behaviors' => array( + 'multiple values' => FIELD_BEHAVIOR_CUSTOM, + 'default value' => FIELD_BEHAVIOR_NONE, + ), + ); + + return $widgets; } /** - * Implements hook_field_widget_form_alter(). + * Implements hook_field_widget_form(). */ -function gender_field_widget_form_alter(&$element, &$form_state, $context) { - if (!empty($context['field']['type']) && $context['field']['type'] == 'gender') { - // Replace the options for the widget. - $element['#options'] = gender_options(); - // Get the default values for the widget. - $values = array(); - if (!empty($context['items'])) { - foreach ($context['items'] as $item) { - if (!empty($item['value'])) { - $values[] = $item['value']; - } - } - } - // If the widget allows multiple values, set the whole array of values. - $multiple = $context['field']['cardinality'] > 1 || $context['field']['cardinality'] == FIELD_CARDINALITY_UNLIMITED; - if (!empty($multiple)) { - $element['#default_value'] = $values; - } - // Otherwise, only set the first value. - else { - $element['#default_value'] = reset($values); +function gender_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) { + switch ($instance['widget']['type']) { + case 'gender_default': + $element['#type'] = 'fieldset'; + $element['#collapsible'] = TRUE; + $element['#collapsed'] = FALSE; + $element['#element_validate'] = array( + 'gender_field_widget_validate', + ); + $element['part_1'] = array( + '#type' => 'radios', + '#title' => t('Do you consider yourself to be transgender?'), + '#options' => array( + 'yes' => t('Yes'), + 'no' => t('No'), + 'questioning' => t('Questioning'), + ), + '#default_value' => !empty($items[0]['part_1']) ? $items[0]['part_1'] : '', + '#required' => TRUE, + ); + $element['part_2'] = array( + '#type' => 'radios', + '#title' => t('Do you consider yourself to be gender non-conforming, gender diverse, gender variant, or gender expansive?'), + '#options' => array( + 'yes' => t('Yes'), + 'no' => t('No'), + 'questioning' => t('Questioning'), + ), + '#default_value' => !empty($items[0]['part_2']) ? $items[0]['part_2'] : '', + '#required' => TRUE, + ); + $element['part_3'] = array( + '#type' => 'radios', + '#title' => t('Are you intersex?'), + '#options' => array( + 'yes' => t('Yes'), + 'no' => t('No'), + 'i_dont_know' => t("I don't know"), + ), + '#default_value' => !empty($items[0]['part_3']) ? $items[0]['part_3'] : '', + '#required' => TRUE, + ); + $element['part_4'] = array( + '#type' => 'select_or_other', + '#title' => t('Where do you identify on the gender spectrum (check all that apply)?'), + '#options' => gender_options(), + '#multiple' => TRUE, + '#select_type' => 'checkboxes', + '#default_value' => !empty($items[0]['part_4']) ? $items[0]['part_4'] : '', + '#other' => t('Self Identify'), + '#other_unknown_defaults' => 'other', + '#other_delimiter' => FALSE, + ); + break; + } + + return $element; +} + +/** + * Form element validation callback for the default gender widget. + */ +function gender_field_widget_validate($element, &$form_state) { + // Get the values for part 4 of the form. + $part_4_values = array_keys($element['part_4']['select']['#value']); + // See if the "other" option is checked. + $other_position = array_search('select_or_other', $part_4_values); + // If the other option is checked, and it has a value, add it to the list. + if ($other_position !== FALSE) { + if (!empty($element['part_4']['other']['#value'])) { + $part_4_values[] = $element['part_4']['other']['#value']; } + // Remove the "other option is checked" value from the list. + unset($part_4_values[$other_position]); + // Reset the keys on the array after using unset(). + $part_4_values = array_values($part_4_values); } + // Create the final items array. + $items = array( + array( + 'part_1' => $element['part_1']['#value'], + 'part_2' => $element['part_2']['#value'], + 'part_3' => $element['part_3']['#value'], + 'part_4' => implode(',', $part_4_values), + ), + ); + // Set the value for the field. + form_set_value($element, $items, $form_state); } /** @@ -72,10 +149,6 @@ function gender_field_widget_form_alter(&$element, &$form_state, $context) { */ function gender_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_id) { if (!empty($form['#field']['type']) && $form['#field']['type'] == 'gender') { - // Hide the widget settings that should not be configurable for the gender - // field. - $form['instance']['widget']['settings']['#access'] = FALSE; - $form['instance']['default_value_widget']['#access'] = FALSE; // Modify the "Help text" section. $form['instance']['description']['#required'] = TRUE; $form['instance']['description']['#title'] = t('Justification for asking for this information'); @@ -84,26 +157,9 @@ function gender_form_field_ui_field_edit_form_alter(&$form, &$form_state, $form_ '@url' => url('https://www.drupal.org/project/gender'), )); $form['instance']['description']['#description'] = '' . $description . '' . $original_description; - // Set values on the hidden configurable fields. - $form['instance']['widget']['settings']['available_options']['#required'] = FALSE; - $form['instance']['widget']['settings']['available_options']['#element_validate'] = array(); - $form['instance']['widget']['settings']['available_options']['#value'] = ''; - $form['instance']['widget']['settings']['other']['#value'] = t('Self Identify'); - $form['instance']['widget']['settings']['other_title']['#value'] = ''; - $form['instance']['widget']['settings']['other_size']['#value'] = 60; - $form['instance']['widget']['settings']['other_unknown_new_option']['#value'] = FALSE; - $form['instance']['widget']['settings']['other_unknown_defaults']['#value'] = 'other'; - $form['instance']['widget']['settings']['sort_options']['#value'] = FALSE; } } -/** - * Implements hook_field_formatter_info_alter(). - */ -function gender_field_formatter_info_alter(&$info) { - $info['list_default']['field types'][] = 'gender'; -} - /** * Get the list of gender options. *