5 * Callbacks and theming for the CKEditor toolbar configuration UI.
8 use Drupal\Component\Utility\Html;
9 use Drupal\Core\Template\Attribute;
10 use Drupal\Core\Language\LanguageInterface;
13 * Prepares variables for CKEditor settings toolbar templates.
15 * Default template: ckeditor-settings-toolbar.html.twig.
17 * @param array $variables
18 * An associative array containing:
19 * - editor: An editor object.
20 * - plugins: A list of plugins.
21 * - active_buttons: A list of disabled buttons.
22 * - disabled_buttons: A list of disabled buttons.
23 * - multiple_buttons: A list of multiple buttons that may be added multiple
26 function template_preprocess_ckeditor_settings_toolbar(&$variables) {
27 $language_interface = \Drupal::languageManager()->getCurrentLanguage();
29 // Create lists of active and disabled buttons.
30 $editor = $variables['editor'];
31 $plugins = $variables['plugins'];
33 $multiple_buttons = [];
34 foreach ($plugins as $plugin_buttons) {
35 foreach ($plugin_buttons as $button_name => $button) {
36 $button['name'] = $button_name;
37 if (!empty($button['multiple'])) {
38 $multiple_buttons[$button_name] = $button;
40 $buttons[$button_name] = $button;
45 $settings = $editor->getSettings();
46 foreach ($settings['toolbar']['rows'] as $row_number => $row) {
47 $button_groups[$row_number] = [];
48 foreach ($row as $group) {
49 foreach ($group['items'] as $button_name) {
50 if (isset($buttons[$button_name])) {
51 // Save a reference to the button's configured toolbar group.
52 $buttons[$button_name]['group'] = $group['name'];
53 $active_buttons[$row_number][] = $buttons[$button_name];
54 if (empty($buttons[$button_name]['multiple'])) {
55 unset($buttons[$button_name]);
57 // Create a list of all the toolbar button groups.
58 if (!in_array($group['name'], $button_groups[$row_number])) {
59 array_push($button_groups[$row_number], $group['name']);
65 $disabled_buttons = array_diff_key($buttons, $multiple_buttons);
67 $rtl = $language_interface->getDirection() === LanguageInterface::DIRECTION_RTL ? '_rtl' : '';
69 $build_button_item = function($button, $rtl) {
70 // Value of the button item.
71 if (isset($button['image_alternative' . $rtl])) {
72 $value = $button['image_alternative' . $rtl];
74 elseif (isset($button['image_alternative'])) {
75 $value = $button['image_alternative'];
77 elseif (isset($button['image']) || isset($button['image' . $rtl])) {
80 '#uri' => isset($button['image' . $rtl]) ? $button['image' . $rtl] : $button['image'],
81 '#title' => $button['label'],
82 '#prefix' => '<a href="#" role="button" title="' . $button['label'] . '" aria-label="' . $button['label'] . '"><span class="cke_button_icon">',
83 '#suffix' => '</span></a>',
90 // Build the button attributes.
92 'data-drupal-ckeditor-button-name' => $button['name'],
94 if (!empty($button['attributes'])) {
95 $attributes = array_merge($attributes, $button['attributes']);
98 // Build the button item.
101 'attributes' => new Attribute($attributes),
103 // If this button has group information, add it to the attributes.
104 if (!empty($button['group'])) {
105 $button_item['group'] = $button['group'];
108 // Set additional flag on the button if it can occur multiple times.
109 if (!empty($button['multiple'])) {
110 $button_item['multiple'] = TRUE;
116 // Assemble list of disabled buttons (which are always a single row).
117 $variables['active_buttons'] = [];
118 foreach ($active_buttons as $row_number => $button_row) {
119 foreach ($button_groups[$row_number] as $group_name) {
120 $group_name = (string) $group_name;
121 $variables['active_buttons'][$row_number][$group_name] = [
122 'group_name_class' => Html::getClass($group_name),
125 $buttons = array_filter($button_row, function ($button) use ($group_name) {
126 return (string) $button['group'] === $group_name;
128 foreach ($buttons as $button) {
129 $variables['active_buttons'][$row_number][$group_name]['buttons'][] = $build_button_item($button, $rtl);
133 // Assemble list of disabled buttons (which are always a single row).
134 $variables['disabled_buttons'] = [];
135 foreach ($disabled_buttons as $button) {
136 $variables['disabled_buttons'][] = $build_button_item($button, $rtl);
138 // Assemble list of multiple buttons that may be added multiple times.
139 $variables['multiple_buttons'] = [];
140 foreach ($multiple_buttons as $button) {
141 $variables['multiple_buttons'][] = $build_button_item($button, $rtl);