Move a certain form element to any place you want via pre_render


/**
* Move form elements into fieldsets for presentation purposes.
*
* Many views forms use #tree = TRUE to keep their values in a hierarchy for
* easier storage. Moving the form elements into fieldsets during form building
* would break up that hierarchy. Therefore, we wait until the pre_render stage,
* where any changes we make affect presentation only and aren't reflected in
* $form_state['values'].
*/
function views_ui_pre_render_add_fieldset_markup($form, &$main_form = array()) {// Just sets the main form once.
$main_form = $form;
views_ui_pre_render_add_fieldset_markup_helper($form, $main_form);
return $main_form;
}

/**
* Endrecursive version of views_ui_pre_render_add_fieldset_markup.
*/
function views_ui_pre_render_add_fieldset_markup_helper(&$form, &$main_form = array(), $form_parents = array()) {
foreach (element_children($form) as $key) {
$element = $form[$key];
// In our form builder functions, we added an arbitrary #fieldset property
// to any element that belongs in a fieldset. If this form element has that
// property, move it into its fieldset.

// Check for the first element.
$form_parents[] = $key;
if (isset($element['#fieldset'])) {
// The path to the new element is the parents + the current key.
$parents = $element['#fieldset'];
$parents[] = $key;
// Set the new element.
views_ui_pre_render_parent_set_form_element($main_form, $element, $parents);
// Unset the old element.
views_ui_pre_render_parent_set_form_element($main_form, NULL, $form_parents);
}
elseif (is_array($element)) {
// Continue on each child element.
views_ui_pre_render_add_fieldset_markup_helper($element, $main_form, $form_parents);
}

}
}

/**
* Set a certain form element somewhere deep in a form array on a certain parents place.
*/
function views_ui_pre_render_parent_set_form_element(&$form, $element, $parents) {
foreach (element_children($form) as $key) {
// Find the element we want to set.
// If we are at the end of your search set the element
// else continue.
if ($parents[0] === $key) {
array_shift($parents);
if (count($parents) == 1) {
// Provide a way to delete an item.
if ($element === NULL) {
unset($form[$key][$parents[0]]);
}
else {
$form[$key][$parents[0]] = $element;
}
}
else {
views_ui_pre_render_parent_set_form_element($form[$key], $element, $parents);
}
}
}
}

Add new comment