function subform_element_process in Subform 7
Processes a subform element.
Contains code that is duplicated here.
See also
1 string reference to 'subform_element_process'
- subform_element_info in ./
subform.module - Implements hook_element_info().
File
- ./
subform.module, line 200 - Defines a subform element type.
Code
function subform_element_process($element, &$form_state) {
$form_id = $element['#subform_id'];
$subform_name = $element['#name'];
$subform_state =& subform_get_state($subform_name, $form_state);
$subform_state['input'] = isset($element['#value']) && is_array($element['#value']) ? $element['#value'] : array();
$element['#subform_errors'] = array();
$element['#subform_error_messages'] = array();
if ($subform_state['rebuild']) {
$subform = subform_element_rebuild($element, $form_state);
}
else {
subform_buffer('start', $element);
// Copied from drupal_build_form()
// Check the cache for a copy of the subform in question.
$check_cache = isset($subform_state['input']['form_id']) && $subform_state['input']['form_id'] == $form_id && !empty($subform_state['input']['form_build_id']);
if ($check_cache) {
$subform = form_get_cache($subform_state['input']['form_build_id'], $subform_state);
}
// Build subform from scratch.
if (!isset($subform)) {
if ($check_cache) {
$subform_state_before_retrieval = $subform_state;
}
$subform = drupal_retrieve_form($form_id, $subform_state);
drupal_prepare_form($form_id, $subform, $subform_state);
if ($check_cache) {
$uncacheable_keys = array_flip(array_diff(form_state_keys_no_cache(), array(
'always_process',
'temporary',
)));
$subform_state = array_diff_key($subform_state, $uncacheable_keys);
$subform_state += $subform_state_before_retrieval;
}
}
// Copied from drupal_process_form()
$subform_state['values'] = array();
// With $_GET, these forms are always submitted if requested.
if ($subform_state['method'] == 'get' && !empty($subform_state['always_process'])) {
if (!isset($subform_state['input']['form_build_id'])) {
$subform_state['input']['form_build_id'] = $subform['#build_id'];
}
if (!isset($subform_state['input']['form_id'])) {
$subform_state['input']['form_id'] = $form_id;
}
if (!isset($subform_state['input']['form_token']) && isset($subform['#token'])) {
$subform_state['input']['form_token'] = drupal_get_token($subform['#token']);
}
}
// Retain the unprocessed $subform in case it needs to be cached.
$subform_state['temporary']['subform_unprocessed'] = $subform;
$subform = form_builder($form_id, $subform, $subform_state);
// Display any errors thrown during form building.
subform_buffer('end', $element, TRUE);
}
// If the subform contains a file element, update the parent form accordingly.
if (isset($subform_state['has_file_element'])) {
$form_state['has_file_element'] = TRUE;
}
// Subform elements are allowed to set #limit_validation_errors to TRUE, to
// limit validation errors to errors within the subform only.
if (isset($element['#limit_validation_errors']) && $element['#limit_validation_errors'] === TRUE) {
$element['#limit_validation_errors'] = array(
$element['#parents'],
);
}
// If the subform contains a triggering element, set the subform element to be
// the triggering element of the parent form.
if (isset($subform_state['triggering_element']) && empty($subform_state['temporary']['subform_no_triggering_element'])) {
$element['#executes_submit_callback'] = $subform_state['triggering_element']['#executes_submit_callback'];
$form_state['triggering_element'] = $element;
}
$form_state['complete form']['#after_build']['subform_parent_after_build'] = 'subform_parent_after_build';
$element['#subform'] = $subform;
return $element;
}