function subform_parent_after_build in Subform 7
After-build callback for form elements containing subform elements.
Registers this callback.
See also
1 string reference to 'subform_parent_after_build'
- subform_element_process in ./
subform.module - Processes a subform element.
File
- ./
subform.module, line 390 - Defines a subform element type.
Code
function subform_parent_after_build(&$element, &$form_state) {
// Subform elements may contain the first button in the whole form. If the
// parent form contains no actual triggering element, set this subform to
// be the triggering element.
if (!empty($form_state['temporary']['subform']) && !isset($form_state['triggering_element'])) {
foreach ($form_state['temporary']['subform'] as $subform_name => &$subform_state) {
$subform_element =& subform_array_get_nested_value($element, $subform_state['subform_element_parents'], $subform_exists);
if ($subform_exists && !empty($subform_element['#subform_has_first_button'])) {
$form_state['triggering_element'] = $subform_element;
break;
}
}
}
foreach ($form_state['temporary']['subform'] as $subform_name => &$subform_state) {
// The triggering element of the parent form may set specific triggering
// elements for its subforms using #subform_triggering_element which accepts
// the following format:
//
// @code
// array(
// $form_id => array($parents, $of, $subforms, $triggering_element),
// );
// @endcode
if (isset($form_state['triggering_element']['#subform_triggering_element'][$subform_state['complete form']['#form_id']])) {
$triggering_element =& subform_array_get_nested_value($subform_state['complete form'], $form_state['triggering_element']['#subform_triggering_element'][$subform_state['complete form']['#form_id']], $triggering_element_exists);
if ($triggering_element_exists) {
subform_set_triggering_element($triggering_element, $subform_state);
}
}
// If the input is not going to be processed cache the subform here. Caching
// the subforms here allows for making changes to subform states in any
// process or after-build callback.
if ((!$form_state['process_input'] || !$subform_state['process_input']) && empty($subform_state['programmed']) && $subform_state['cache'] && empty($subform_state['no_cache'])) {
form_set_cache($subform_state['complete form']['#build_id'], $subform_state['temporary']['subform_unprocessed'], $subform_state);
}
}
// While this is also done later in form_builder() we need the triggering
// element here to set the after-validate/submit handlers correctly.
if (!$form_state['programmed'] && !isset($form_state['triggering_element']) && !empty($form_state['buttons'])) {
$form_state['triggering_element'] = $form_state['buttons'][0];
}
// Add after-validate/submit handlers to this parent form.
foreach (array(
'validate',
'submit',
) as $type) {
if (isset($form_state['triggering_element']['#' . $type])) {
$form_state['triggering_element']['#' . $type]['subform_parent_after_' . $type] = 'subform_parent_after_' . $type;
}
else {
if (!isset($element['#' . $type])) {
$element['#' . $type] = array();
}
$element['#' . $type]['subform_parent_after_' . $type] = 'subform_parent_after_' . $type;
}
}
return $element;
}