Files
2024-11-20 09:09:44 +01:00

473 lines
14 KiB
PHP

<?php
/**
* Creative Elements - live Theme & Page Builder
*
* @author WebshopWorks, Elementor
* @copyright 2019-2023 WebshopWorks.com & Elementor.com
* @license https://www.gnu.org/licenses/gpl-3.0.html
*/
namespace CE;
defined('_PS_VERSION_') or exit;
use CE\CoreXCommonXModulesXAjaxXModule as Ajax;
use CE\CoreXFilesXAssetsXSvgXSvgHandler as SvgHandler;
/**
* Elementor icons manager.
*
* Elementor icons manager handler class
*
* @since 2.4.0
*/
class IconsManager
{
// const NEEDS_UPDATE_OPTION = 'icon_manager_needs_update';
/**
* Tabs.
*
* Holds the list of all the tabs.
*
* @static
*
* @since 2.4.0
*
* @var array
*/
private static $tabs;
// private static function getNeedsUpgradeOption()
/**
* register styles
*
* Used to register all icon types stylesheets so they could be enqueued later by widgets
*/
public function registerStyles()
{
$config = self::getIconManagerTabsConfig();
$shared_styles = [];
foreach ($config as $type => $icon_type) {
if (!isset($icon_type['url'])) {
continue;
}
$dependencies = [];
if (!empty($icon_type['enqueue'])) {
foreach ((array) $icon_type['enqueue'] as $font_css_url) {
if (!in_array($font_css_url, array_keys($shared_styles))) {
$style_handle = 'elementor-icons-shared-' . count($shared_styles);
wp_register_style(
$style_handle,
$font_css_url,
[],
$icon_type['ver']
);
$shared_styles[$font_css_url] = $style_handle;
}
$dependencies[] = $shared_styles[$font_css_url];
}
}
wp_register_style(
'elementor-icons-' . $icon_type['name'],
$icon_type['url'],
$dependencies,
$icon_type['ver']
);
}
}
/**
* Init Tabs
*
* Initiate Icon Manager Tabs.
*
* @static
*
* @since 2.4.0
*/
private static function initTabs()
{
$min = _PS_MODE_DEV_ ? '' : '.min';
self::$tabs = apply_filters('elementor/icons_manager/native', [
'ce-icons' => [
'name' => 'ce-icons',
'label' => 'Creative Elements - ' . __('Default'),
'url' => _CE_ASSETS_URL_ . "lib/ceicons/ceicons$min.css",
'enqueue' => [],
'prefix' => 'ceicon-',
'displayPrefix' => '',
'labelIcon' => 'eicon-icons-solid',
'ver' => _CE_VERSION_,
'fetchJson' => _CE_ASSETS_URL_ . 'lib/ceicons/ceicons.js',
'native' => true,
],
'fa-regular' => [
'name' => 'fa-regular',
'label' => __('Font Awesome - Regular'),
'url' => self::getFaAssetUrl('regular'),
'enqueue' => [],
'prefix' => 'fa-',
'displayPrefix' => 'far',
'labelIcon' => 'fab fa-square-font-awesome-stroke',
'ver' => '6.2',
'fetchJson' => self::getFaAssetUrl('regular', 'js', false),
'native' => true,
],
'fa-solid' => [
'name' => 'fa-solid',
'label' => __('Font Awesome - Solid'),
'url' => self::getFaAssetUrl('solid'),
'enqueue' => [],
'prefix' => 'fa-',
'displayPrefix' => 'fas',
'labelIcon' => 'fab fa-square-font-awesome',
'ver' => '6.2',
'fetchJson' => self::getFaAssetUrl('solid', 'js', false),
'native' => true,
],
'fa-brands' => [
'name' => 'fa-brands',
'label' => __('Font Awesome - Brands'),
'url' => self::getFaAssetUrl('brands'),
'enqueue' => [],
'prefix' => 'fa-',
'displayPrefix' => 'fab',
'labelIcon' => 'far fa-font-awesome',
'ver' => '6.2',
'fetchJson' => self::getFaAssetUrl('brands', 'js', false),
'native' => true,
],
]);
}
/**
* Get Icon Manager Tabs
*
* @return array
*/
public static function getIconManagerTabs()
{
if (!self::$tabs) {
self::initTabs();
}
$additional_tabs = apply_filters('elementor/icons_manager/additional_tabs', []);
return array_merge(self::$tabs, $additional_tabs);
}
public static function enqueueShim()
{
static $enqueued;
if ($enqueued) {
return;
}
// wp_enqueue_script(
// 'font-awesome-4-shim',
// self::getFaAssetUrl('v4-shims', 'js'),
// [],
// _CE_VERSION_
// );
// Make sure that the CSS in the 'all' file does not override FA Pro's CSS
// if (!wp_script_is('font-awesome-pro')) {
// wp_enqueue_style(
// 'font-awesome-5-all',
// self::getFaAssetUrl('all'),
// [],
// _CE_VERSION_
// );
// }
$frontend = Plugin::$instance->frontend;
$frontend->maybeEnqueueIconFont('fa-regular');
$frontend->maybeEnqueueIconFont('fa-solid');
$frontend->maybeEnqueueIconFont('fa-brands');
wp_enqueue_style(
'font-awesome-4-shim',
self::getFaAssetUrl('v4-shims'),
[],
'6.2'
);
$enqueued = true;
}
private static function getFaAssetUrl($filename, $ext_type = 'css', $add_suffix = true)
{
$url = _CE_ASSETS_URL_ . 'lib/font-awesome/' . $ext_type . '/' . $filename;
if (!_PS_MODE_DEV_ && $add_suffix) {
$url .= '.min';
}
return $url . '.' . $ext_type;
}
public static function getIconManagerTabsConfig()
{
$tabs = [
'all' => [
'name' => 'all',
'label' => __('All Icons'),
'labelIcon' => 'eicon-filter',
'native' => true,
],
];
return array_values(array_merge($tabs, self::getIconManagerTabs()));
}
private static function renderSvgIcon($value)
{
if (empty($value['url'])) {
return '';
}
return SvgHandler::getInlineSvg($value['url']);
}
private static function renderIconHtml($icon, $attributes = [], $tag = 'i')
{
$icon_types = self::getIconManagerTabs();
if (isset($icon_types[$icon['library']]['render_callback']) && is_callable($icon_types[$icon['library']]['render_callback'])) {
return call_user_func_array($icon_types[$icon['library']]['render_callback'], [$icon, $attributes, $tag]);
}
if (empty($attributes['class'])) {
$attributes['class'] = $icon['value'];
} else {
if (is_array($attributes['class'])) {
$attributes['class'][] = $icon['value'];
} else {
$attributes['class'] .= ' ' . $icon['value'];
}
}
return '<' . $tag . ' ' . Utils::renderHtmlAttributes($attributes) . '></' . $tag . '>';
}
/**
* Render Icon
*
* Used to render Icon for ControlsManager::ICONS
*
* @param array $icon Icon Type, Icon value
* @param array $attributes Icon HTML Attributes
* @param string $tag Icon HTML tag, defaults to <i>
*
* @return mixed|string
*/
public static function renderIcon($icon, $attributes = [], $tag = 'i')
{
if (empty($icon['library'])) {
return false;
}
$output = '';
// handler SVG Icon
if ('svg' === $icon['library']) {
$output = self::renderSvgIcon($icon['value']);
} else {
$output = self::renderIconHtml($icon, $attributes, $tag);
}
echo $output;
return true;
}
public static function getBcIcon(array &$settings, $bc_name, $attributes = [], $tag = 'i')
{
if (isset($attributes['selected'])) {
$control_name = $attributes['selected'];
unset($attributes['selected']);
} else {
$control_name = "selected_$bc_name";
}
if (isset($settings[$bc_name]) && !isset($settings['__fa4_migrated'][$control_name])) {
$icon = [
'value' => $settings[$bc_name],
'library' => 'v4-shims',
];
empty($settings[$bc_name]) or self::enqueueShim();
} elseif (isset($settings[$control_name])) {
$icon = &$settings[$control_name];
}
if (empty($icon['value']) || empty($icon['library'])) {
return;
}
return 'svg' === $icon['library']
? self::renderSvgIcon($icon['value'])
: self::renderIconHtml($icon, $attributes, $tag);
}
public static function renderBcIcon(array &$settings, $bc_name, $attributes = [], $tag = 'i')
{
$control_name = isset($attributes['selected']) ? $attributes['selected'] : "selected_$bc_name";
if (!isset($settings[$control_name])) {
return false;
}
unset($attributes['selected']);
if (!empty($settings[$bc_name]) && !isset($settings['__fa4_migrated'][$control_name])) {
$settings[$control_name] = [
'value' => $settings[$bc_name],
'library' => 'v4-shims',
];
self::enqueueShim();
}
return self::renderIcon($settings[$control_name], $attributes, $tag);
}
/**
* Font Awesome 4 to font Awesome 5 Value Migration
*
* used to convert string value of Icon control to array value of Icons control
* ex: 'fa fa-star' => [ 'value' => 'fas fa-star', 'library' => 'fa-solid' ]
*
* @param $value
*
* @return array
*/
public static function fa4ToFa6ValueMigration($value)
{
static $migration_dictionary = false;
if ('' === $value) {
return [
'value' => '',
'library' => '',
];
}
if ('c' === $value[0]) {
return [
'value' => $value,
'library' => 'ce-icons',
];
}
if (false === $migration_dictionary) {
$migration_dictionary = json_decode(
call_user_func('file_get_contents', _CE_ASSETS_PATH_ . 'lib/font-awesome/migration/mapping.js'),
true
);
}
if (isset($migration_dictionary[$value])) {
return $migration_dictionary[$value];
}
return [
'value' => 'fas ' . str_replace('fa ', '', $value),
'library' => 'fa-solid',
];
}
/**
* on_import_migration
*
* @param array $element settings array
* @param string $old_control old control id
* @param string $new_control new control id
* @param bool $remove_old boolean weather to remove old control or not
*
* @return array
*/
public static function &onImportMigration(array &$element, $old_control = '', $new_control = '', $remove_old = true)
{
if (!isset($element['settings'][$old_control]) || isset($element['settings'][$new_control])) {
return $element;
}
// Case when old value is saved as empty string
$new_value = [
'value' => '',
'library' => '',
];
// Case when old value needs migration
// if (!empty($element['settings'][$old_control]) && !self::isMigrationAllowed()) {
if (!empty($element['settings'][$old_control])) {
$new_value = self::fa4ToFa6ValueMigration($element['settings'][$old_control]);
}
$element['settings'][$new_control] = $new_value;
// remove old value
if ($remove_old) {
unset($element['settings'][$old_control]);
}
return $element;
}
/**
* is_migration_allowed
*
* @return bool
*/
public static function isMigrationAllowed()
{
return true;
}
// public function registerAdminSettings(Settings $settings)
// public function registerAdminToolsSettings(Tools $settings)
// public function ajaxUpgradeToFa5()
// public function addUpdateNeededFlag($settings)
public function enqueueFontawesomeCss()
{
// if ( ! self::is_migration_allowed() ) {
// wp_enqueue_style( 'font-awesome' );
// } else {
// $current_filter = current_filter();
// $load_shim = get_option( 'elementor_load_fa4_shim', false );
// if ( 'elementor/editor/after_enqueue_styles' === $current_filter ) {
// self::enqueue_shim();
// } else if ( 'yes' === $load_shim ) {
// self::enqueue_shim();
// }
// }
\Configuration::get('elementor_load_fa4_shim') && self::enqueueShim();
}
// public function addAdminStrings($settings)
/**
* Icons Manager constructor
*/
public function __construct()
{
/*
if (is_admin()) {
// @todo: remove once we deprecate fa4
add_action('elementor/admin/after_create_settings/' . Settings::PAGE_ID, [$this, 'registerAdminSettings'], 100);
add_action('elementor/admin/localize_settings', [$this, 'addAdminStrings']);
}
*/
add_action('elementor/editor/after_enqueue_styles', [$this, 'enqueueShim']);
add_action('elementor/frontend/after_enqueue_styles', [$this, 'enqueueFontawesomeCss']);
add_action('elementor/frontend/after_register_styles', [$this, 'registerStyles']);
// if (!self::isMigrationAllowed()) {
// add_filter('elementor/editor/localize_settings', [$this, 'addUpdateNeededFlag']);
// // add_action('elementor/admin/after_create_settings/' . Tools::PAGE_ID, [$this, 'registerAdminToolsSettings'], 100);
// if (!empty(${'_POST'})) {
// add_action('wp_ajax_' . self::NEEDS_UPDATE_OPTION . '_upgrade', [$this, 'ajaxUpgradeToFa5']);
// }
// }
}
}