ckeditor.admin.inc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * @file
  4. * Callbacks and theming for the CKEditor toolbar configuration UI.
  5. */
  6. use Drupal\Component\Utility\Html;
  7. use Drupal\Core\Template\Attribute;
  8. use Drupal\Core\Language\LanguageInterface;
  9. /**
  10. * Prepares variables for CKEditor settings toolbar templates.
  11. *
  12. * Default template: ckeditor-settings-toolbar.html.twig.
  13. *
  14. * @param array $variables
  15. * An associative array containing:
  16. * - editor: An editor object.
  17. * - plugins: A list of plugins.
  18. * - active_buttons: A list of disabled buttons.
  19. * - disabled_buttons: A list of disabled buttons.
  20. * - multiple_buttons: A list of multiple buttons that may be added multiple
  21. * times.
  22. */
  23. function template_preprocess_ckeditor_settings_toolbar(&$variables) {
  24. $language_interface = \Drupal::languageManager()->getCurrentLanguage();
  25. // Create lists of active and disabled buttons.
  26. $editor = $variables['editor'];
  27. $plugins = $variables['plugins'];
  28. $buttons = [];
  29. $multiple_buttons = [];
  30. foreach ($plugins as $plugin_buttons) {
  31. foreach ($plugin_buttons as $button_name => $button) {
  32. $button['name'] = $button_name;
  33. if (!empty($button['multiple'])) {
  34. $multiple_buttons[$button_name] = $button;
  35. }
  36. $buttons[$button_name] = $button;
  37. }
  38. }
  39. $button_groups = [];
  40. $active_buttons = [];
  41. $settings = $editor->getSettings();
  42. foreach ($settings['toolbar']['rows'] as $row_number => $row) {
  43. $button_groups[$row_number] = [];
  44. foreach ($row as $group) {
  45. foreach ($group['items'] as $button_name) {
  46. if (isset($buttons[$button_name])) {
  47. // Save a reference to the button's configured toolbar group.
  48. $buttons[$button_name]['group'] = $group['name'];
  49. $active_buttons[$row_number][] = $buttons[$button_name];
  50. if (empty($buttons[$button_name]['multiple'])) {
  51. unset($buttons[$button_name]);
  52. }
  53. // Create a list of all the toolbar button groups.
  54. if (!in_array($group['name'], $button_groups[$row_number])) {
  55. array_push($button_groups[$row_number], $group['name']);
  56. }
  57. }
  58. }
  59. }
  60. }
  61. $disabled_buttons = array_diff_key($buttons, $multiple_buttons);
  62. $rtl = $language_interface->getDirection() === LanguageInterface::DIRECTION_RTL ? '_rtl' : '';
  63. $build_button_item = function ($button, $rtl) {
  64. // Value of the button item.
  65. if (isset($button['image_alternative' . $rtl])) {
  66. $value = $button['image_alternative' . $rtl];
  67. }
  68. elseif (isset($button['image_alternative'])) {
  69. $value = $button['image_alternative'];
  70. }
  71. elseif (isset($button['image']) || isset($button['image' . $rtl])) {
  72. $value = [
  73. '#theme' => 'image',
  74. '#uri' => isset($button['image' . $rtl]) ? $button['image' . $rtl] : $button['image'],
  75. '#title' => $button['label'],
  76. '#prefix' => '<a href="#" role="button" title="' . $button['label'] . '" aria-label="' . $button['label'] . '"><span class="cke_button_icon">',
  77. '#suffix' => '</span></a>',
  78. ];
  79. }
  80. else {
  81. $value = '?';
  82. }
  83. // Build the button attributes.
  84. $attributes = [
  85. 'data-drupal-ckeditor-button-name' => $button['name'],
  86. ];
  87. if (!empty($button['attributes'])) {
  88. $attributes = array_merge($attributes, $button['attributes']);
  89. }
  90. // Build the button item.
  91. $button_item = [
  92. 'value' => $value,
  93. 'attributes' => new Attribute($attributes),
  94. ];
  95. // If this button has group information, add it to the attributes.
  96. if (!empty($button['group'])) {
  97. $button_item['group'] = $button['group'];
  98. }
  99. // Set additional flag on the button if it can occur multiple times.
  100. if (!empty($button['multiple'])) {
  101. $button_item['multiple'] = TRUE;
  102. }
  103. return $button_item;
  104. };
  105. // Assemble list of disabled buttons (which are always a single row).
  106. $variables['active_buttons'] = [];
  107. foreach ($active_buttons as $row_number => $button_row) {
  108. foreach ($button_groups[$row_number] as $group_name) {
  109. $group_name = (string) $group_name;
  110. $variables['active_buttons'][$row_number][$group_name] = [
  111. 'group_name_class' => Html::getClass($group_name),
  112. 'buttons' => [],
  113. ];
  114. $buttons = array_filter($button_row, function ($button) use ($group_name) {
  115. return (string) $button['group'] === $group_name;
  116. });
  117. foreach ($buttons as $button) {
  118. $variables['active_buttons'][$row_number][$group_name]['buttons'][] = $build_button_item($button, $rtl);
  119. }
  120. }
  121. }
  122. // Assemble list of disabled buttons (which are always a single row).
  123. $variables['disabled_buttons'] = [];
  124. foreach ($disabled_buttons as $button) {
  125. $variables['disabled_buttons'][] = $build_button_item($button, $rtl);
  126. }
  127. // Assemble list of multiple buttons that may be added multiple times.
  128. $variables['multiple_buttons'] = [];
  129. foreach ($multiple_buttons as $button) {
  130. $variables['multiple_buttons'][] = $build_button_item($button, $rtl);
  131. }
  132. }