diff --git a/field_conditional_state.admin.inc b/field_conditional_state.admin.inc index 1f23c4d..f6fed5a 100644 --- a/field_conditional_state.admin.inc +++ b/field_conditional_state.admin.inc @@ -167,9 +167,11 @@ function field_conditional_state_settings_form($form, &$form_state, $instance) { $control_field_instance = field_info_instance($group['entity_type'], $control_field, $group['bundle']); - if (in_array($control_field_instance['widget']['type'], array('options_buttons', 'options_select'))) { + if (in_array($control_field_instance['widget']['type'], field_conditional_state_multi_trigger_value_is_supported())) { $new_state['trigger_value-' . $state['id']]['#options'] = list_allowed_values(field_info_field($control_field)); $new_state['trigger_value-' . $state['id']]['#type'] = 'select'; + $new_state['trigger_value-' . $state['id']]['#multiple'] = TRUE; + $state['trigger_value'] = unserialize($state['trigger_value']); } $new_state['trigger_value-' . $state['id']]['#default_value'] = $state['trigger_value']; @@ -198,9 +200,10 @@ function field_conditional_state_settings_form($form, &$form_state, $instance) { if (!is_null($control_field)) { $control_field_instance = field_info_instance($group['entity_type'], $control_field, $group['bundle']); - if (in_array($control_field_instance['widget']['type'], array('options_buttons', 'options_select'))) { + if (in_array($control_field_instance['widget']['type'], field_conditional_state_multi_trigger_value_is_supported())) { $new_state['trigger_value-' . $new_id]['#options'] = list_allowed_values(field_info_field($control_field)); $new_state['trigger_value-' . $new_id]['#type'] = 'select'; + $new_state['trigger_value-' . $new_id]['#multiple'] = TRUE; } } @@ -275,6 +278,11 @@ function field_conditional_state_settings_form_submit($form, $form_state) { ); if ($values['trigger_state-' . $id] == 'value' || $values['trigger_state-' . $id] == '!value') { $fields['trigger_value'] = $values['trigger_value-' . $id]; + + // Serialize trigger values of multiselect fields. + if (is_array($fields['trigger_value'])) { + $fields['trigger_value'] = serialize($fields['trigger_value']); + } } db_update('field_conditional_state') @@ -288,6 +296,11 @@ function field_conditional_state_settings_form_submit($form, $form_state) { $trigger_value = 1; if ($values['trigger_state-new-' . $id] == 'value' || $values['trigger_state-new-' . $id] == '!value') { $trigger_value = $values['trigger_value-new-' . $id]; + + // Serialize trigger values of multiselect fields. + if (is_array($trigger_value)) { + $trigger_value = serialize($trigger_value); + } } db_insert('field_conditional_state') diff --git a/field_conditional_state.module b/field_conditional_state.module index 89304c9..64d2519 100644 --- a/field_conditional_state.module +++ b/field_conditional_state.module @@ -177,6 +177,29 @@ function field_conditional_state_controled_field_is_supported($widget = FALSE) { } /** + * Checks whether a widget supports multiple trigger values within one state. + * + * @param string $widget + * a widget name to check for support + * + * @return array/boolean + * the whitelist as array if no explicit widget is given as argument OR + * a boolean indicating the support of the given widget + */ +function field_conditional_state_multi_trigger_value_is_supported($widget = FALSE) { + $list = array( + 'options_buttons', + 'options_select', + ); + if (!$widget) { + return $list; + } + else { + return in_array($widget, $list); + } +} + +/** * Returns the available states for a given field type. * * @param string $type @@ -561,23 +584,36 @@ function _field_conditional_state_build_states_array(&$element, $groups, $state_ continue; } $control_id = $ids[$control_key]; + $triggers = array(); if ($state['trigger_state'] == 'value' || $state['trigger_state'] == '!value') { - $trigger = array($state['trigger_state'] => $state['trigger_value']); + + // If we have a multi trigger value here, we create a state per value. + $trigger_values = @unserialize($state['trigger_value']); + if ($trigger_values !== FALSE) { + foreach ($trigger_values as $val) { + $triggers[] = array($state['trigger_state'] => $val); + } + } + else { + $triggers[] = array($state['trigger_state'] => $state['trigger_value']); + } } else { - $trigger = array($state['trigger_state'] => TRUE); + $triggers[] = array($state['trigger_state'] => TRUE); } - if ($group['type'] == 'and') { - // Add condition to the top level. - $current['#' . $control_id] = $trigger; - } - else { - // For or/xor conditions $current already points to the second level, - // but each single condition gets its own third level - // within the array. - $tmp = &$current[]; - $tmp['#' . $control_id] = $trigger; + foreach ($triggers as $trigger) { + if ($group['type'] == 'and') { + // Add condition to the top level. + $current['#' . $control_id] = $trigger; + } + else { + // For (x)or conditions $current already points to the second level, + // but each single condition gets its own third level + // within the array. + $tmp = &$current[]; + $tmp['#' . $control_id] = $trigger; + } } } }