Files
liceo-ariosto/plugins/editors/tinymce/src/PluginTraits/XTDButtons.php
2025-06-17 11:53:18 +02:00

119 lines
3.7 KiB
PHP

<?php
/**
* @package Joomla.Plugin
* @subpackage Editors.tinymce
*
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Plugin\Editors\TinyMCE\PluginTraits;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\LayoutHelper;
use Joomla\CMS\Uri\Uri;
// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
/**
* Resolves the XTD Buttons for the current TinyMCE editor.
*
* @since 4.1.0
*/
trait XTDButtons
{
/**
* Get the XTD buttons and render them inside tinyMCE
*
* @param mixed $buttons the buttons that should be hidden
* @param array $options Associative array with additional parameters
*
* @return array
*
* @since 4.1.0
*/
private function tinyButtons($buttons, array $options = []): array
{
// Get buttons from plugins
$buttonsList = $this->getButtons($buttons, $options);
if (!$buttonsList) {
return [];
}
/** @var \Joomla\CMS\WebAsset\WebAssetManager $wa */
$wa = $this->application->getDocument()->getWebAssetManager();
$editorId = $options['editorId'] ?? '';
Text::script('PLG_TINY_CORE_BUTTONS');
// Build a buttons option for TinyMCE
$tinyButtons = [];
foreach ($buttonsList as $button) {
$title = $button->get('title') ?: $button->get('text', '');
$icon = $button->get('icon');
$link = $button->get('link');
$action = $button->get('action', '');
$options = (array) $button->get('options');
$btnAsset = 'editor-button.' . $button->getButtonName();
// Enable the button assets if any
if ($wa->assetExists('style', $btnAsset)) {
$wa->useStyle($btnAsset);
}
if ($wa->assetExists('script', $btnAsset)) {
$wa->useScript($btnAsset);
}
// Correct the link
if ($link && $link[0] !== '#') {
$link = str_contains($link, '&amp;') ? htmlspecialchars_decode($link) : $link;
$link = Uri::base(true) . '/' . $link;
$options['src'] = $options['src'] ?? $link;
}
// Set action to "modal" for legacy buttons, when possible
$legacyModal = $button->get('modal');
// Prepare default values for modal
if ($action === 'modal') {
$wa->useScript('joomla.dialog');
$legacyModal = false;
$options['popupType'] = $options['popupType'] ?? 'iframe';
$options['textHeader'] = $options['textHeader'] ?? $title;
$options['iconHeader'] = $options['iconHeader'] ?? 'icon-' . $icon;
}
$coreButton = [];
$coreButton['name'] = $title;
$coreButton['icon'] = $icon;
$coreButton['click'] = $button->get('onclick');
$coreButton['iconSVG'] = $button->get('iconSVG');
$coreButton['action'] = $action;
$coreButton['options'] = $options;
if ($legacyModal) {
$coreButton['bsModal'] = true;
$coreButton['id'] = $editorId . '_' . $button->name;
$button->id = $editorId . '_' . $button->name . '_modal';
echo LayoutHelper::render('joomla.editors.buttons.modal', $button);
}
// The array with the toolbar buttons
$tinyButtons[] = $coreButton;
}
sort($tinyButtons);
return ['names' => $tinyButtons];
}
}