Opal-Estate-Pro/inc/admin/register-settings.php
2019-10-12 09:42:33 +07:00

318 lines
8.2 KiB
PHP
Executable File

<?php
/**
* $Desc$
*
* @version $Id$
* @package opalestate
* @author Opal Team <info@wpopal.com >
* @copyright Copyright (C) 2019 wpopal.com. All Rights Reserved.
* @license GNU/GPL v2 or later http://www.gnu.org/licenses/gpl-2.0.html
*
* @website http://www.wpopal.com
* @support http://www.wpopal.com/support/forum.html
*/
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly
}
class Opalestate_Plugin_Settings {
/**
* Option key, and option page slug
*
* @var string
*/
private $key = 'opalestate_settings';
/**
* Array of metaboxes/fields
*
* @var array
*/
protected $option_metabox = [];
/**
* Options Page title
*
* @var string
*/
protected $title = '';
/**
* Options Page hook
*
* @var string
*/
protected $options_page = '';
protected $subtabs = [];
protected $setting_object = [];
/**
* Constructor
*
* @since 1.0
*/
public function __construct() {
add_action( 'admin_menu', [ $this, 'admin_menu' ], 10 );
add_action( 'admin_init', [ $this, 'init' ] );
//Custom CMB2 Settings Fields
add_action( 'cmb2_render_opalestate_title', 'opalestate_title_callback', 10, 5 );
// add_action( 'cmb2_render_api_keys', 'opalestate_api_keys_callback', 10, 5 );
// add_action( 'cmb2_render_license_key', 'opalestate_license_key_callback', 10, 5 );
add_action( "cmb2_save_options-page_fields", [ $this, 'settings_notices' ], 10, 3 );
// Include CMB CSS in the head to avoid FOUC
add_action( "admin_print_styles-opalestate_properties_page_opalestate-settings", [ 'CMB2_hookup', 'enqueue_cmb_css' ] );
}
public function admin_menu() {
// Settings
$opalestate_settings_page = add_submenu_page(
'edit.php?post_type=opalestate_property',
esc_html__( 'Opalestate Settings', 'opalestate-pro' ),
esc_html__( 'Settings', 'opalestate-pro' ),
'manage_opalestate_settings',
'opalestate-settings',
[ $this, 'admin_page_display' ] );
do_action( 'load-' . $opalestate_settings_page, $this );
// Addons
$opalestate_addons_page = add_submenu_page(
'edit.php?post_type=opalestate_property',
esc_html__( 'Opalestate Addons', 'opalestate-pro' ),
esc_html__( 'Addons', 'opalestate-pro' ),
'manage_options',
'opalestate-addons',
[ $this, 'admin_addons_page_display' ] );
do_action( 'load-' . $opalestate_addons_page, $this );
}
/**
* Register our setting to WP
*
* @since 1.0
*/
public function init() {
register_setting( $this->key, $this->key );
}
/**
* Retrieve settings tabs
*
* @return array $tabs
* @since 1.0
*/
public function opalestate_get_settings_tabs() {
$settings = $this->opalestate_settings( null );
$tabs = [];
$tabs['general'] = esc_html__( 'General', 'opalestate-pro' );
$tabs['property'] = esc_html__( 'Property', 'opalestate-pro' );
if ( ! empty( $settings['addons']['fields'] ) ) {
$tabs['addons'] = esc_html__( 'Add-ons', 'opalestate-pro' );
}
if ( ! empty( $settings['licenses']['fields'] ) ) {
$tabs['licenses'] = esc_html__( 'Licenses', 'opalestate-pro' );
}
$tabs['api_keys'] = esc_html__( 'API', 'opalestate-pro' );
$tabs['3rd_party'] = esc_html__( '3rd Party', 'opalestate-pro' );
return apply_filters( 'opalestate_settings_tabs', $tabs );
}
public function admin_addons_page_display() {
require_once opalestate_get_admin_view( 'addons/list.php' );
}
public function get_subtabs_link( $tab_id, $stab_id ) {
$tab_url = esc_url( add_query_arg( [
'settings-updated' => false,
'tab' => $tab_id,
'subtab' => $stab_id,
] ) );
return $tab_url;
}
/**
* Admin page markup. Mostly handled by CMB2
*
* @since 1.0
*/
public function admin_page_display() {
$active_tab = isset( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $this->opalestate_get_settings_tabs() ) ? $_GET['tab'] : 'general';
$sub_active_tab = isset( $_GET['subtab'] ) ? sanitize_text_field( $_GET['subtab'] ) : '';
$tabs_fields = $this->opalestate_settings( $active_tab );
$sub_tabs_fields = [];
if ( empty( $sub_active_tab ) && $this->subtabs ) {
$first = array_flip( $this->subtabs );
$sub_active_tab = reset( $first );
}
if ( $this->subtabs ) {
$sub_tabs_fields = $this->setting_object->get_subtabs_content( $sub_active_tab );
}
?>
<div class="wrap opalestate_settings_page cmb2_options_page <?php echo $this->key; ?>">
<h2 class="nav-tab-wrapper">
<?php
foreach ( $this->opalestate_get_settings_tabs() as $tab_id => $tab_name ) {
$tab_url = esc_url( add_query_arg( [
'settings-updated' => false,
'tab' => $tab_id,
'subtab' => false,
], admin_url( 'edit.php?post_type=opalestate_property&page=opalestate-settings' ) ) );
$active = $active_tab == $tab_id ? ' nav-tab-active' : '';
echo '<a href="' . esc_url( $tab_url ) . '" title="' . esc_attr( $tab_name ) . '" class="nav-tab' . $active . '">';
echo esc_html( $tab_name );
echo '</a>';
}
?>
</h2>
<div class="form-settings-wrap">
<?php if ( $this->subtabs ): ?>
<div class="subtab-settings-navs">
<ul>
<?php foreach ( $this->subtabs as $key => $value ): ?>
<li>
<a <?php if ( $key == $sub_active_tab ): ?>class="active"<?php endif; ?> href="<?php echo esc_url( $this->get_subtabs_link( $active_tab, $key ) ); ?>">
<?php echo $value; ?>
</a>
</li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<div class="form-settings-form">
<?php if ( $sub_active_tab ): ?>
<?php cmb2_metabox_form( $sub_tabs_fields, $this->key ); ?>
<?php else : ?>
<?php cmb2_metabox_form( $tabs_fields, $this->key ); ?>
<?php endif; ?>
</div>
</div>
</div><!-- .wrap -->
<?php
}
/**
* Define General Settings Metabox and field configurations.
*
* Filters are provided for each settings section to allow add-ons and other plugins to add their own settings
*
* @param $active_tab active tab settings; null returns full array
*
* @return array
*/
public function opalestate_settings( $active_tab ) {
$pages = opalestate_cmb2_get_post_options( [
'post_type' => 'page',
'numberposts' => -1,
] );
$general = [];
$opalestate_settings = [];
//Return all settings array if necessary
if ( $active_tab === null ) {
return apply_filters( 'opalestate_registered_settings', $opalestate_settings );
}
$output = apply_filters( 'opalestate_registered_' . $active_tab . '_settings', isset( $opalestate_settings[ $active_tab ] ) ? $opalestate_settings[ $active_tab ] : [] );
if ( empty( $output ) ) {
$class = "Opalestate_Settings_" . ucfirst( $active_tab ) . "_Tab";
if ( class_exists( $class ) ) {
$tab = new $class( $this->key );
$this->setting_object = $tab;
$this->subtabs = $tab->get_subtabs();
return $tab->get_tab_content( $this->key );
}
return [ $active_tab => [] ];
}
// Add other tabs and settings fields as needed
return $output;
}
/**
* Show Settings Notices
*
* @param $object_id
* @param $updated
* @param $cmb
*/
public function settings_notices( $object_id, $updated, $cmb ) {
//Sanity check
if ( $object_id !== $this->key ) {
return;
}
if ( did_action( 'cmb2_save_options-page_fields' ) === 1 ) {
settings_errors( 'opalestate-notices' );
}
add_settings_error( 'opalestate-notices', 'global-settings-updated', esc_html__( 'Settings updated.', 'opalestate-pro' ), 'updated' );
}
/**
* Public getter method for retrieving protected/private variables
*
* @param string $field Field to retrieve
*
* @return mixed Field value or exception is thrown
* @since 1.0
*
*/
public function __get( $field ) {
// Allowed fields to retrieve
if ( in_array( $field, [ 'key', 'fields', 'opalestate_title', 'options_page' ], true ) ) {
return $this->{$field};
}
if ( 'option_metabox' === $field ) {
return $this->option_metabox();
}
throw new Exception( 'Invalid property: ' . $field );
}
}