kit.php (6142B)
1 <?php 2 namespace Elementor\Core\Kits\Documents; 3 4 use Elementor\Core\DocumentTypes\PageBase; 5 use Elementor\Core\Files\CSS\Post as Post_CSS; 6 use Elementor\Core\Kits\Documents\Tabs; 7 use Elementor\Core\Settings\Manager as SettingsManager; 8 use Elementor\Core\Settings\Page\Manager as PageManager; 9 use Elementor\Plugin; 10 11 if ( ! defined( 'ABSPATH' ) ) { 12 exit; // Exit if accessed directly 13 } 14 15 class Kit extends PageBase { 16 /** 17 * @var Tabs\Tab_Base[] 18 */ 19 private $tabs; 20 21 public function __construct( array $data = [] ) { 22 parent::__construct( $data ); 23 24 $this->register_tabs(); 25 } 26 27 public static function get_properties() { 28 $properties = parent::get_properties(); 29 30 $properties['has_elements'] = false; 31 $properties['show_in_finder'] = false; 32 $properties['show_on_admin_bar'] = false; 33 $properties['edit_capability'] = 'edit_theme_options'; 34 $properties['support_kit'] = true; 35 36 return $properties; 37 } 38 39 public static function get_type() { 40 return 'kit'; 41 } 42 43 public static function get_title() { 44 return esc_html__( 'Kit', 'elementor' ); 45 } 46 47 /** 48 * @return Tabs\Tab_Base[] 49 */ 50 public function get_tabs() { 51 return $this->tabs; 52 } 53 54 /** 55 * Retrieve a tab by ID. 56 * 57 * @param $id 58 * 59 * @return Tabs\Tab_Base 60 */ 61 public function get_tab( $id ) { 62 return self::get_items( $this->get_tabs(), $id ); 63 } 64 65 protected function get_have_a_look_url() { 66 return ''; 67 } 68 69 public static function get_editor_panel_config() { 70 $config = parent::get_editor_panel_config(); 71 $config['default_route'] = 'panel/global/menu'; 72 73 $config['needHelpUrl'] = 'https://go.elementor.com/global-settings'; 74 75 return $config; 76 } 77 78 public function get_css_wrapper_selector() { 79 return '.elementor-kit-' . $this->get_main_id(); 80 } 81 82 public function save( $data ) { 83 foreach ( $this->tabs as $tab ) { 84 $data = $tab->before_save( $data ); 85 } 86 87 $saved = parent::save( $data ); 88 89 if ( ! $saved ) { 90 return false; 91 } 92 93 // Should set is_saving to true, to avoid infinite loop when updating 94 // settings like: 'site_name" or "site_description". 95 $this->set_is_saving( true ); 96 97 foreach ( $this->tabs as $tab ) { 98 $tab->on_save( $data ); 99 } 100 101 $this->set_is_saving( false ); 102 103 // When deleting a global color or typo, the css variable still exists in the frontend 104 // but without any value and it makes the element to be un styled even if there is a default style for the base element, 105 // for that reason this method removes css files of the entire site. 106 Plugin::instance()->files_manager->clear_cache(); 107 108 return $saved; 109 } 110 111 /** 112 * Register a kit settings menu. 113 * 114 * @param $id 115 * @param $class 116 */ 117 public function register_tab( $id, $class ) { 118 $this->tabs[ $id ] = new $class( $this ); 119 } 120 121 /** 122 * @inheritDoc 123 */ 124 protected function get_initial_config() { 125 $config = parent::get_initial_config(); 126 127 foreach ( $this->tabs as $id => $tab ) { 128 $config['tabs'][ $id ] = [ 129 'title' => $tab->get_title(), 130 'icon' => $tab->get_icon(), 131 'group' => $tab->get_group(), 132 'helpUrl' => $tab->get_help_url(), 133 'additionalContent' => $tab->get_additional_tab_content(), 134 ]; 135 } 136 137 return $config; 138 } 139 140 /** 141 * @since 3.1.0 142 * @access protected 143 */ 144 protected function register_controls() { 145 $is_edit_mode = Plugin::$instance->editor->is_edit_mode(); 146 147 if ( ! $is_edit_mode ) { 148 // In the Front End, the Kit is initialized before CSS is generated, so we always duplicate controls in 149 // the kit. 150 $initial_responsive_controls_duplication_mode = Plugin::$instance->breakpoints->get_responsive_control_duplication_mode(); 151 152 Plugin::$instance->breakpoints->set_responsive_control_duplication_mode( 'on' ); 153 } 154 155 $this->register_document_controls(); 156 157 foreach ( $this->tabs as $tab ) { 158 $tab->register_controls(); 159 } 160 161 if ( ! $is_edit_mode ) { 162 Plugin::$instance->breakpoints->set_responsive_control_duplication_mode( $initial_responsive_controls_duplication_mode ); 163 } 164 } 165 166 protected function get_post_statuses() { 167 return [ 168 'draft' => sprintf( '%s (%s)', esc_html__( 'Disabled', 'elementor' ), esc_html__( 'Draft', 'elementor' ) ), 169 'publish' => esc_html__( 'Published', 'elementor' ), 170 ]; 171 } 172 173 public function add_repeater_row( $control_id, $item ) { 174 $meta_key = PageManager::META_KEY; 175 $document_settings = $this->get_meta( $meta_key ); 176 177 if ( ! $document_settings ) { 178 $document_settings = []; 179 } 180 181 if ( ! isset( $document_settings[ $control_id ] ) ) { 182 $document_settings[ $control_id ] = []; 183 } 184 185 $document_settings[ $control_id ][] = $item; 186 187 $page_settings_manager = SettingsManager::get_settings_managers( 'page' ); 188 $page_settings_manager->save_settings( $document_settings, $this->get_id() ); 189 190 /** @var Kit $autosave **/ 191 $autosave = $this->get_autosave(); 192 193 if ( $autosave ) { 194 $autosave->add_repeater_row( $control_id, $item ); 195 } 196 197 // Remove Post CSS. 198 $post_css = Post_CSS::create( $this->post->ID ); 199 200 $post_css->delete(); 201 202 // Refresh Cache. 203 Plugin::$instance->documents->get( $this->post->ID, false ); 204 205 $post_css = Post_CSS::create( $this->post->ID ); 206 207 $post_css->enqueue(); 208 } 209 210 /** 211 * Register default tabs (menu pages) for site settings. 212 */ 213 private function register_tabs() { 214 $tabs = [ 215 'global-colors' => Tabs\Global_Colors::class, 216 'global-typography' => Tabs\Global_Typography::class, 217 'theme-style-typography' => Tabs\Theme_Style_Typography::class, 218 'theme-style-buttons' => Tabs\Theme_Style_Buttons::class, 219 'theme-style-images' => Tabs\Theme_Style_Images::class, 220 'theme-style-form-fields' => Tabs\Theme_Style_Form_Fields::class, 221 'settings-site-identity' => Tabs\Settings_Site_Identity::class, 222 'settings-background' => Tabs\Settings_Background::class, 223 'settings-layout' => Tabs\Settings_Layout::class, 224 'settings-lightbox' => Tabs\Settings_Lightbox::class, 225 // TODO: Revert when Page Transitions will be released. 226 //'settings-page-transitions' => Tabs\Settings_Page_Transitions::class, 227 'settings-custom-css' => Tabs\Settings_Custom_CSS::class, 228 ]; 229 230 foreach ( $tabs as $id => $class ) { 231 $this->register_tab( $id, $class ); 232 } 233 234 do_action( 'elementor/kit/register_tabs', $this ); 235 } 236 }