function subform_form_child_pre_render in Subform 7
Pre-render callback for elements within subforms.
Prefixes the #name of all input elements except files in $form with $prefix
Registers this callback.
See also
1 string reference to 'subform_form_child_pre_render'
- subform_form_after_build_traverse_children in ./
subform.module - Helper function to set a #pre_render callback on all elements within a subform.
File
- ./
subform.module, line 637 - Defines a subform element type.
Code
function subform_form_child_pre_render($element) {
$subform_name = $element['#subform_name'];
if (!isset($element['#access']) || $element['#access']) {
// Prefix the #attributes[name] of all input elements with the subform name.
// Don't prefix #name as theme_form_element() needs the original #name to
// set correct classes on which CSS and Javascript might depend.
if (!empty($element['#name'])) {
// Name set in #attributes has preference.
$element_name = isset($element['#attributes']['name']) ? $element['#attributes']['name'] : $element['#name'];
if ($element['#type'] == 'file') {
$element_name = substr($element_name, 6, -1);
$element['#attributes']['name'] = 'files[' . $subform_name . '-' . $element_name . ']';
}
elseif ($element['#type'] != 'subform') {
$element_name = explode('[', $element_name, 2);
$element_name[0] = '[' . $element_name[0] . ']';
$element['#attributes']['name'] = $subform_name . implode('[', $element_name);
}
}
// Prepend the special input key '_subform_element_name' to ajax settings.
if (!empty($element['#attached']['js'])) {
foreach ($element['#attached']['js'] as &$js) {
if (isset($element['#id']) && is_array($js) && isset($js['data']['ajax'][$element['#id']])) {
// Note that the submit array is rebuild so '_subform_element_name' is
// the first element in the array, which is very important for subform_init().
$js['data']['ajax'][$element['#id']]['submit'] = array(
'_subform_element_name' => $subform_name,
) + $js['data']['ajax'][$element['#id']]['submit'];
}
}
}
// Correct input element names in #states.
if (!empty($element['#states'])) {
foreach ($element['#states'] as $state => $conditions) {
$element['#states'][$state] = array();
foreach ($conditions as $selector => $condition) {
$selector = preg_replace('%\\[name="([^["]+)(.+)?"\\]%', '[name="' . $subform_name . '[$1]$2"]', $selector);
$element['#states'][$state][$selector] = $condition;
}
}
}
}
return $element;
}