public static function Actions::preRenderActionsDropbutton in Drupal 10
Same name and namespace in other branches
- 8 core/lib/Drupal/Core/Render/Element/Actions.php \Drupal\Core\Render\Element\Actions::preRenderActionsDropbutton()
- 9 core/lib/Drupal/Core/Render/Element/Actions.php \Drupal\Core\Render\Element\Actions::preRenderActionsDropbutton()
#pre_render callback for #type 'actions'.
This callback iterates over all child elements of the #type 'actions' container to look for elements with a #dropbutton property, so as to group those elements into dropbuttons. As such, it works similar to #group, but is specialized for dropbuttons.
The value of #dropbutton denotes the dropbutton to group the child element into. For example, two different values of 'foo' and 'bar' on child elements would generate two separate dropbuttons, which each contain the corresponding buttons.
Parameters
array $element: The #type 'actions' element to process.
\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.
array $complete_form: The complete form structure.
Return value
array The processed #type 'actions' element, including individual buttons grouped into new #type 'dropbutton' elements.
File
- core/
lib/ Drupal/ Core/ Render/ Element/ Actions.php, line 89
Class
- Actions
- Provides a wrapper element to group one or more buttons in a form.
Namespace
Drupal\Core\Render\ElementCode
public static function preRenderActionsDropbutton(&$element, FormStateInterface $form_state, &$complete_form) {
$dropbuttons = [];
foreach (Element::children($element, TRUE) as $key) {
if (isset($element[$key]['#dropbutton'])) {
$dropbutton = $element[$key]['#dropbutton'];
// If there is no dropbutton for this button group yet, create one.
if (!isset($dropbuttons[$dropbutton])) {
$dropbuttons[$dropbutton] = [
'#type' => 'dropbutton',
];
}
// Add this button to the corresponding dropbutton.
// @todo Change #type 'dropbutton' to be based on item-list.html.twig
// instead of links.html.twig to avoid this preemptive rendering.
$button = \Drupal::service('renderer')
->renderPlain($element[$key]);
$dropbuttons[$dropbutton]['#links'][$key] = [
'title' => $button,
];
// Merge metadata like drupalSettings.
BubbleableMetadata::createFromRenderArray($dropbuttons[$dropbutton])
->merge(BubbleableMetadata::createFromRenderArray($element[$key]))
->applyTo($dropbuttons[$dropbutton]);
}
}
// @todo For now, all dropbuttons appear first. Consider to invent a more
// fancy sorting/injection algorithm here.
return $dropbuttons + $element;
}