See: http://drupal.org/node/650008 diff -Nurp ../conditional_fields.orig/conditional_fields.module ./conditional_fields.module --- ../conditional_fields.orig/conditional_fields.module 2010-04-20 09:03:46.000000000 -0500 +++ ./conditional_fields.module 2010-04-20 09:21:40.000000000 -0500 @@ -535,6 +535,29 @@ function conditional_fields_forms_submit } /** + * Return an array of all fieldsets within the $form stored at the first depth of the array + * Each key in this array is a reference to the appropriate $form key + * Therefore all changes to $fieldsets will propogate to the appropriate $form key + * Due to recursive, the results are stored in the $fieldsets parameter + * This will produce a smaller array that can be searched through with less overhead + */ +function conditional_fields_node_editing_form_get_fieldgroups(&$form, &$fieldsets){ + foreach ($form as $form_key => $form_field){ + if (is_array($form[$form_key])){ + if (array_key_exists('#type', $form[$form_key])){ + if (strcasecmp($form[$form_key]['#type'], "fieldset") == 0){ + // The fieldset fields must map to the original form fields + // This allows for modifying the values without having to do a recursive search again + $fieldsets[$form_key] = & $form[$form_key]; + + conditional_fields_node_editing_form_get_fieldgroups($form[$form_key], $fieldsets); + } + } + } + } +} + +/** * Alteration of the node editing form */ function conditional_fields_node_editing_form(&$form, $form_state) { @@ -548,13 +571,37 @@ function conditional_fields_node_editing // Remove from data fields that user can't edit // and apply orphaned fields settings $orphaned_settings = variable_get('c_fields_edit_' . $type_name, C_FIELDS_ORPHANED_SHOW_TRIGGERED); + + // Find all fieldsets in the form array via a recursive function + // Doing this is better than recursively walking the $form array foreach field in the $data array + $fieldsets = array(); + conditional_fields_node_editing_form_get_fieldgroups($form, $fieldsets); + foreach ($data as $key => $field) { // Store group name or FALSE if no group $field['in_group'] = conditional_fields_get_group($type_name, $field['field_name']); // First check access - if ((!$field['in_group'] && $form[$field['field_name']]['#access'] === FALSE) || - ($field['in_group'] && $form[$field['in_group']][$field['field_name']]['#access'] == FALSE)) { + if (!empty($field['in_group'])){ + // To support nested fieldgroups, iterate into each fieldgroup until no fieldgroup children exists + $found_group = NULL; + + foreach ($fieldsets as $fieldsets_key => $fieldsets_field){ + if (array_key_exists($field['field_name'], $fieldsets[$fieldsets_key])){ + $found_group = $fieldsets[$fieldsets_key]; + } + } + + if (isset($found_group) && array_key_exists($field['field_name'], $found_group)){ + if ($found_group[$field['field_name']]['#access'] == FALSE){ + unset($data[$key]); + continue; + } + } else { + unset($data[$key]); + continue; + } + } else if ($form[$field['field_name']]['#access'] === FALSE){ unset($data[$key]); continue; } @@ -573,22 +620,21 @@ function conditional_fields_node_editing // Check if the controlling field is in form // If not, unset controlled field if ($field['control_field_in_group']) { - if (!$form[$field['control_field_in_group']][$field['control_field_name']] || - $form[$field['control_field_in_group']][$field['control_field_name']]['#type'] == 'markup' || - $form[$field['control_field_in_group']][$field['control_field_name']]['#access'] == FALSE) { - if (!$show_triggered || + if (!$found_group[$field['control_field_name']] || + $found_group[$field['control_field_name']]['#type'] == 'markup' || + $found_group[$field['control_field_name']]['#access'] == FALSE) { + if (!$show_triggered || !conditional_fields_is_triggered($form[$field['control_field_name']]['#value'], $field['trigger_values'])) { - unset($form[$field['control_field_in_group']][$field['field_name']]); + unset($found_group [$field['field_name']]); unset($data[$key]); } - } } else { if (!$form[$field['control_field_name']] || $form[$field['control_field_name']]['#type'] == 'markup' || $form[$field['control_field_name']]['#access'] == FALSE) { - if (!$show_triggered || + if (!$show_triggered || !conditional_fields_is_triggered($form[$field['control_field_name']]['#value'], $field['trigger_values'])) { unset($form[$field['field_name']]); unset($data[$key]); @@ -626,57 +672,57 @@ function conditional_fields_node_editing // Here we also add enclosing divs for easier javascript handling to controlling fields and to controlled fields and groups $required_fields = array(); - foreach (element_children($form) as $element) { + foreach (element_children($fieldsets) as $element) { // Fields if (strpos($element , 'field_') === 0) { - if ($form[$element]['#theme'] == 'content_multiple_values') { - $form[$element]['#conditional_fields_multiple'] = TRUE; + if ($fieldsets[$element]['#theme'] == 'content_multiple_values') { + $fieldsets[$element]['#conditional_fields_multiple'] = TRUE; } if ($controlling_fields[$element]) { - $form[$element]['#controlling_field'] = $element; - $form[$element]['#theme'] = array('conditional_fields_form_item'); + $fieldsets[$element]['#controlling_field'] = $element; + $fieldsets[$element]['#theme'] = array('conditional_fields_form_item'); } elseif ($controlled_fields[$element]) { - if ($form[$element]['#required']) { + if ($fieldsets[$element]['#required']) { conditional_fields_unset_required_field($form[$element]); $required_fields[$element] = array('field' => $element); } - $form[$element]['#controlled_field'] = $element; - $form[$element]['#theme'] = array('conditional_fields_form_item'); + $fieldsets[$element]['#controlled_field'] = $element; + $fieldsets[$element]['#theme'] = array('conditional_fields_form_item'); } } elseif (strpos($element , 'group_') === 0) { // Groups if ($controlled_fields[$element]) { // Group markup is still hardcoded. - $form[$element]['#prefix'] = '
' . $form[$element]['#prefix']; - $form[$element]['#suffix'] = $form[$element]['#suffix'] . '
'; + $fieldsets[$element]['#prefix'] = '
' . $fieldsets[$element]['#prefix']; + $fieldsets[$element]['#suffix'] = $fieldsets[$element]['#suffix'] . '
'; } // Fields in groups - foreach (element_children($form[$element]) as $group_element) { + foreach (element_children($fieldsets[$element]) as $group_element) { // All required fields inside a conditional group must be handled by conditional fields - if ($controlled_fields[$element] && $form[$element][$group_element]['#required']) { - conditional_fields_unset_required_field($form[$element][$group_element]); + if ($controlled_fields[$element] && $fieldsets[$element][$group_element]['#required']) { + conditional_fields_unset_required_field($fieldsets[$element][$group_element]); $required_fields[$group_element] = array('field' => $group_element, 'in_group' => $element); - $form[$element][$group_element]['#theme'] = array('conditional_fields_form_item'); + $fieldsets[$element][$group_element]['#theme'] = array('conditional_fields_form_item'); } // Manage also conditional fields inside normal groups if ($controlling_fields[$group_element]) { - $form[$element][$group_element]['#controlling_field'] = $group_element; - $form[$element][$group_element]['#theme'] = array('conditional_fields_form_item'); + $fieldsets[$element][$group_element]['#controlling_field'] = $group_element; + $fieldsets[$element][$group_element]['#theme'] = array('conditional_fields_form_item'); } elseif ($controlled_fields[$group_element]) { // Manage multiple ahah fields - if ($form[$element][$group_element]['#theme'] == 'content_multiple_values') { - $form[$element][$group_element]['#conditional_fields_multiple'] = TRUE; + if ($fieldsets[$element][$group_element]['#theme'] == 'content_multiple_values') { + $fieldsets[$element][$group_element]['#conditional_fields_multiple'] = TRUE; } - - if ($form[$element][$group_element]['#required']) { - conditional_fields_unset_required_field($form[$element][$group_element]); + + if ($fieldsets[$element][$group_element]['#required']) { + conditional_fields_unset_required_field($fieldsets[$element][$group_element]); $required_fields[$group_element] = array('field' => $group_element, 'in_group' => $element); } - $form[$element][$group_element]['#controlled_field'] = $group_element; - $form[$element][$group_element]['#theme'] = array('conditional_fields_form_item'); + $fieldsets[$element][$group_element]['#controlled_field'] = $group_element; + $fieldsets[$element][$group_element]['#theme'] = array('conditional_fields_form_item'); } } }