• File: class-cf7-customizer-admin.php
  • Full Path: /home/matthif/www/wp-content/plugins/ph9w16wv/admin/class-cf7-customizer-admin.php
  • Date Modified: 02/06/2026 4:07 AM
  • File size: 20.99 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php

/**
 * The admin-specific functionality of the plugin.
 *
 * @link       saleswonder.biz
 * @since      1.0.0
 *
 * @package    Cf7_Customizer
 * @subpackage Cf7_Customizer/admin
 */

/**
 * The admin-specific functionality of the plugin.
 *
 * Defines the plugin name, version, and two examples hooks for how to
 * enqueue the admin-specific stylesheet and JavaScript.
 *
 * @package    Cf7_Customizer
 * @subpackage Cf7_Customizer/admin
 * @author     Tobias Conrad <tc@saleswonder.biz>
 */
class Cf7_Customizer_Admin {

    
/**
     * The ID of this plugin.
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $plugin_name    The ID of this plugin.
     */
    
private $plugin_name;

    
/**
     * The version of this plugin.
     *
     * @since    1.0.0
     * @access   private
     * @var      string    $version    The current version of this plugin.
     */
    
private $version;

    
/**
     * Initialize the class and set its properties.
     *
     * @since    1.0.0
     * @param      string    $plugin_name       The name of this plugin.
     * @param      string    $version    The version of this plugin.
     */
    
public function __construct$plugin_name$version ) {

        
$this->plugin_name $plugin_name;
        
$this->version $version;

    }

    
/**
     * Register the stylesheets for the admin area.
     *
     * @since    1.0.0
     */
    
public function enqueue_styles() {
        if(isset(
$_GET['page']) && sanitize_text_field($_GET['page']) == 'cf7cstmzr_page') {
            
wp_enqueue_style'wp-color-picker' );
            
wp_enqueue_style'codemirror'plugin_dir_url__FILE__ ) . 'vendors/codemirror.css', array(), $this->version time(), 'all' );
            
wp_enqueue_style$this->plugin_nameplugin_dir_url__FILE__ ) . 'css/cf7-customizer-admin.css', array(), $this->version time(), 'all' );
        }
        
wp_enqueue_style$this->plugin_name '-global'plugin_dir_url__FILE__ ) . 'css/cf7-customizer-admin-global.css', array(), $this->version time(), 'all' );
    }

    
/**
     * Register the JavaScript for the admin area.
     *
     * @since    1.0.0
     */
    
public function enqueue_scripts() {
        if(isset(
$_GET['page']) && (sanitize_text_field($_GET['page']) == 'cf7cstmzr_page' || sanitize_text_field($_GET['page']) == 'cf7cstmzr_tutorial_page')) {
            
wp_enqueue_code_editor(array('type' => 'text/css'));

            if ( ! 
did_action'wp_enqueue_media' ) ) {
                
wp_enqueue_media();
            }

            
wp_enqueue_script'codemirror'plugin_dir_url__FILE__ ) . 'vendors/codemirror.js', array( 'jquery' ), '5.49.2'true );
            
wp_enqueue_script'jRespond'plugin_dir_url__FILE__ ) . 'js/jRespond.js', array( 'jquery' ), '0.10'true );
            
wp_enqueue_script$this->plugin_nameplugin_dir_url__FILE__ ) . 'js/cf7-customizer-admin.js', array( 'jquery''jquery-ui-core''wp-color-picker' ), $this->version time(), true );
        }
    }

    public function 
settings_page() {
        
$is_welcome_done get_option('cf7cstmzr_welcome_done');
        if (!
cf7cstmzr_is_plugin_activated'contact-form-7''wp-contact-form-7.php' )) {
            
add_menu_page(
                
__'CF7 Styler''cf7-styler' ),
                
__'CF7 Styler''cf7-styler' ),
                
'administrator',
                
'cf7cstmzr_page',
                array(
$this'render_settings_page'),
                
'dashicons-email-alt',
                
6
            
);
            if (!empty(
$is_welcome_done)) {
                
add_submenu_page(
                    
'cf7cstmzr_page',
                    
__'Support & KB''cf7-styler' ),
                    
__'Support & KB''cf7-styler' ),
                    
'administrator',
                    
'cf7cstmzrcf7cstmzr_tutorial_page',
                    array(
$this'render_tutorials_page')
                );
            }
        } else {
            
add_submenu_page(
                
'wpcf7',
                
__'CF7 Styler''cf7-styler' ),
                
__'CF7 Styler''cf7-styler' ),
                
