page; } public function addMenuPageHooks() { if ( current_user_can( 'manage_options' ) ) { add_action( 'admin_menu', array( &$this, 'addMenuPage' ) ); add_action( 'network_admin_menu', array( &$this, 'addMenuPage' ) ); if ( vc_get_param( 'page' ) === 'vc_settings' || vc_post_param( 'action' ) === 'update' ) { add_action( 'admin_init', array( $this, 'initAdmin' ) ); } } JsComposer::$sds_action_hooks['wpb_remove_settings_notification_element_css_class'] = array( &$this, 'removeNotification' ); // add_action( 'wp_ajax_wpb_remove_settings_notification_element_css_class', array( // &$this, // 'removeNotification' // ) ); } public function isEditorEnabled() { global $current_user; get_currentuserinfo(); /** @var $settings - get use group access rules */ $settings = $this->get( 'groups_access_rules' ); $show = true; foreach ( $current_user->roles as $role ) { if ( isset( $settings[ $role ]['show'] ) && $settings[ $role ]['show'] === 'no' ) { $show = false; break; } } return $show; } public function setTabs() { $this->tabs = array(); if ( $this->showConfigurationTabs() ) { $this->tabs['general'] = __( 'General Settings', 'js_composer' ); } if ( ! vc_is_as_theme() && $this->showConfigurationTabs() ) { $this->tabs['color'] = __( 'Design Options', 'js_composer' ); // $this->tabs['element_css'] = __('Element Class Names', 'js_composer'); $this->tabs['custom_css'] = __( 'Custom CSS', 'js_composer' ); } if ( ! vc_is_network_plugin() || ( vc_is_network_plugin() && is_network_admin() ) ) { if ( ! vc_is_updater_disabled() ) { $this->tabs['updater'] = __( 'Product License', 'js_composer' ); } } // TODO: may allow to disable automapper if ( ! vc_automapper_is_disabled() ) { $this->tabs['automapper'] = vc_automapper()->title(); } } public function showConfigurationTabs() { return ! vc_is_network_plugin() || ! is_network_admin(); } public function addMenuPage() { if ( vc_is_network_plugin() && is_network_admin() ) { $page = add_menu_page( __( "Visual Composer Settings", "js_composer" ), __( "Visual Composer", "js_composer" ), 'manage_options', $this->page, array( &$this, 'render' ) ); } else { $page = add_options_page( __( "Visual Composer Settings", "js_composer" ), __( "Visual Composer", "js_composer" ), 'manage_options', $this->page, array( &$this, 'render' ) ); } add_action( "load-$page", array( &$this, 'adminLoad' ) ); } public function render() { vc_automapper()->build(); $this->output(); } /** * Init settings page && menu item */ public function initAdmin() { $this->setTabs(); $this->tabs = apply_filters( 'vc_settings_tabs', $this->tabs ); if ( ! empty( $_COOKIE['wpb_js_composer_settings_active_tab'] ) && isset( $this->tabs[ str_replace( '#vc_settings-', '', $_COOKIE['wpb_js_composer_settings_active_tab'] ) ] ) ) { $this->active_tab = str_replace( '#vc_settings-', '', $_COOKIE['wpb_js_composer_settings_active_tab'] ); } else if ( ! empty( $_GET['tab'] ) && isset( $this->tabs[ $_GET['tab'] ] ) ) { $this->active_tab = $_GET['tab']; } elseif ( ! $this->showConfigurationTabs() ) { $this->active_tab = 'updater'; } else { $this->active_tab = 'general'; } self::$color_settings = array( array( 'vc_color' => array( 'title' => __( 'Main accent color', 'js_composer' ) ) ), array( 'vc_color_hover' => array( 'title' => __( 'Hover color', 'js_composer' ) ) ), array( 'vc_color_call_to_action_bg' => array( 'title' => __( 'Call to action background color', 'js_composer' ) ) ), //array('vc_color_call_to_action_border' => array('title' =>__('Call to action border color', 'js_composer'))), array( 'vc_color_google_maps_bg' => array( 'title' => __( 'Google maps background color', 'js_composer' ) ) ), array( 'vc_color_post_slider_caption_bg' => array( 'title' => __( 'Post slider caption background color', 'js_composer' ) ) ), array( 'vc_color_progress_bar_bg' => array( 'title' => __( 'Progress bar background color', 'js_composer' ) ) ), array( 'vc_color_separator_border' => array( 'title' => __( 'Separator border color', 'js_composer' ) ) ), array( 'vc_color_tab_bg' => array( 'title' => __( 'Tabs navigation background color', 'js_composer' ) ) ), array( 'vc_color_tab_bg_active' => array( 'title' => __( 'Active tab background color', 'js_composer' ) ) ) ); self::$defaults = array( 'vc_color' => '#f7f7f7', 'vc_color_hover' => '#F0F0F0', 'margin' => '35px', 'gutter' => '15', 'responsive_max' => '768' ); $vc_action = ! empty( $_POST['vc_action'] ) ? $_POST['vc_action'] : ( ! empty( $_GET['vc_action'] ) ? $_GET['vc_action'] : '' ); if ( $vc_action == 'restore_color' ) { $this->restoreColor(); } elseif ( $vc_action == 'remove_all_css_classes' ) { $this->removeAllCssClasses(); } $this->deactivate = vc_license()->deactivation(); // TODO: Refactor with separate class. /** * General Settings */ $tab_prefix = '_general'; register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'content_types', array( $this, 'sanitize_post_types_callback' ) ); register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'groups_access_rules', array( $this, 'sanitize_group_access_rules_callback' ) ); register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'not_responsive_css', array( $this, 'sanitize_not_responsive_css_callback' ) ); register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'google_fonts_subsets', array( $this, 'sanitize_google_fonts_subsets_callback' ) ); add_settings_section( $this->option_group . $tab_prefix, null, array( &$this, 'setting_section_callback_function' ), $this->page . $tab_prefix ); add_settings_field( self::$field_prefix . 'content_types', __( "Content types", "js_composer" ), array( &$this, 'content_types_field_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); add_settings_field( self::$field_prefix . 'groups_access_rules', __( "User groups access rules", "js_composer" ), array( &$this, 'groups_access_rules_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); add_settings_field( self::$field_prefix . 'not_responsive_css', __( "Disable responsive content elements", "js_composer" ), array( &$this, 'not_responsive_css_field_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); add_settings_field( self::$field_prefix . 'google_fonts_subsets', __( "Google fonts subsets", "js_composer" ), array( &$this, 'google_fonts_subsets_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); /** * Color Options */ $tab_prefix = '_color'; register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'use_custom', array( $this, 'sanitize_use_custom_callback' ) ); add_settings_field( self::$field_prefix . 'use_custom', __( 'Use custom design options', 'js_composer' ), array( &$this, 'use_custom_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix, array( 'id' => 'use_custom' ) ); // add_action('update_option_'.self::$field_prefix.'use_custom', array(&$this, 'buildCustomColorCss')); // add_action('add_option_'.self::$field_prefix.'use_custom', array(&$this, 'buildCustomColorCss')); foreach ( self::$color_settings as $color_set ) { foreach ( $color_set as $key => $data ) { register_setting( $this->option_group . $tab_prefix, self::$field_prefix . $key, array( $this, 'sanitize_color_callback' ) ); add_settings_field( self::$field_prefix . $key, $data['title'], array( &$this, 'color_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix, array( 'id' => $key ) ); // add_action('update_option_'.self::$field_prefix.$key, array(&$this, 'buildCustomColorCss')); // add_action('add_option_'.self::$field_prefix.$key, array(&$this, 'buildCustomColorCss')); } } // Margin register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'margin', array( $this, 'sanitize_margin_callback' ) ); add_settings_field( self::$field_prefix . 'margin', __( 'Elements bottom margin', 'js_composer' ), array( &$this, 'margin_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix, array( 'id' => 'margin' ) ); // add_action('update_option_'.self::$field_prefix.'margin', array(&$this, 'buildCustomColorCss')); // Gutter register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'gutter', array( $this, 'sanitize_gutter_callback' ) ); add_settings_field( self::$field_prefix . 'gutter', __( 'Grid gutter width', 'js_composer' ), array( &$this, 'gutter_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix, array( 'id' => 'gutter' ) ); /// add_action('update_option_'.self::$field_prefix.'gutter', array(&$this, 'buildCustomColorCss')); // Responsive max width register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'responsive_max', array( $this, 'sanitize_responsive_max_callback' ) ); add_settings_field( self::$field_prefix . 'responsive_max', __( 'Mobile screen width', 'js_composer' ), array( &$this, 'responsive_max_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix, array( 'id' => 'responsive_max' ) ); // add_action('update_option_'.self::$field_prefix.'responsive_max', array(&$this, 'buildCustomColorCss')); add_settings_section( $this->option_group . $tab_prefix, null, array( &$this, 'setting_section_callback_function' ), $this->page . $tab_prefix ); /** * Element Class names */ $tab_prefix = '_element_css'; register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'row_css_class', array( $this, 'sanitize_row_css_class_callback' ) ); register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'column_css_classes', array( $this, 'sanitize_column_css_classes_callback' ) ); add_settings_section( $this->option_group . $tab_prefix, null, array( &$this, 'setting_section_callback_function' ), $this->page . $tab_prefix ); add_settings_field( self::$field_prefix . 'row_css_class', "Row CSS class name", array( &$this, 'row_css_class_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); add_settings_field( self::$field_prefix . 'column_css_classes', "Columns CSS class names", array( &$this, 'column_css_classes_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); /** * Custom CSS */ $tab_prefix = '_custom_css'; register_setting( $this->option_group . $tab_prefix, self::$field_prefix . 'custom_css', array( $this, 'sanitize_custom_css_callback' ) ); // add_action('update_option_'.self::$field_prefix.'custom_css', array(&$this, 'buildCustomCss')); add_settings_section( $this->option_group . $tab_prefix, null, array( &$this, 'setting_section_callback_function' ), $this->page . $tab_prefix ); add_settings_field( self::$field_prefix . 'custom_css', __( "Paste your CSS code", "js_composer" ), array( &$this, 'custom_css_field_callback' ), $this->page . $tab_prefix, $this->option_group . $tab_prefix ); foreach ( $this->tabs as $tab => $title ) { do_action( 'vc_settings_tab-' . $tab, $this ); } $tab = 'updater'; $this->addSection( $tab, null, array( &$this, 'setting_section_callback_function' ) ); $this->addField( $tab, __( 'Envato Username', 'js_composer' ), 'envato_username', array( &$this, 'sanitize_envato_username' ), array( &$this, 'envato_username_callback' ) ); $this->addField( $tab, __( 'Secret API Key', 'js_composer' ), 'envato_api_key', array( &$this, 'sanitize_envato_api_key' ), array( &$this, 'envato_api_key_callback' ) ); $this->addField( $tab, __( 'Visual Composer License Key', 'js_composer' ), 'js_composer_purchase_code', array( &$this, 'sanitize_js_composer_purchase_code' ), array( &$this, 'js_composer_purchase_code_callback' ) ); } /** * Creates new section. * * @param $tab - tab key name as tab section * @param $title - Human title * @param $callback - function to build section header. */ public function addSection( $tab, $title = null, $callback = null ) { add_settings_section( $this->option_group . '_' . $tab, $title, ( $callback !== null ? $callback : array( &$this, 'setting_section_callback_function' ) ), $this->page . '_' . $tab ); } /** * Create field in section. * * @param $tab * @param $title * @param $field_name * @param $sanitize_callback * @param $field_callback * @param array $args * * @return $this */ public function addField( $tab, $title, $field_name, $sanitize_callback, $field_callback, $args = array() ) { register_setting( $this->option_group . '_' . $tab, self::$field_prefix . $field_name, $sanitize_callback ); add_settings_field( self::$field_prefix . $field_name, $title, $field_callback, $this->page . '_' . $tab, $this->option_group . '_' . $tab, $args ); return $this; // chaining } public function restoreColor() { foreach ( self::$color_settings as $color_sett ) { foreach ( $color_sett as $key => $value ) { delete_option( self::$field_prefix . $key ); } } delete_option( self::$field_prefix . 'margin' ); delete_option( self::$field_prefix . 'gutter' ); delete_option( self::$field_prefix . 'responsive_max' ); delete_option( self::$field_prefix . 'use_custom' ); // $this->buildCustomColorCss(); wp_redirect( ! empty( $_POST['_wp_http_referer'] ) ? preg_replace( '/tab\=/', 'tab_old=', $_POST['_wp_http_referer'] ) . '&tab=color' : '/options-general.php?page=vc_settings&tab=color' ); } public function removeAllCssClasses() { delete_option( self::$field_prefix . 'row_css_class' ); delete_option( self::$field_prefix . 'column_css_classes' ); wp_redirect( ! empty( $_POST['_wp_http_referer'] ) ? preg_replace( '/tab\=/', 'tab_old=', $_POST['_wp_http_referer'] ) . '&tab=element_css' : '/options-general.php?page=vc_settings&tab=element_css' ); } public static function get( $option_name ) { return Configuration::get( self::$field_prefix . $option_name ); } public static function set( $option_name, $value ) { return Configuration::updateValue( self::$field_prefix . $option_name, $value ); } /** * Set up the enqueue for the CSS & JavaScript files. * */ function adminLoad() { wp_enqueue_style( 'js_composer_settings', vc_asset_url( 'css/js_composer_settings.css' ), false, WPB_VC_VERSION, false ); // wp_enqueue_style( 'ui-custom-theme' ); wp_enqueue_script( 'jquery-ui-accordion' ); wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'wpb_js_composer_settings' ); wp_enqueue_script( 'wpb_ace' ); setcookie( 'wpb_js_composer_settings_active_tab' ); $this->locale = array( 'are_you_sure_reset_css_classes' => __( 'Are you sure you want to reset to defaults?', 'js_composer' ), 'are_you_sure_reset_color' => __( 'Are you sure you want to reset to defaults?', 'js_composer' ), 'vc_updater_error' => __( 'Something went wrong! Please try again later.', 'js_composer' ), 'vc_updater_license_activation_success' => __( 'License successfully activated. Thank you!', 'js_composer' ), 'vc_updater_license_deactivation_success' => __( 'Your license key is deactivated.', 'js_composer' ), 'vc_updater_empty_data' => __( 'Envato username and license key are required.', 'js_composer' ), 'vc_updater_wrong_license_key' => __( 'Invalid liense key. Please check information in your envato profile.', 'js_composer' ), 'vc_updater_wrong_data' => __( 'Wrong data. Please check your information or ask support for help.', 'js_composer' ), 'vc_updater_already_activated' => __( 'License successfully activated. Thank you! (401)', 'js_composer' ), 'vc_updater_already_activated_another_url' => sprintf( __( 'Your license key is already activated on another website ({site}), you should deactivate it first or obtain new license key.', 'js_composer' ), esc_url( "http://bit.ly/vcomposer" ) ), 'vc_updater_activate_license' => __( 'Activate license', 'js_composer' ), 'vc_updater_deactivate_license' => __( 'Deactivate license', 'js_composer' ) ); wp_localize_script( 'wpb_js_composer_settings', 'i18nLocaleSettings', $this->locale ); } /** * Access groups * */ public function groups_access_rules_callback() { global $wp_roles; $groups = is_object( $wp_roles ) ? $wp_roles->roles : array(); // get_editable_roles(); $settings = ( $settings = get_option( self::$field_prefix . 'groups_access_rules' ) ) ? $settings : array(); $show_types = array( 'all' => __( 'Show Visual Composer & default editor', 'js_composer' ), 'only' => __( 'Show only Visual Composer', 'js_composer' ), 'no' => __( "Don't allow to use Visual Composer", 'js_composer' ) ); $shortcodes = WPBMap::getShortCodes(); $size_line = ceil( count( array_keys( $shortcodes ) ) / 3 ); ?>
' . $value . ''; echo '
' . __( "If you want to add some custom CSS code to the plugin and don't want to modify any files, then it's a good place to enter your code at this field.", "js_composer" ) . '
'; // TODO: Rewrite it } /** * Not responsive checkbox callback function */ public function not_responsive_css_field_callback() { $checked = ( $checked = get_option( self::$field_prefix . 'not_responsive_css' ) ) ? $checked : false; ?>'.__('To change class name for the row element, enter it here. By default vc_row is used.', 'js_composer').'
'; } /** * Content types checkboxes list callback function */ public function column_css_classes_callback() { $classes = ( $classes = get_option( self::$field_prefix . 'column_css_classes' ) ) ? $classes : array(); for ( $i = 1; $i <= 12; $i ++ ) { if ( ! empty( $classes[ 'span' . $i ] ) ) { $v = $classes[ 'span' . $i ]; } else { $v = '' . __( 'Empty value', "js_composer" ) . ''; } $id = self::$field_prefix . 'column_css_classes_span_' . $i; echo ''.__('', 'js_composer').'
'; } public function margin_callback( $args ) { $value = ( $value = get_option( self::$field_prefix . $args['id'] ) ) ? $value : $this->getDefault( $args['id'] ); echo ''; echo '' . __( 'To change default vertical spacing between content elements, enter new value here. Example: 20px', 'js_composer' ) . '
'; } public function gutter_callback( $args ) { $value = ( $value = get_option( self::$field_prefix . $args['id'] ) ) ? $value : $this->getDefault( $args['id'] ); echo ' px'; echo '' . __( 'To change default horizontal spacing between columns, enter new value in pixels here.', 'js_composer' ) . '
'; } public function responsive_max_callback( $args ) { $value = ( $value = get_option( self::$field_prefix . $args['id'] ) ) ? $value : $this->getDefault( $args['id'] ); echo ' px'; echo '' . __( 'By default content elements "stack" one on top other when screen size is smaller then 768px. Here you can change that value if needed.', 'js_composer' ) . '
'; } public function envato_username_callback() { $field = 'envato_username'; $value = ( $value = get_option( self::$field_prefix . $field ) ) ? $value : ''; echo 'disableIfActivated() . '>'; echo '' . __( 'Your Envato username.', 'js_composer' ) . '
'; } public function js_composer_purchase_code_callback() { $field = 'js_composer_purchase_code'; $value = ( $value = get_option( self::$field_prefix . $field ) ) ? $value : ''; echo 'disableIfActivated() . '>'; //echo ''.__('Your Item Purchase Code contained within the License Certificate which is accessible in your Envato account. o view your License Certificate: Login to your Envato account and visit Downloads section, then click "Download" button to reveal "License Certificate" link.', 'js_composer').'
'; echo '' . sprintf( __( 'Please enter your CodeCanyon Visual Composer license key, you can find your key by following the instructions on this page. License key looks similar to this: bjg759fk-kvta-6584-94h6-75jg8vblatftq.', 'js_composer' ), esc_url( "http://kb.wpbakery.com/index.php?title=Item_Verification_Code" ) ) . '
'; } public function envato_api_key_callback() { $field = 'envato_api_key'; $value = ( $value = get_option( self::$field_prefix . $field ) ) ? $value : ''; echo 'disableIfActivated() . '>'; echo '' . sprintf( __( "You can find API key by visiting your Envato Account page, then clicking the My Settings tab. At the bottom of the page you'll find your account's API key. Need help?", 'js_composer' ), esc_url( "http://kb.wpbakery.com/index.php?title=Envato_API_key" ) ) . '
'; } public function getDefault( $key ) { return ! empty( self::$defaults[ $key ] ) ? self::$defaults[ $key ] : ''; } public function disableIfActivated() { if ( ! isset( $this->deactivate_license ) ) { $this->deactivate_license = vc_license()->deactivation(); } return empty( $this->deactivate_license ) ? '' : ' disabled="true" class="vc_updater-passive"'; } /** * Callback function for settings section * * */ public function setting_section_callback_function( $tab ) { if ( $tab["id"] == 'wpb_js_composer_settings_color' ): ?>
A license key may only be used for one Visual Composer installation on one WordPress site at a time. If you previosly activated your license key on another site, then you should deactivate it first or obtain new license key.', 'js_composer' ), esc_url( "http://bit.ly/vcomposer" ) ); ?>
' . sprintf( __( 'Visual Composer: Your css class names settings are deprecated. Click here to resolve.', 'js_composer' ), menu_page_url( $this->page, false ) . '&tab=element_css' ) . '