mirror of
https://github.com/proelements/proelements.git
synced 2026-04-19 10:32:16 +00:00
v3.33.1
This commit is contained in:
221
core/app/modules/site-editor/module.php
Normal file
221
core/app/modules/site-editor/module.php
Normal file
@@ -0,0 +1,221 @@
|
||||
<?php
|
||||
namespace ElementorPro\Core\App\Modules\SiteEditor;
|
||||
|
||||
use Elementor\Core\Admin\Menu\Admin_Menu_Manager;
|
||||
use Elementor\Core\Experiments\Manager as ExperimentsManager;
|
||||
use Elementor\Core\Frontend\Render_Mode_Manager;
|
||||
use Elementor\Core\Base\Module as BaseModule;
|
||||
use Elementor\Core\Common\Modules\Ajax\Module as Ajax;
|
||||
use Elementor\TemplateLibrary\Source_Local;
|
||||
use ElementorPro\Core\App\Modules\SiteEditor\Data\Controller;
|
||||
use ElementorPro\Core\Behaviors\Feature_Lock;
|
||||
use ElementorPro\Modules\ThemeBuilder\AdminMenuItems\Theme_Builder_Menu_Item;
|
||||
use ElementorPro\Modules\ThemeBuilder\Module as Theme_Builder_Table_View;
|
||||
use ElementorPro\Modules\ThemeBuilder\Module as ThemeBuilderModule;
|
||||
use ElementorPro\Plugin;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
}
|
||||
|
||||
/**
|
||||
* Site Editor Module
|
||||
*
|
||||
* Responsible for initializing Elementor Pro App functionality
|
||||
*/
|
||||
class Module extends BaseModule {
|
||||
/**
|
||||
* @var Feature_Lock
|
||||
*/
|
||||
private $lock;
|
||||
|
||||
/**
|
||||
* Get name.
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return 'site-editor';
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function get_template_types() {
|
||||
// Same as admin menu capabilities.
|
||||
if ( ! current_user_can( 'publish_posts' ) ) {
|
||||
throw new \Exception( 'Access denied' );
|
||||
}
|
||||
|
||||
$document_types = Plugin::elementor()->documents->get_document_types( [
|
||||
'support_site_editor' => true,
|
||||
] );
|
||||
|
||||
// Keep 404 at end of array.
|
||||
$error_404 = $document_types['error-404'];
|
||||
unset( $document_types['error-404'] );
|
||||
$document_types['error-404'] = $error_404;
|
||||
|
||||
// Currently the `single` itself is not supported in site editor.
|
||||
// Don't use `support_site_editor=false` in order to support documents that extend it.
|
||||
unset( $document_types['single'] );
|
||||
|
||||
$types = [];
|
||||
|
||||
foreach ( $document_types as $type => $class ) {
|
||||
$types[] = $class::get_site_editor_config();
|
||||
}
|
||||
|
||||
return $types;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register ajax actions.
|
||||
*
|
||||
* @access public
|
||||
*
|
||||
* @param Ajax $ajax
|
||||
*/
|
||||
public function register_ajax_actions( Ajax $ajax ) {
|
||||
$ajax->register_ajax_action( 'app_site_editor_template_types', [ $this, 'get_template_types' ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Render_Mode_Manager $manager
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function register_render_mode( Render_Mode_Manager $manager ) {
|
||||
$manager->register_render_mode( Render_Mode_Template_Preview::class );
|
||||
}
|
||||
|
||||
protected function get_init_settings() {
|
||||
$settings = [
|
||||
'urls' => [
|
||||
'legacy_view' => add_query_arg( 'tabs_group', ThemeBuilderModule::ADMIN_LIBRARY_TAB_GROUP, admin_url( Source_Local::ADMIN_MENU_SLUG ) ),
|
||||
],
|
||||
'utms' => [
|
||||
'utm_source' => 'theme-builder',
|
||||
'utm_medium' => 'wp-dash',
|
||||
],
|
||||
];
|
||||
|
||||
if ( $this->lock->is_locked() ) {
|
||||
$settings['lock'] = $this->lock->get_config();
|
||||
}
|
||||
|
||||
return $settings;
|
||||
}
|
||||
|
||||
private function add_default_new_site_editor_experiments( ExperimentsManager $manager ) {
|
||||
$manager->add_feature( [
|
||||
'name' => 'theme_builder_v2',
|
||||
'title' => __( 'Default to New Theme Builder', 'elementor-pro' ),
|
||||
'description' => __( 'Entering the Theme Builder through WP Dashboard > Templates > Theme Builder opens the New theme builder by default. But don’t worry, you can always view the WP styled version of the screen with a simple click of a button.', 'elementor-pro' ),
|
||||
'release_status' => ExperimentsManager::RELEASE_STATUS_STABLE,
|
||||
'default' => ExperimentsManager::STATE_ACTIVE,
|
||||
] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get site editor url.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
private function get_site_editor_url() : string {
|
||||
return Plugin::elementor()->app->get_base_url() . '#/site-editor';
|
||||
}
|
||||
|
||||
private function register_site_editor_menu() {
|
||||
$experiments_manager = Plugin::elementor()->experiments;
|
||||
|
||||
// Unique case when the experiments manager is not initialized yet.
|
||||
if ( ! $experiments_manager || ! $experiments_manager->is_feature_active( 'theme_builder_v2' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove the old theme builder link and add the new one.
|
||||
remove_submenu_page(
|
||||
Source_Local::ADMIN_MENU_SLUG,
|
||||
add_query_arg( 'tabs_group', ThemeBuilderModule::ADMIN_LIBRARY_TAB_GROUP, Source_Local::ADMIN_MENU_SLUG )
|
||||
);
|
||||
|
||||
add_submenu_page(
|
||||
Source_Local::ADMIN_MENU_SLUG,
|
||||
'',
|
||||
__( 'Theme Builder', 'elementor-pro' ),
|
||||
'publish_posts',
|
||||
$this->get_site_editor_url()
|
||||
);
|
||||
}
|
||||
|
||||
private function register_admin_menu( Admin_Menu_Manager $admin_menu_manager ) {
|
||||
$experiments_manager = Plugin::elementor()->experiments;
|
||||
|
||||
// Unique case when the experiments manager is not initialized yet.
|
||||
if ( ! $experiments_manager || ! $experiments_manager->is_feature_active( 'theme_builder_v2' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$admin_menu_manager->unregister( add_query_arg( 'tabs_group', ThemeBuilderModule::ADMIN_LIBRARY_TAB_GROUP, Source_Local::ADMIN_MENU_SLUG ) );
|
||||
|
||||
$admin_menu_manager->register(
|
||||
$this->get_site_editor_url(),
|
||||
new Theme_Builder_Menu_Item()
|
||||
);
|
||||
}
|
||||
|
||||
private function add_finder_item( array $categories ) {
|
||||
if ( ! Plugin::elementor()->experiments->is_feature_active( 'theme_builder_v2' ) ) {
|
||||
return $categories;
|
||||
}
|
||||
|
||||
// Replace the old theme builder "create-new" link with the new site-editor.
|
||||
$categories['create']['items']['theme-template'] = [
|
||||
'title' => __( 'Add New Theme Template', 'elementor-pro' ),
|
||||
'icon' => 'plus-circle-o',
|
||||
'url' => $this->get_site_editor_url() . '/add-new',
|
||||
'keywords' => [ 'template', 'theme', 'new', 'create' ],
|
||||
];
|
||||
|
||||
return $categories;
|
||||
}
|
||||
|
||||
/**
|
||||
* Module constructor.
|
||||
*
|
||||
* @access public
|
||||
*/
|
||||
public function __construct() {
|
||||
$this->lock = new Feature_Lock( [ 'type' => 'theme-builder' ] );
|
||||
|
||||
Plugin::elementor()->data_manager->register_controller( Controller::class );
|
||||
|
||||
add_action( 'elementor/ajax/register_actions', [ $this, 'register_ajax_actions' ], 11 /* Override core actions */ );
|
||||
add_action( 'elementor/frontend/render_mode/register', [ $this, 'register_render_mode' ] );
|
||||
|
||||
add_action( 'elementor/experiments/default-features-registered', function ( ExperimentsManager $manager ) {
|
||||
$this->add_default_new_site_editor_experiments( $manager );
|
||||
} );
|
||||
|
||||
add_action( 'elementor/admin/menu/register', function ( Admin_Menu_Manager $admin_menu ) {
|
||||
$this->register_admin_menu( $admin_menu );
|
||||
}, Theme_Builder_Table_View::ADMIN_MENU_PRIORITY + 1 );
|
||||
|
||||
// TODO: BC - Remove after `Admin_Menu_Manager` will be the standard.
|
||||
add_action( 'admin_menu', function () {
|
||||
if ( did_action( 'elementor/admin/menu/register' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->register_site_editor_menu();
|
||||
}, 23 /* After old theme builder */ );
|
||||
|
||||
add_filter( 'elementor/finder/categories', function ( array $categories ) {
|
||||
return $this->add_finder_item( $categories );
|
||||
}, 11 /* After old theme builder */ );
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user