public function FormBuilder::doBuildForm in Drupal 10
Same name and namespace in other branches
- 8 core/lib/Drupal/Core/Form/FormBuilder.php \Drupal\Core\Form\FormBuilder::doBuildForm()
- 9 core/lib/Drupal/Core/Form/FormBuilder.php \Drupal\Core\Form\FormBuilder::doBuildForm()
File
- core/lib/Drupal/Core/Form/FormBuilder.php, line 910
Class
- FormBuilder
- Provides form building and processing.
Namespace
Drupal\Core\Form
Code
public function doBuildForm($form_id, &$element, FormStateInterface &$form_state) {
$element['#processed'] = FALSE;
if (isset($element['#type']) && empty($element['#defaults_loaded']) && ($info = $this->elementInfo
->getInfo($element['#type']))) {
$element += $info;
$element['#defaults_loaded'] = TRUE;
}
$element += [
'#required' => FALSE,
'#attributes' => [],
'#title_display' => 'before',
'#description_display' => 'after',
'#errors' => NULL,
];
if (isset($element['#type']) && $element['#type'] == 'form') {
if (!empty($element['#https']) && !UrlHelper::isExternal($element['#action'])) {
global $base_root;
$element['#action'] = str_replace('http://', 'https://', $base_root) . $element['#action'];
}
$form_state
->setCompleteForm($element);
$input = $form_state
->getUserInput();
if ($form_state
->isProgrammed() || !empty($input) && (isset($input['form_id']) && $input['form_id'] == $form_id)) {
$form_state
->setProcessInput();
if (isset($element['#token'])) {
$input = $form_state
->getUserInput();
if (empty($input['form_token']) || !$this->csrfToken
->validate($input['form_token'], $element['#token'])) {
$this
->setInvalidTokenError($form_state);
$form_state
->setInvalidToken(TRUE);
$form_state
->setUserInput([]);
$request = $this->requestStack
->getCurrentRequest();
$request->request = new ParameterBag();
$request->files = new FileBag();
$request
->overrideGlobals();
}
}
}
else {
$form_state
->setProcessInput(FALSE);
}
$element['#array_parents'] = [];
}
if (!isset($element['#id'])) {
$unprocessed_id = 'edit-' . implode('-', $element['#parents']);
$element['#id'] = Html::getUniqueId($unprocessed_id);
$element['#attributes']['data-drupal-selector'] = Html::getId($unprocessed_id);
}
else {
$element['#attributes']['data-drupal-selector'] = Html::getId($element['#id']);
}
if (!empty($element['#description'])) {
$element['#attributes']['aria-describedby'] = $element['#id'] . '--description';
}
if (!empty($element['#input'])) {
$this
->handleInputElement($form_id, $element, $form_state);
}
if (isset($element['#process']) && !$element['#processed']) {
foreach ($element['#process'] as $callback) {
$complete_form =& $form_state
->getCompleteForm();
$element = call_user_func_array($form_state
->prepareCallback($callback), [
&$element,
&$form_state,
&$complete_form,
]);
}
$element['#processed'] = TRUE;
}
$element['#sorted'] = TRUE;
$count = 0;
if (isset($element['#access'])) {
$access = $element['#access'];
$inherited_access = NULL;
if ($access instanceof AccessResultInterface && !$access
->isAllowed() || $access === FALSE) {
$inherited_access = $access;
}
}
foreach (Element::children($element) as $key) {
if (isset($element[$key]['#type']) && empty($element[$key]['#defaults_loaded']) && ($info = $this->elementInfo
->getInfo($element[$key]['#type']))) {
$element[$key] += $info;
$element[$key]['#defaults_loaded'] = TRUE;
}
if (!isset($element[$key]['#tree'])) {
$element[$key]['#tree'] = $element['#tree'];
}
if (isset($inherited_access)) {
$element[$key]['#access'] = $inherited_access;
}
foreach ([
'#disabled',
'#allow_focus',
] as $property) {
if (isset($element[$property]) && !isset($element[$key][$property])) {
$element[$key][$property] = $element[$property];
}
}
if (!isset($element[$key]['#parents'])) {
$element[$key]['#parents'] = $element[$key]['#tree'] && $element['#tree'] ? array_merge($element['#parents'], [
$key,
]) : [
$key,
];
}
$array_parents = $element['#array_parents'];
$array_parents[] = $key;
$element[$key]['#array_parents'] = $array_parents;
if (!isset($element[$key]['#weight'])) {
$element[$key]['#weight'] = $count / 1000;
}
else {
unset($element['#sorted']);
}
$element[$key] = $this
->doBuildForm($form_id, $element[$key], $form_state);
$count++;
}
if (isset($element['#after_build']) && !isset($element['#after_build_done'])) {
foreach ($element['#after_build'] as $callback) {
$element = call_user_func_array($form_state
->prepareCallback($callback), [
$element,
&$form_state,
]);
}
$element['#after_build_done'] = TRUE;
}
if (isset($element['#type']) && $element['#type'] == 'file') {
$form_state
->setHasFileElement();
}
if (isset($element['#type']) && $element['#type'] == 'form') {
if ($form_state
->hasFileElement()) {
$element['#attributes']['enctype'] = 'multipart/form-data';
}
$element['#attached']['drupalSettings']['ajaxTrustedUrl'][$element['#action']] = TRUE;
$buttons = $form_state
->getButtons();
if (!$form_state
->isProgrammed() && !$form_state
->getTriggeringElement() && !empty($buttons)) {
$form_state
->setTriggeringElement($buttons[0]);
}
$triggering_element = $form_state
->getTriggeringElement();
if (isset($triggering_element['#validate'])) {
$form_state
->setValidateHandlers($triggering_element['#validate']);
}
if (isset($triggering_element['#submit'])) {
$form_state
->setSubmitHandlers($triggering_element['#submit']);
}
if (!empty($triggering_element['#executes_submit_callback'])) {
$form_state
->setSubmitted();
}
if (!empty($triggering_element['#is_button'])) {
$form_state
->setValue($triggering_element['#name'], $triggering_element['#value']);
}
}
return $element;
}