This patch requires multigroup to be added to CCK-2 prior to applying. This adds the nested fieldgroup patch changes to multigroup for CCK-2 diff -Nurp ../cck.orig/modules/content_multigroup/content_multigroup.admin.inc ./modules/content_multigroup/content_multigroup.admin.inc --- ../cck.orig/modules/content_multigroup/content_multigroup.admin.inc 2010-05-05 09:52:52.000000000 -0500 +++ ./modules/content_multigroup/content_multigroup.admin.inc 2010-05-05 09:57:07.000000000 -0500 @@ -46,6 +46,7 @@ function content_multigroup_field_overvi // See if we have fields moving into or out of a Multigroup. // Set any fields to use the new name here so they will get processed // correctly by the fieldgroup module when saved. + $group_rows = array(); foreach ($form_values as $key => $values) { if ($values['parent'] == '_add_new_group') { $values['parent'] = $new_group_name; @@ -56,6 +57,7 @@ function content_multigroup_field_overvi // Gather up info about all groups. $group_name = $form_values[$key]['group']['group_name']; $groups[$group_name] = $form_values[$key]['group']; + $group_rows[$group_name] = $group_name; } if (!empty($form[$key]['#row_type']) && $form[$key]['#row_type'] == 'field') { if ($values['prev_parent'] != $values['parent']) { @@ -66,6 +68,18 @@ function content_multigroup_field_overvi } $rebuild = FALSE; + + foreach ($groups as $key => $values) { + if (in_array($key, $group_rows)) { + if (!empty($groups[$key]['parent']) && $groups[$groups[$key]['parent']]['group_type'] == 'multigroup') { + $error_message = t('You cannot place any kind of group inside a multigroup. ' . $key . ' was moved back to where it started.'); + form_set_value($form[$key]['weight'], $form[$key]['weight']['#default_value'], $form_state); + form_set_value($form[$key]['parent'], $form[$key]['parent']['#default_value'], $form_state); + drupal_set_message($error_message, 'error'); + } + } + } + foreach ($fields as $field_name => $field) { $new_group = $form_values[$field_name]['parent']; $old_group = $form_values[$field_name]['prev_parent']; @@ -285,6 +299,10 @@ function content_multigroup_display_over return; } + $groups = array(); + if (module_exists('fieldgroup')) { + $groups = fieldgroup_groups($type_name); + } $contexts = content_build_modes($contexts_selector); // Multigroups, extra values. @@ -301,7 +319,7 @@ function content_multigroup_display_over 'table-single' => t('Table - Single column'), 'table-multiple' => t('Table - Multiple columns'), ); - foreach (fieldgroup_groups($type_name) as $group_name => $group) { + foreach ($groups as $group_name => $group) { if ($group['group_type'] != 'multigroup') { continue; } diff -Nurp ../cck.orig/modules/content_multigroup/content_multigroup.node_form.inc ./modules/content_multigroup/content_multigroup.node_form.inc --- ../cck.orig/modules/content_multigroup/content_multigroup.node_form.inc 2010-05-05 09:52:52.000000000 -0500 +++ ./modules/content_multigroup/content_multigroup.node_form.inc 2010-05-05 09:57:07.000000000 -0500 @@ -110,10 +110,12 @@ function _content_multigroup_fieldgroup_ if (!in_array('content_multigroup_node_form_pre_render', $form['#pre_render'])) { array_unshift($form['#pre_render'], 'content_multigroup_node_form_pre_render'); } - + $elements[$group_name] = array(); foreach ($group_deltas as $delta) { - content_multigroup_group_form($form, $form_state, $group, $delta); + $element = content_multigroup_group_form($form, $form_state, $group, $delta); + $elements[$group_name] = array_merge($elements[$group_name], $element[$group_name]); } + $form[$group_name] = $elements[$group_name]; // Unset the original group field values now that we've moved them. foreach (array_keys($group_fields) as $field_name) { @@ -131,26 +133,39 @@ function _content_multigroup_fieldgroup_ * Called in form_alter and by AHAH add more. */ function content_multigroup_group_form(&$form, &$form_state, $group, $delta) { + module_load_include('inc', 'content', 'includes/content.node_form'); + $element = array(); + $type_name = $group['type_name']; + $content_type = content_types($type_name); $group_name = $group['group_name']; - if ($group['group_type'] != 'multigroup' || empty($form[$group_name]) || empty($form['#multigroups']) || empty($form['#multigroups'][$group_name])) { + + if (!isset($form[$group_name])) {//nested AHAH, not initial build + $element[$group_name] = content_get_form_element($group_name, $type_name, $form, TRUE); + } + else {//initial build (via content_multigroup_fieldgroup_form) or non-nested AHAH + $element[$group_name] = $form[$group_name]; + } + if (($group['group_type'] != 'multigroup') + || (!(empty($element[$group['group_name']]['#access'])) && $element[$group['group_name']]['#access'] != TRUE) + || empty($element[$group['group_name']])) { return; } - module_load_include('inc', 'content', 'includes/content.node_form'); - $node = $form['#node']; $group_fields = $form['#multigroups'][$group_name]; + $element[$group_name]['#fields'] = array_keys($group_fields); + $node = $form['#node']; $group_multiple = $group['settings']['multigroup']['multiple']; foreach ($group_fields as $field_name => $field) { - if (empty($form[$group_name][$delta])) { - $form[$group_name] += array($delta => array($field_name => array())); + if (empty($element[$group_name][$delta])) { + $element[$group_name] += array($delta => array($field_name => array())); } else { - $form[$group_name][$delta][$field_name] = array(); + $element[$group_name][$delta][$field_name] = array(); } - $item_count = (isset($form_state['item_count'][$group_name]) ? $form_state['item_count'][$group_name] : $form[$group_name]['#item_count']); - $form[$group_name][$delta]['_weight'] = array( + $item_count = (isset($form_state['item_count'][$group_name]) ? $form_state['item_count'][$group_name] : $element[$group_name]['#item_count']); + $element[$group_name][$delta]['_weight'] = array( '#type' => 'weight', '#delta' => $item_count, // this 'delta' is the 'weight' element's property '#default_value' => $delta, @@ -160,7 +175,7 @@ function content_multigroup_group_form(& // Add a checkbox to allow users remove a single delta subgroup. // See content_set_empty() and theme_content_multigroup_node_form(). if ($group_multiple == 1) { - $form[$group_name][$delta]['_remove'] = array( + $element[$group_name][$delta]['_remove'] = array( '#type' => 'checkbox', '#attributes' => array('class' => 'content-multiple-remove-checkbox'), '#default_value' => isset($form_state['multigroup_removed'][$group_name][$delta]) ? $form_state['multigroup_removed'][$group_name][$delta] : 0, @@ -205,7 +220,7 @@ function content_multigroup_group_form(& if (content_handle('widget', 'multiple values', $field) == CONTENT_HANDLE_CORE) { $field_form = content_field_form($form, $form_state, $field, $delta); $value = array_key_exists($delta, $field_form[$field_name]) ? $delta : 0; - $form[$group_name][$delta][$field_name] = $field_form[$field_name][$value]; + $element[$group_name][$delta][$field_name] = $field_form[$field_name][$value]; } else { // When the form is submitted, get the element data from the form values. @@ -230,13 +245,15 @@ function content_multigroup_group_form(& } $field_form[$field_name]['#element_validate'][] = 'content_multigroup_fix_multivalue_fields'; - $form[$group_name][$delta][$field_name] = $field_form[$field_name]; + $element[$group_name][$delta][$field_name] = $field_form[$field_name]; } - $form[$group_name][$delta][$field_name]['#weight'] = $field['widget']['weight']; + $element[$group_name][$delta][$field_name]['#weight'] = $field['widget']['weight']; } // Reset the form '#node' back to its original value. $form['#node'] = $node; + + return $element; } /** @@ -767,14 +784,16 @@ function content_multigroup_add_more_js( // Build our new form element for the whole group, asking for one more element. $delta = max(array_keys($_POST[$group_name])) + 1; $form_state['item_count'] = array($group_name => count($_POST[$group_name]) + 1); - content_multigroup_group_form($form, $form_state, $group, $delta); + $form_element = content_multigroup_group_form($form, $form_state, $group, $delta); // Rebuild weight deltas to make sure they all are equally dimensioned. - foreach ($form[$group_name] as $key => $item) { + foreach ($form_element[$group_name] as $key => $item) { if (is_numeric($key) && isset($item['_weight']) && is_array($item['_weight'])) { - $form[$group_name][$key]['_weight']['#delta'] = $delta; + $form_element[$group_name][$key]['_weight']['#delta'] = $delta; } } + // Add the new element at the right place in the (original, unbuilt) form. + content_set_form_element($group_name, $content_type['type'], $form, $form_element[$group_name], TRUE); // Save the new definition of the form. $form_state['values'] = array(); @@ -791,7 +810,7 @@ function content_multigroup_add_more_js( $form = form_builder($_POST['form_id'], $form, $form_state); // Render the new output. - $group_form = $form[$group_name]; + $group_form = content_get_form_element($group_name, $content_type['type'], $form, TRUE); // We add a div around the new content to receive the ahah effect. $group_form[$delta]['#prefix'] = '
'. (isset($group_form[$delta]['#prefix']) ? $group_form[$delta]['#prefix'] : ''); $group_form[$delta]['#suffix'] = (isset($group_form[$delta]['#suffix']) ? $group_form[$delta]['#suffix'] : '') .'
';