<?php
/**
* Meta oxes mamager
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
if ( ! class_exists( 'Jet_Engine_CPT_Meta' ) ) {
require jet_engine()->plugin_path( 'includes/components/meta-boxes/post.php' );
}
if ( ! class_exists( 'Jet_Engine_Options_Page_Factory' ) ) {
/**
* Define Jet_Engine_Options_Page_Factory class
*/
class Jet_Engine_Options_Page_Factory extends Jet_Engine_CPT_Meta {
/**
* Current page data
*
* @var null
*/
public $page = null;
/**
* Current page slug
*
* @var null
*/
public $slug = null;
/**
* Prepared fields array
*
* @var null
*/
public $prepared_fields = null;
/**
* Holder for is page or not is page now prop
*
* @var null
*/
public $is_page_now = null;
/**
* Inerface builder instance
*
* @var null
*/
public $builder = null;
/**
* Saved options holder
*
* @var null
*/
public $options = null;
/**
* Save trigger
*
* @var string
*/
public $save_action = 'jet-engine-op-save-settings';
public $layout_now = false;
public $current_component = false;
public $current_panel = false;
public $custom_css = array();
/**
* Constructor for the class
*/
public function __construct( $page ) {
$this->page = $page;
$this->slug = $page['slug'];
$this->meta_box = $page['fields'];
if ( empty( $this->page['position'] ) && 0 !== $this->page['position'] ) {
$this->page['position'] = null;
}
add_action( 'admin_menu', array( $this, 'register_menu_page' ) );
if ( $this->is_page_now() ) {
add_action( 'admin_enqueue_scripts', array( $this, 'init_builder' ), 0 );
add_action( 'admin_init', array( $this, 'save' ), 40 );
add_action( 'admin_notices', array( $this, 'saved_notice' ) );
}
}
/**
* Check if current options page is processed now
*
* @return boolean [description]
*/
public function is_page_now() {
if ( null !== $this->is_page_now ) {
return $this->is_page_now;
}
if ( isset( $_GET['page'] ) && $this->slug === $_GET['page'] ) {
$this->is_page_now = true;
} else {
$this->is_page_now = false;
}
return $this->is_page_now;
}
/**
* Register avalable menu pages
*
* @return [type] [description]
*/
public function register_menu_page() {
if ( ! empty( $this->page['parent'] ) ) {
add_submenu_page(
$this->page['parent'],
$this->page['labels']['name'],
$this->page['labels']['menu_name'],
$this->page['capability'],
$this->page['slug'],
array( $this, 'render_page' )
);
} else {
add_menu_page(
$this->page['labels']['name'],
$this->page['labels']['menu_name'],
$this->page['capability'],
$this->page['slug'],
array( $this, 'render_page' ),
$this->page['icon'],
$this->page['position']
);
}
}
/**
* Process options saving
*
* @return [type] [description]
*/
public function save() {
if ( ! isset( $_REQUEST['action'] ) || $this->save_action !== $_REQUEST['action'] ) {
return;
}
$capability = $this->page['capability'];
if ( ! current_user_can( $capability ) ) {
return;
}
$current = get_option( $this->slug, array() );
$data = $_REQUEST;
$fields = $this->get_prepared_fields();
if ( ! empty( $fields ) ) {
foreach ( $fields as $key => $field ) {
if ( isset( $data[ $key ] ) ) {
$value = $data[ $key ];
$value = $this->maybe_apply_sanitize_callback( $value, $field );
if ( $this->to_timestamp( $field ) ) {
$value = strtotime( $value );
}
$current[ $key ] = $value;
} else {
$current[ $key ] = null;
}
}
}
update_option( $this->slug, $current );
$redirect = add_query_arg(
array(
'page' => $this->slug,
'dialog-saved' => true,
),
esc_url( admin_url( 'admin.php' ) )
);
wp_redirect( $redirect );
die();
}
/**
* Is date field
*
* @param [type] $input_type [description]
* @return boolean [description]
*/
public function to_timestamp( $field ) {
if ( empty( $field['input_type'] ) ) {
return false;
}
if ( empty( $field['is_timestamp'] ) ) {
return false;
}
if ( ! in_array( $field['input_type'], array( 'date', 'datetime-local' ) ) ) {
return false;
}
return ( true === $field['is_timestamp'] );
}
/**
* Maybe apply sanitize callback
*
* @param mixed $value
* @param array $field
*
* @return mixed
*/
public function maybe_apply_sanitize_callback( $value, $field ) {
if ( is_array( $value ) && 'repeater' === $field['type'] && ! empty( $field['fields'] ) ) {
foreach ( $value as $item_id => $item ) {
foreach ( $item as $sub_item_id => $sub_item_value ) {
$value[ $item_id ][ $sub_item_id ] = $this->maybe_apply_sanitize_callback( $sub_item_value, $field['fields'][ $sub_item_id ] );
}
}
}
if ( 'checkbox' === $field['type'] && ! empty( $field['is_array'] ) ) {
$raw = ! empty( $value ) ? $value : array();
$result = array();
if ( is_array( $raw ) ) {
foreach ( $raw as $raw_key => $raw_value ) {
$bool_value = filter_var( $raw_value, FILTER_VALIDATE_BOOLEAN );
if ( $bool_value ) {
$result[] = $raw_key;
}
}
}
return $result;
}
if ( ! empty( $field['sanitize_callback'] ) && is_callable( $field['sanitize_callback'] ) ) {
$value = call_user_func( $field['sanitize_callback'], $value, $field['name'], $field );
}
return $value;
}
/**
* Show saved notice
*
* @return bool
*/
public function saved_notice() {
if ( ! isset( $_GET['dialog-saved'] ) ) {
return false;
}
$message = __( 'Saved', 'jet-engine' );
printf( '<div class="notice notice-success is-dismissible"><p>%s</p></div>', $message );
return true;
}
/**
* Initialize page builder
*
* @return [type] [description]
*/
public function init_builder() {
$builder_data = jet_engine()->framework->get_included_module_data( 'cherry-x-interface-builder.php' );
$this->builder = new \CX_Interface_Builder(
array(
'path' => $builder_data['path'],
'url' => $builder_data['url'],
)
);
$slug = $this->page['slug'];
$this->builder->register_section(
array(
$slug => array(
'type' => 'section',
'scroll' => false,
'title' => apply_filters( 'jet-engine/compatibility/translate-string', $this->page['labels']['name'] ),
),
)
);
$this->builder->register_form(
array(
$slug . '_form' => array(
'type' => 'form',
'parent' => $slug,
'action' => add_query_arg(
array(
'page' => $slug,
'action' => $this->save_action,
),
esc_url( admin_url( 'admin.php' ) )
),
),
)
);
$this->builder->register_settings(
array(
'settings_top' => array(
'type' => 'settings',
'parent' => $slug . '_form',
),
'settings_bottom' => array(
'type' => 'settings',
'parent' => $slug . '_form',
),
Loading ...