• File: Blocks.php
  • Full Path: /home/matthif/www/wp-content/plugins/optinmonster/OMAPI/Blocks.php
  • Date Modified: 01/24/2025 1:58 PM
  • File size: 12.7 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
/**
 * Gutenberg Blocks registration class.
 *
 * @since 1.9.10
 *
 * @package OMAPI
 * @author  Thomas Griffin
 */

// Exit if accessed directly.
if ( ! defined'ABSPATH' ) ) {
    exit;
}

/**
 * Gutenberg Blocks registration class.
 *
 * @since 1.9.10
 */
class OMAPI_Blocks {

    
/**
     * Holds the class object.
     *
     * @since 1.9.10
     *
     * @var object
     */
    
public static $instance;

    
/**
     * Path to the file.
     *
     * @since 1.9.10
     *
     * @var string
     */
    
public $file __FILE__;

    
/**
     * Holds the base class object.
     *
     * @since 1.9.10
     *
     * @var object
     */
    
public $base;

    
/**
     * The data to be localized for JS.
     *
     * @since 2.2.0
     *
     * @var array
     */
    
protected $data_for_js = array();

    
/**
     * The campaign options list array.
     *
     * @var null|array
     */
    
protected static $campaigns_list null;

    
/**
     * Primary class constructor.
     *
     * @since 1.9.10
     */
    
public function __construct() {
        
// Set our object.
        
$this->set();

        if ( 
function_exists'register_block_type' ) ) {

            
// Register our blocks.
            
$this->register_blocks();

            
add_action'enqueue_block_editor_assets', array( $this'enqueue_block_editor_assets' ) );

            
// Register the global post campaign switch meta.
            
register_meta(
                
'post',
                
'om_disable_all_campaigns',
                array(
                    
'show_in_rest' => true,
                    
'single'       => true,
                    
'type'         => 'boolean',
                )
            );
        }
    }

    
/**
     * Sets our object instance and base class instance.
     *
     * @since 1.9.10
     */
    
public function set() {
        
self::$instance $this;
        
$this->base     OMAPI::get_instance();
    }

    
/**
     * Register OptinMonster Gutenberg blocks on the backend.
     *
     * @since 1.9.10
     */
    
public function register_blocks() {
        
$use_blocks_json version_compare$GLOBALS['wp_version'], '5.8''>=' );
        
$block_type      plugin_dir_pathOMAPI_FILE ) . 'assets/js/';
        
$args            = array(
            
'render_callback' => array( $this'get_output' ),
        );

        if ( ! 
$use_blocks_json ) {
            
$block_type         'optinmonster/campaign-selector';
            
$args['attributes'] = array(
                
'slug'        => array(
                    
'type' => 'string',
                ),
                
'followrules' => array(
                    
'type' => 'boolean',
                ),
            );
        }

        
register_block_type$block_type$args );
    }

    
/**
     * Load OptinMonster Gutenberg block scripts.
     *
     * @since 1.9.10
     */
    
public function enqueue_block_editor_assets() {
        global 
$pagenow;

        
$version    $this->base->asset_version();
        
$css_handle $this->base->plugin_slug '-blocks-admin';
        
wp_enqueue_style$css_handle$this->base->url 'assets/dist/css/blocks-admin.min.css', array(), $version );

        if ( 
function_exists'wp_add_inline_style' ) ) {
            
$data get_post_type()
                ? 
get_post_type_objectget_post_type() )
                : array();

            
$css $this->base->get_min_css_view_contents'disable-warning-css.php', (object) $data );
            
wp_add_inline_style$css_handle$css );
        }

        
$campaign_selector_handle $this->base->plugin_slug '-gutenberg-campaign-selector';
        
wp_enqueue_script(
            
$campaign_selector_handle,
            
$this->base->url 'assets/dist/js/campaign-selector.min.js',
            array( 
'wp-blocks''wp-i18n''wp-element' ),
            
$version,
            
true
        
);

        
OMAPI_Utils::add_inline_script$campaign_selector_handle'OMAPI'$this->get_data_for_js() );

        
$is_widgets_page 'widgets.php' === $pagenow;

        
// Prevent enqueueing sidebar settings on widgets screen...
        
if ( ! $is_widgets_page ) {
            
wp_enqueue_script(
                
$this->base->plugin_slug '-gutenberg-sidebar-settings',
                
$this->base->url 'assets/dist/js/om-settings.min.js',
                array( 
$campaign_selector_handle'wp-plugins''wp-edit-post''wp-element' ),
                
$version
            
);
        }

        if ( 
version_compare$GLOBALS['wp_version'], '5.3''>=' ) ) {
            
wp_enqueue_script(
                
$this->base->plugin_slug '-gutenberg-format-button',
                
$this->base->url 'assets/dist/js/om-format.min.js',
                array(
                    
$campaign_selector_handle,
                    
'wp-rich-text',
                    
'wp-element',
                    
$is_widgets_page && version_compare$GLOBALS['wp_version'], '5.8.0''>=' )
                        ? 
'wp-edit-widgets'
                        
'wp-editor',
                ),
                
$version
            
);
        }
    }

    
