function MenuForm::submitOverviewForm
Same name in other branches
- 9 core/modules/menu_ui/src/MenuForm.php \Drupal\menu_ui\MenuForm::submitOverviewForm()
- 10 core/modules/menu_ui/src/MenuForm.php \Drupal\menu_ui\MenuForm::submitOverviewForm()
- 11.x core/modules/menu_ui/src/MenuForm.php \Drupal\menu_ui\MenuForm::submitOverviewForm()
Submit handler for the menu overview form.
This function takes great care in saving parent items first, then items underneath them. Saving items in the incorrect order can break the tree.
1 call to MenuForm::submitOverviewForm()
- MenuForm::submitForm in core/
modules/ menu_ui/ src/ MenuForm.php - This is the default entity object builder function. It is called before any other submit handler to build the new entity object to be used by the following submit handlers. At this point of the form workflow the entity is validated and the form stateā¦
File
-
core/
modules/ menu_ui/ src/ MenuForm.php, line 496
Class
- MenuForm
- Base form for menu edit forms.
Namespace
Drupal\menu_uiCode
protected function submitOverviewForm(array $complete_form, FormStateInterface $form_state) {
// Form API supports constructing and validating self-contained sections
// within forms, but does not allow to handle the form section's submission
// equally separated yet. Therefore, we use a $form_state key to point to
// the parents of the form section.
$parents = $form_state->get('menu_overview_form_parents');
$input = NestedArray::getValue($form_state->getUserInput(), $parents);
$form =& NestedArray::getValue($complete_form, $parents);
// When dealing with saving menu items, the order in which these items are
// saved is critical. If a changed child item is saved before its parent,
// the child item could be saved with an invalid path past its immediate
// parent. To prevent this, save items in the form in the same order they
// are sent, ensuring parents are saved first, then their children.
// See https://www.drupal.org/node/181126#comment-632270.
$order = is_array($input) ? array_flip(array_keys($input)) : [];
// Update our original form with the new order.
$form = array_intersect_key(array_merge($order, $form), $form);
$fields = [
'weight',
'parent',
'enabled',
];
$form_links = $form['links'];
foreach (Element::children($form_links) as $id) {
if (isset($form_links[$id]['#item'])) {
$element = $form_links[$id];
$updated_values = [];
// Update any fields that have changed in this menu item.
foreach ($fields as $field) {
if (isset($element[$field]['#value']) && $element[$field]['#value'] != $element[$field]['#default_value']) {
$updated_values[$field] = $element[$field]['#value'];
}
}
if ($updated_values) {
// Use the ID from the actual plugin instance since the hidden value
// in the form could be tampered with.
$this->menuLinkManager
->updateDefinition($element['#item']->link
->getPLuginId(), $updated_values);
}
}
}
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.