'administrator',
                
'cf7cstmzr_page',
                array(
$this'render_settings_page')
            );
            if (!empty(
$is_welcome_done)) {
                
add_submenu_page(
                    
'wpcf7',
                    
__'Support & KB''cf7-styler' ),
                    
'<span class="cf7cstmzr-submenu-item">'.__'Support & KB''cf7-styler' ).'</span>',
                    
'administrator',
                    
'cf7cstmzr_tutorial_page',
                    array(
$this'render_settings_page')
                );
            }
        }
    }

    public function 
render_settings_page() {
        
$is_welcome_done get_option('cf7cstmzr_welcome_done');

        if (!empty(
$_GET['page']) && ('cf7cstmzr_tutorial_page' === sanitize_text_field($_GET['page']) || empty($is_welcome_done))) {
            include_once 
CF7CSTMZR_PLUGIN_PATH 'admin/partials/cf7-customizer-admin-tutorial.php';
        } else {
            include_once 
CF7CSTMZR_PLUGIN_PATH 'admin/partials/cf7-customizer-admin-display.php';
        }
    }

    public function 
check_installation() {
        
$style_schemes get_option('cf7cstmzr_style_schemes', array());

        if (empty(
$style_schemes)) {
            
$default_scheme = array(
                
'default' => Cf7_Style_Scheme::get_default_style_scheme()
            );

            
update_option('cf7cstmzr_style_schemes'$default_scheme);
        }
    }

    public function 
rewrite_rule() {
        
flush_rewrite_rules();

        
add_rewrite_rule('^cf7cstmzr-form-customizer/(.*)/?''index.php?cf7cstmzr-form=$matches[1]''top');
        
add_rewrite_tag'%cf7cstmzr-form%''([^&]+)' );
    }

    public function 
check_version() {
        
$plugin_version Cf7_License::get_license_version();

        if (
'free' === $plugin_version) {
            
delete_option('cf7cstmzr_enabled_globally');
            
$individually_styled_forms Cf7_Style_Scheme::get_individually_styled_forms();
        }
    }

    public function 