/**
     * Get OptinMonster data for Gutenberg JS.
     *
     * @since 2.2.0
     *
     * @param string $key The js data to get, by key.
     *
     * @return array Array of data for JS.
     */
    
public function get_data_for_js$key null ) {
        if ( empty( 
$this->data_for_js ) ) {

            
// For translation of strings.
            
$i18n                = array(
                
'title'                           => esc_html__'OptinMonster''optin-monster-api' ),
                
'description'                     => esc_html__'Select and display one of your OptinMonster inline campaigns.''optin-monster-api' ),
                
'campaign_select'                 => esc_html__'Select Campaign...''optin-monster-api' ),
                
'campaign_select_display'         => esc_html__'Select and display your email marketing call-to-action campaigns from OptinMonster''optin-monster-api' ),
                
'create_new_popup'                => esc_html__'Create New Popup Campaign''optin-monster-api' ),
                
'create_new_inline'               => esc_html__'Create New Inline Campaign''optin-monster-api' ),
                
'block_settings'                  => esc_html__'OptinMonster Block Settings''optin-monster-api' ),
                
'settings'                        => esc_html__'OptinMonster Settings''optin-monster-api' ),
                
'campaign_selected'               => esc_html__'Campaign''optin-monster-api' ),
                
'followrules_label'               => esc_html__'Use Output Settings''optin-monster-api' ),
                
/* translators: %s - Output Settings (linked).*/
                
'followrules_help'                => esc_html__'Ensure this campaign follows any conditions you\'ve selected in its %s''optin-monster-api' ),
                
'output_settings'                 => esc_html__'Output Settings''optin-monster-api' ),
                
'no_sites'                        => esc_html__'Please create a free account or connect an existing account to use an OptinMonster block.''optin-monster-api' ),
                
'no_sites_button_create_account'  => esc_html__'Create a Free Account''optin-monster-api' ),
                
'no_sites_button_connect_account' => esc_html__'Connect an Existing Account''optin-monster-api' ),
                
'no_inline_campaigns'             => esc_html__'You don’t have any inline campaigns yet!''optin-monster-api' ),
                
'no_campaigns_help'               => esc_html__'Create an inline campaign to display in your posts and pages.''optin-monster-api' ),
                
'create_inline_campaign'          => esc_html__'Create Your First Inline Campaign''optin-monster-api' ),
                
'create_popup_campaign'           => esc_html__'Create Your First Popup''optin-monster-api' ),
                
'no_campaigns_button_help'        => esc_html__'Learn how to create your first campaign''optin-monster-api' ),
                
'found_error'                     => esc_html__'An error was encountered''optin-monster-api' ),
                
'disable_all'                     => esc_html__'Disable all OptinMonster campaigns.''optin-monster-api' ),
                
'view_all'                        => esc_html__'View All Campaigns''optin-monster-api' ),
                
'not_connected'                   => esc_html__'You Have Not Connected with OptinMonster''optin-monster-api' ),
                
'no_campaigns_yet'                => esc_html__'You don’t have any campaigns created yet.''optin-monster-api' ),
                
'update_selected_popup'           => esc_html__'Update Selected OptinMonster Campaign''optin-monster-api' ),
                
'open_popup'                      => esc_html__'Open an OptinMonster Popup''optin-monster-api' ),
                
'remove_popup'                    => esc_html__'Remove Campaign Link''optin-monster-api' ),
                
'upgrade_monsterlink'             => esc_html__'Unlock access to the OptinMonster click-to-load feature called MonsterLinks by upgrading your subscription.''optin-monster-api' ),
                
'upgrade'                         => esc_html__'Upgrade Now''optin-monster-api' ),
            );
            
$i18n['description'] = html_entity_decode$i18n['description'], ENT_COMPAT'UTF-8' );

            
$campaigns $this->get_campaign_options();
            
$site_ids  $this->base->get_site_ids();
            
$post      get_post();

            
$this->data_for_js = array(
                
'logoUrl'               => $this->base->url 'assets/css/images/icons/archie-icon.svg',
                
'i18n'                  => $i18n,
                
'campaigns'             => array(
                    
'inline' => ! empty( $campaigns['inline'] ) ? $campaigns['inline'] : array(),
                    
'other'  => ! empty( $campaigns['other'] ) ? $campaigns['other'] : array(),
                ),
                
'site_ids'              => ! empty( $site_ids ) ? $site_ids : array(),
                
'post'                  => $post,
                
'omEnv'                 => defined'OPTINMONSTER_ENV' ) ? OPTINMONSTER_ENV '',
                
'canMonsterlink'        => $this->base->has_rule_type'monster-link' ),
                
