This repository has been archived on 2022-06-23. You can view files and clone it, but cannot push or open issues or pull requests.
divi/includes/builder/api/DiviExtension.php
2021-12-07 11:08:05 +00:00

348 lines
8.5 KiB
PHP

<?php
/**
* Divi extension base class.
*
* @package Builder
* @subpackage API
* @since 4.6.2
*/
/**
* Core class used to implement the Divi Extension.
*/
class DiviExtension {
/**
* Utility class instance.
*
* @since 3.1
*
* @var ET_Core_Data_Utils
*/
protected static $_;
/**
* Dependencies for the extension's JavaScript bundles.
*
* @since 3.1
*
* @var array {
* JavaScript Bundle Dependencies
*
* @type string[] $builder Dependencies for the builder bundle
* @type string[] $frontend Dependencies for the frontend bundle
* }
*/
protected $_bundle_dependencies = array();
/**
* Builder bundle data
*
* @since 3.1
*
* @var array
*/
protected $_builder_js_data = array();
/**
* Frontend bundle data
*
* @since 3.1
*
* @var array
*/
protected $_frontend_js_data = array();
/**
* Whether or not the extension's debug mode is enabled. This should always be enabled
* during development and never be enabled in production.
*
* @since 3.1
*
* @var bool
*/
protected $_debug;
/**
* The gettext domain for the extension's translations.
*
* @since 3.1
*
* @var string
*/
public $gettext_domain;
/**
* The extension's WP Plugin name.
*
* @since 3.1
*
* @var string
*/
public $name;
/**
* Absolute path to the extension's directory.
*
* @since 3.1
*
* @var string
*/
public $plugin_dir;
/**
* The extension's directory URL.
*
* @since 3.1
*
* @var string
*/
public $plugin_dir_url;
/**
* The extension's version.
*
* @since 3.1
*
* @var string
*/
public $version;
/**
* DiviExtension constructor.
*
* @since 3.1
*
* @param string $name This Divi Extension's WP Plugin name/slug.
* @param array $args Argument flexibility for child classes.
*/
public function __construct( $name = '', $args = array() ) {
if ( ! self::$_ ) {
self::$_ = ET_Core_Data_Utils::instance();
}
$this->name = $name;
if ( $this->name ) {
$this->_initialize();
}
}
/**
* Enqueues minified, production javascript bundles.
*
* @since 3.1
*/
protected function _enqueue_bundles() {
// Frontend Bundle.
$bundle_url = "{$this->plugin_dir_url}scripts/frontend-bundle.min.js";
wp_enqueue_script( "{$this->name}-frontend-bundle", $bundle_url, $this->_bundle_dependencies['frontend'], $this->version, true );
if ( et_core_is_fb_enabled() ) {
// Builder Bundle.
$bundle_url = "{$this->plugin_dir_url}scripts/builder-bundle.min.js";
wp_enqueue_script( "{$this->name}-builder-bundle", $bundle_url, $this->_bundle_dependencies['builder'], $this->version, true );
}
}
/**
* Enqueues non-minified, hot reloaded javascript bundles.
*
* @since 3.1
*/
protected function _enqueue_debug_bundles() {
// Frontend Bundle.
$site_url = wp_parse_url( get_site_url() );
$hot_bundle_url = "{$site_url['scheme']}://{$site_url['host']}:3000/static/js/frontend-bundle.js";
wp_enqueue_script( "{$this->name}-frontend-bundle", $hot_bundle_url, $this->_bundle_dependencies['frontend'], $this->version, true );
if ( et_core_is_fb_enabled() ) {
// Builder Bundle.
$hot_bundle_url = "{$site_url['scheme']}://{$site_url['host']}:3000/static/js/builder-bundle.js";
wp_enqueue_script( "{$this->name}-builder-bundle", $hot_bundle_url, $this->_bundle_dependencies['builder'], $this->version, true );
}
}
/**
* Enqueues minified (production) or non-minified (hot reloaded) backend styles.
*
* @since 4.4.9
*/
protected function _enqueue_backend_styles() {
if ( $this->_debug ) {
$site_url = wp_parse_url( get_site_url() );
$backend_styles_url = "{$site_url['scheme']}://{$site_url['host']}:3000/styles/backend-style.css";
} else {
$extension_dir_path = plugin_dir_path( $this->plugin_dir );
$backend_styles_path = "{$extension_dir_path}styles/backend-style.min.css";
$backend_styles_url = "{$this->plugin_dir_url}styles/backend-style.min.css";
// Ensure backend style CSS file exists on production.
if ( ! file_exists( $backend_styles_path ) ) {
return;
}
}
// Backend Styles - VB.
wp_enqueue_style( "{$this->name}-backend-styles", $backend_styles_url, array(), $this->version );
}
/**
* Sets initial value of {@see self::$_bundle_dependencies}.
*
* @since 3.1
*/
protected function _set_bundle_dependencies() {
/**
* Builder script handle name
*
* @since 3.??
*
* @param string
*/
$this->_bundle_dependencies = array(
'builder' => array( 'react-dom', "{$this->name}-frontend-bundle" ),
'frontend' => array( 'jquery', et_get_combined_script_handle() ),
);
}
/**
* Sets {@see self::$_debug} based on the extension's global DEBUG constant.
*
* @since 3.1
*/
protected function _set_debug_mode() {
$name_parts = explode( '_', get_class( $this ) );
$prefix = strtoupper( $name_parts[0] );
$debug = $prefix . '_DEBUG';
$this->_debug = defined( $debug ) && constant( $debug );
if ( $this->_debug && ! DiviExtensions::register_debug_mode( $this ) ) {
$this->_debug = false;
et_error( "You're Doing It Wrong! Only one Divi Extension can be in debug mode at a time." );
}
}
/**
* Loads custom modules when the builder is ready.
*
* @since 3.1
* @deprecated ?? - Use {@see 'hook_et_builder_ready'} instead.
*/
public function hook_et_builder_modules_loaded() {
$this->hook_et_builder_ready();
}
/**
* Loads custom modules when the builder is ready.
* {@see 'et_builder_ready'}
*
* @since 4.10.0
*/
public function hook_et_builder_ready() {
if ( file_exists( trailingslashit( $this->plugin_dir ) . 'loader.php' ) ) {
require_once trailingslashit( $this->plugin_dir ) . 'loader.php';
}
}
/**
* Performs initialization tasks.
*
* @since 3.1
*/
protected function _initialize() {
DiviExtensions::add( $this );
$this->_set_debug_mode();
$this->_set_bundle_dependencies();
// Setup translations.
load_plugin_textdomain( $this->gettext_domain, false, basename( $this->plugin_dir ) . '/languages' );
// Register callbacks.
register_activation_hook( trailingslashit( $this->plugin_dir ) . $this->name . '.php', array( $this, 'wp_hook_activate' ) );
register_deactivation_hook( trailingslashit( $this->plugin_dir ) . $this->name . '.php', array( $this, 'wp_hook_deactivate' ) );
add_action( 'et_builder_ready', array( $this, 'hook_et_builder_ready' ), 9 );
add_action( 'wp_enqueue_scripts', array( $this, 'wp_hook_enqueue_scripts' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'admin_hook_enqueue_scripts' ) );
}
/**
* Performs tasks when the plugin is activated.
* {@see 'activate_$PLUGINNAME'}
*
* @since 3.1
*/
public function wp_hook_activate() {
// Force the legacy backend builder to reload its template cache.
// This ensures that custom modules are available for use right away.
et_pb_force_regenerate_templates();
}
/**
* Performs tasks when the plugin is deactivated.
* {@see 'deactivate_$PLUGINNAME'}
*
* @since 3.1
*/
public function wp_hook_deactivate() {}
/**
* Enqueues the extension's scripts and styles.
* {@see 'wp_enqueue_scripts'}
*
* @since 3.1
* @since 4.4.9 Added backend styles for handling custom builder styles.
*/
public function wp_hook_enqueue_scripts() {
if ( $this->_debug ) {
$this->_enqueue_debug_bundles();
} else {
$styles = et_is_builder_plugin_active() ? 'style-dbp' : 'style';
$styles_url = "{$this->plugin_dir_url}styles/{$styles}.min.css";
wp_enqueue_style( "{$this->name}-styles", $styles_url, array(), $this->version );
$this->_enqueue_bundles();
}
if ( et_core_is_fb_enabled() && ! et_builder_bfb_enabled() ) {
$this->_enqueue_backend_styles();
}
// Normalize the extension name to get actual script name. For example from 'divi-custom-modules' to `DiviCustomModules`.
$extension_name = str_replace( ' ', '', ucwords( str_replace( '-', ' ', $this->name ) ) );
// Enqueue frontend bundle's data.
if ( ! empty( $this->_frontend_js_data ) ) {
wp_localize_script( "{$this->name}-frontend-bundle", "{$extension_name}FrontendData", $this->_frontend_js_data );
}
// Enqueue builder bundle's data.
if ( et_core_is_fb_enabled() && ! empty( $this->_builder_js_data ) ) {
wp_localize_script( "{$this->name}-builder-bundle", "{$extension_name}BuilderData", $this->_builder_js_data );
}
}
/**
* Enqueues the extension's scripts and styles for admin area.
*
* @since 4.4.9
*/
public function admin_hook_enqueue_scripts() {
if ( et_builder_bfb_enabled() || et_builder_is_tb_admin_screen() ) {
$this->_enqueue_backend_styles();
}
}
}
new DiviExtension();