template_redirect() {
        
$permalink_structure get_option('permalink_structure');

        if (!empty(
$permalink_structure)) {
            
$form_id get_query_var'cf7cstmzr-form' );
        } else {
            if (!empty(
$_GET['cf7cstmzr_page']) && !empty($_GET['form_id'])) {
                
$form_id $_GET['form_id'];
            }
        }

        if (
$form_id) {
            
$form_post get_post($form_id);

            if (!
$form_post || 'publish' !== $form_post->post_status) {
                die;
            }

            global 
$content_width;

            if (empty(
$content_width)) {
                
$content_width 640;
            }

            
$content_width $content_width 'px';

            
$content_width '90%';

            
$form get_post($form_id);

            
get_header();

            if (!empty(
$form)) {
                
$preview_mode get_option('cf7cstmzr-preview-mode'false);
                
$is_split_mode $preview_mode === 'split-mode';
                
?>
                <div id="style-preview-container" style="max-width: <?php echo $content_width ?>; margin: auto; padding: 20px;">
                    <?php
                    
if ($is_split_mode) {
                        
$split_mode get_option('cf7cstmzr-split-mode''live-style');
                        
?>
                        <style>
                            #style-preview-container {
                                width: 90%!important;
                            }
                            @media screen and (min-width: 599px) {
                                #style-preview-container {
                                    width: 80%!important;
                                }
                            }
                            @media screen and (min-width: 961px) {
                                #style-preview-container {
                                    width: 70%!important;
                                }
                            }
                            @media screen and (min-width: 1200px) {
                                #style-preview-container {
                                    width: 60%!important;
                                }
                            }
                            #split-container:after {
                                display: table;
                                content: ' ';
                                clear: both;
                            }
                            .split, .gutter.gutter-horizontal {
                                float: left;
                            }
                            .gutter.gutter-horizontal {
                                margin-right: 2px;
                                margin-left: 2px;
                                cursor: ew-resize;
                                background-color: #ddd;
                                border-top: 1px solid #eee;
                                border-right: 1px solid #ccc;
                                border-bottom: 1px solid #ccc;
                                border-left: 1px solid #eee;
                                background-image: url("<?php echo CF7CSTMZR_PLUGIN_URL '/public/vendors/vertical.png'?>");
                                background-size: contain;
                                background-repeat: no-repeat!important;
                                background-position: center center!important;
                            }
                            .float-split .split {
                                overflow-y: auto;
                                overflow-x: hidden;
                            }

                            .float-split .split .split-inner {
                                float: left;
                            }

                            .float-split .split:last-child .split-inner {
                                float: right;
                            }
                            .scroll-split .split {
                                overflow-y: auto;
                                overflow-x: scroll;
                            }
                        </style>
                        <div id="split-container" class="float-split" style="display:flex">
                            <div class="split current-style" id="split-left">
                                <div class="split-inner">
                                    <?php echo do_shortcode('[contact-form-7 id="'.$form_id.'" title="' $form->post_title '"]'); ?>
                                </div>
                            </div>
                            <div class="split <?php echo $split_mode?>" id="split-right">
                                <div class="split-inner">
                                    <?php echo do_shortcode('[contact-form-7 id="'.$form_id.'" title="' $form->post_title '"]'); ?>
                                </div>
                            </div>
                        </div>

                        <script>
                            (function($){
                                var sizes = localStorage.getItem('split-sizes')

                                if (sizes) {
                                    sizes = JSON.parse(sizes)
                                } else {
                                    sizes = [50, 50] // default sizes
                                }

                                var splitInstance;
                                var height = 0;

                                $(document).ready(function () {
                                    recalculateSplit();
                                    splitInstance = Split(['#split-left', '#split-right'], {
                                        sizes: sizes,
                                        minSize: 0,
                                        gutter: function (index, direction) {
                                            var gutter = document.createElement('div');
                                            gutter.className = 'gutter gutter-' + direction + ' logo-gutter';
                                            gutter.style.height = height + 'px';
                                            return gutter
                                        },
                                        onDragEnd: function(sizes) {
                                            localStorage.setItem('split-sizes', JSON.stringify(sizes))
                                        },
                                        gutterSize: 10
                                    });

                                    setTimeout(function () {
                                        recalculateGutterHeight();
                                    }, 100);
                                });

                                $(window).on( 'resize', function() {
                                    recalculateSplit();

                                    setTimeout(function () {
                                        recalculateGutterHeight();
                                    }, 100);
                                } );

                                function recalculateGutterHeight() {
                                    var splitInner = $('.split-inner');

                                    if (splitInner.length) {
                                        height = 0;
                                        splitInner.each(function() {
                                            var splitHeight = $(this).outerHeight();

                                            if (height < splitHeight) {
                                                height = splitHeight;
                                            }
                                        });
                                    }

                                    $('#style-preview-container .gutter-horizontal').outerHeight(height);
                                }

                                function recalculateSplit() {
                                    var form = $('.cf7cstmzr-form');
                                    var split = $('.split');
                                    var splitInner = $('.split-inner');
                                    var splitContainer = $('#split-container');
                                    var stylePreviewContainer = $('#style-preview-container');
                                    var width = stylePreviewContainer.width();

                                    if (splitInner.length) {
                                        splitInner.each(function() {
                                            $(this).outerWidth(width - 16);
                                        });
                                    }
                                }
                            })(jQuery);
                        </script>
                        <?php
                    
} else {
                        
?>
                        <style>
                            #style-preview-container {
                                width: 90%!important;
                            }
                            @media screen and (min-width: 599px) {
                                #style-preview-container {
                                    width: 80%!important;
                                }
                            }
                            @media screen and (min-width: 961px) {
                                #style-preview-container {
                                    width: 70%!important;
                                }
                            }
                            @media screen and (min-width: 1200px) {
                                #style-preview-container {
                                    width: 60%!important;
                                }
                            }
                        </style>
                        <?php
                        
echo do_shortcode('[contact-form-7 id="'.$form_id.'" title="' $form->post_title '"]');
                    }
                    
?>
                </div>
                <?php
            
}

            
get_footer();
            die;
        }
    }

    public function 
show_admin_bar($show_admin_bar) {
        
$permalink_structure get_option('permalink_structure');

        if (!empty(
$permalink_structure)) {
            
$form_id get_query_var'cf7cstmzr-form' );
        } else {
            if (!empty(
$_GET['cf7cstmzr_page']) && !empty($_GET['form_id'])) {
                
$form_id $_GET['form_id'];
            }
        }

        if (
$form_id) {
            return 
false;
        }

        return 
$show_admin_bar;
    }

    public function 