'templatesUri'          => OMAPI_Urls::templates(),
                
'playbooksUri'          => OMAPI_Urls::playbooks(),
                
'campaignsUri'          => OMAPI_Urls::campaigns(),
                
'settingsUri'           => OMAPI_Urls::settings(),
                
'wizardUri'             => OMAPI_Urls::wizard(),
                
'upgradeUri'            => OMAPI_Urls::upgrade'gutenberg''--FEATURE--' ),
                
'apiUrl'                => esc_url_rawOPTINMONSTER_APIJS_URL ),
                
'omUserId'              => $this->base->get_option'accountUserId' ),
                
'outputSettingsUrl'     => OMAPI_Urls::campaign_output_settings'%s' ),
                
'editUrl'               => OMAPI_Urls::om_app(
                    
'campaigns/--CAMPAIGN_SLUG--/edit/',
                    
rawurlencodeOMAPI_Urls::campaign_output_settings'--CAMPAIGN_SLUG--' ) )
                ),
                
'monsterlink'           => esc_url_rawOPTINMONSTER_SHAREABLE_LINK ) . '/c/',
                
'wpVersion'             => $GLOBALS['wp_version'],
                
'customFieldsSupported' => post_type_supportsget_post_type$post ), 'custom-fields' ),
            );
        }

        if ( 
$key ) {
            return isset( 
$this->data_for_js$key ] ) ? $this->data_for_js$key ] : null;
        }

        return 
$this->data_for_js;
    }

    
/**
     * Does the user have any associated OM sites registered?
     *
     * @since 2.2.0
     *
     * @return boolean
     */
    
public function has_sites() {
        
$site_ids $this->base->get_site_ids();

        return ! empty( 
$site_ids );
    }

    
/**
     * Get campaign options.
     *
     * @since 2.2.0
     *
     * @param boolean $titles_only Whether to include titles only, or separate data as array.
     *
     * @return array Array of campaign options.
     */
    
public function get_campaign_options$titles_only false ) {
        if ( 
null === self::$campaigns_list ) {
            
$campaigns_list = array(
                
'inline' => array(),
                
'other'  => array(),
            );

            if ( 
$this->has_sites() ) {
                
$campaigns $this->base->get_campaigns();

                if ( ! empty( 
$campaigns ) ) {
                    foreach ( 
$campaigns as $campaign ) {
                        
$title  mb_strlen$campaign->post_title'UTF-8' ) > 100
                            
mb_substr$campaign->post_title097'UTF-8' ) . '...'
                            
$campaign->post_title;
                        
$title .= ' (' $campaign->post_name ')';

                        
$type 'inline' === $campaign->campaign_type 'inline' 'other';

                        
$campaigns_list$type ][ $campaign->post_name ] = array(
                            
'title'   => $title,
                            
'pending' => empty( $campaign->enabled ),
                        );
                    }
                }
            }

            
self::$campaigns_list $campaigns_list;
        }

        if ( 
$titles_only && ! empty( self::$campaigns_list ) ) {
            
$list = array();
            foreach ( 
self::$campaigns_list as $type => $type_list ) {
                foreach ( 
$type_list as $campaign_name => $args ) {
                    
$list$type ][ $campaign_name ] = $args['title'] . ( $args['pending'] ? ' [Pending]' '' );
                }
            }

            return 
$list;
        }

        return 
self::$campaigns_list;
    }

    
/**
     * Get form HTML to display in a OptinMonster Gutenberg block.
     *
     * @param array $atts Attributes passed by OptinMonster Gutenberg block.
     *
     * @since 1.9.10
     *
     * @return string
     */
    
public function get_output$atts ) {
        
// phpcs:ignore WordPress.Security.NonceVerification.Recommended
        
$context  = ! empty( $_REQUEST['context'] ) ? sanitize_text_fieldwp_unslash$_REQUEST['context'] ) ) : '';
        
$is_rest  defined'REST_REQUEST' ) && REST_REQUEST;
        
$is_gutes $is_rest && 'edit' === $context;

        
// Our Guten-block handles the embed output manually.
        
if ( $is_gutes ) {
            return;
        }

        
// Unslash and sanitize the shortcode attributes.
        
$atts array_map'sanitize_text_field'wp_unslash$atts ) );

        
// Gutenberg block shortcodes default to following the rules.
        // See assets/js/campaign-selector.js, attributes.followrules.
        
if ( ! isset( $atts['followrules'] ) ) {
            
$atts['followrules'] = true;
        }
        
$atts['followrules'] = wp_validate_boolean$atts['followrules'] );

        
$output $this->base->shortcode->shortcode$atts );

        if (
            ! empty( 
$output )
            && ! 
wp_script_is$this->base->plugin_slug '-api-script''enqueued' )
        ) {

            
// Need to enqueue the base api script.
            
$this->base->output->api_script();
        }

        
// Just return the shortcode output to the frontend.
        
return $output;
    }

}