admin_body_class($classes) {
        if(isset(
$_GET['page']) && sanitize_text_field($_GET['page']) == 'cf7cstmzr_page') {
            
$classes $classes ' cf7cstmzr-body';

            if (!empty(
$_GET["fw"])) {
                
$classes $classes ' my-body-noscroll-class';
            }
        }

        return 
$classes;
    }

    public function 
add_cf7_metabox($panels) {
        
$plugin_version Cf7_License::get_license_version();

        
$panels['cf7cstmzr-style-scheme'] = array(
            
'title' => __('CF7 Styler''cf7-styler'),
            
'callback' => array($this'show_metabox')
        );

        return 
$panels;
    }

    public function 
show_metabox($contact_form) {
        
$plugin_version Cf7_License::get_license_version();
        
$style_schemes get_option('cf7cstmzr_style_schemes', array());
        
$form_id $contact_form->id();
        
$selected_style get_post_meta($form_id'cf7cstmzr_style_scheme'true);
        
$individually_styled_forms Cf7_Style_Scheme::get_individually_styled_forms();

        if (
'free' === $plugin_version && !empty($individually_styled_forms)) {
            foreach (
$individually_styled_forms as $styled_form_id => $styled_form_style) {
                
$styled_form get_post($styled_form_id);

                if (!empty(
$styled_form)) {
                    
$styled_form_title $styled_form->post_title;
                    
$styled_form_style_title $style_schemes[$styled_form_style]['title'];
                }

            }
        }

        if (!empty(
$style_schemes)) {
            
?>
            <h2>
                <?php echo __('Select style scheme for this form''cf7-styler'?>
            </h2>

            <select name="cf7cstmzr_style_scheme" id="cf7cstmzr_style_scheme" class="large-text">
                <option value=""><?php echo __('- disable style scheme -''cf7-styler'?></option>
                <?php
                
foreach ($style_schemes as $slug => $scheme) {
                    if (
'free' === $plugin_version && 'default' !== $slug) {
                        continue;
                    }
                    
?>
                    <option value="<?php echo $slug ?>"<?php echo $slug === $selected_style ' selected' ''?>><?php echo $scheme['title'?></option>
                    <?php
                
}
                
?>
            </select>

            <?php
            
if ('free' === $plugin_version && empty($selected_style) && !empty($styled_form_title)) {
                
?>
                <p>
                    <?php
                    
echo sprintf__'Currently <strong>%s</strong> form is styled with <strong>%s</strong>. As in free version you can style only one form at a time and if you activate style for current form, style will be removed from other form.''cf7-styler' ), $styled_form_title$styled_form_style_title );
                    
?>
                </p>
                <?php
            
}
            
?>
            <a class="button button-primary" target="_blank" href="<?php echo get_admin_url(); ?>/admin.php?page=cf7cstmzr_page&tab=form-customize">
                <?php _e('Open styler''cf7-styler'?>
            </a>
            <?php
        
}
    }

    public function 
save_cf7_metabox($post_ID$post$update) {
        
$plugin_version Cf7_License::get_license_version();

        
$cf7cstmzr_style_scheme = !empty($_POST['cf7cstmzr_style_scheme']) ? sanitize_text_field($_POST['cf7cstmzr_style_scheme']) : false;

        if (!empty(
$cf7cstmzr_style_scheme)) {
            if (
'free' === $plugin_version) {
                global 
$wpdb;

                
$sql "DELETE FROM {$wpdb->postmeta} WHERE meta_key='cf7cstmzr_style_scheme';";

                
$wpdb->query($sql);
            }

            
update_post_meta$post_ID'cf7cstmzr_style_scheme'$cf7cstmzr_style_scheme );
        } else {
            
delete_post_meta($post_ID'cf7cstmzr_style_scheme');
        }
    }

    public function 
plugin_menu_optin() {
        global 
$submenu;

        if (
function_exists('cf7_styler')) {
            
$reconnect_url cf7_styler()->get_activation_url( array(
                
'nonce'     => wp_create_noncecf7_styler()->get_unique_affix() . '_reconnect' ),
                
'fs_action' => ( cf7_styler()->get_unique_affix() . '_reconnect' ),
            ) );

            
$is_registered cf7_styler()->is_registered();

            if (!
$is_registered && isset($submenu["wpcf7"])) {
                
$submenu["wpcf7"][] = array(
                    
'<span class="cf7cstmzr-submenu-item">' __('Opt-in to see account''cf7-styler') . '</span>',
                    
'manage_options',
                    
$reconnect_url
                
);
            }
        }
    }
}