File "class-foo-plugin-settings.php"
Full path: /home/satitravel/public_html/wp-content/plugins/foogallery/includes/foopluginbase/classes/class-foo-plugin-settings.php
File
size: 12.49 B
MIME-type: text/x-php
Charset: utf-8
Download Open Edit Advanced Editor &nnbsp; Back
<?php
/*
* Foo Plugin Settings
*
* A helpful class to handle settings for a plugin
*
* Version: 2.1
* Author: Brad Vincent
* Author URI: http://fooplugins.com
* License: GPL2
*/
if ( !class_exists( 'Foo_Plugin_Settings_v2_2' ) ) {
class Foo_Plugin_Settings_v2_2 {
protected $plugin_slug;
protected $_settings = array(); //the plugin settings array
protected $_settings_sections = array(); //the plugin sections array
protected $_settings_tabs = array(); //the plugin tabs array
protected $_admin_errors = false; //store of admin errors
function __construct($plugin_slug) {
$this->plugin_slug = $plugin_slug;
$this->register_settings();
}
function get_tabs() {
return $this->_settings_tabs;
}
//check if we have any setting of a certain type
function has_setting_of_type($type) {
foreach ( $this->_settings as $setting ) {
if ( $setting['type'] == $type ) return true;
}
return false;
}
function has_tab($tab_id) {
return array_key_exists( $tab_id, $this->_settings_tabs );
}
// add a setting tab
function add_tab($tab_id, $title) {
if ( !$this->has_tab( $tab_id ) ) {
//pre action
do_action( $this->plugin_slug . '_admin_settings_before_tab', $tab_id, $title );
$tab = array(
'id' => $tab_id,
'title' => $title
);
$this->_settings_tabs[$tab_id] = $tab;
//post action
do_action( $this->plugin_slug . '_admin_settings_after_tab', $tab_id, $title );
}
}
function has_section($section_id) {
return array_key_exists( $section_id, $this->_settings_sections );
}
// add a setting section
function add_section($section_id, $title, $desc = '') {
//check we have the section
if ( !$this->has_section( $section_id ) ) {
//pre action
do_action( $this->plugin_slug . '_admin_settings_before_section', $section_id, $title, $desc );
$section = array(
'id' => $section_id,
'title' => $title,
'desc' => $desc
);
$this->_settings_sections[$section_id] = $section;
add_settings_section( $section_id, $title, array( $this, 'echo_section_desc' ), $this->plugin_slug );
//post action
do_action( $this->plugin_slug . '_admin_settings_after_section', $section_id, $title, $desc );
}
}
function echo_section_desc( $arg ) {
$section = $this->_settings_sections[ $arg['id'] ];
echo $section['desc'];
}
function add_section_to_tab($tab_id, $section_id, $title, $desc = '') {
if ( array_key_exists( $tab_id, $this->_settings_tabs ) ) {
//get the correct section id for the tab
$section_id = $tab_id . '-' . $section_id;
//add the section to the tab
if ( !array_key_exists( $section_id, $this->_settings_sections ) ) {
$this->_settings_tabs[$tab_id]['sections'][$section_id] = $section_id;
}
//add the section
$this->add_section( $section_id, $title, $desc );
}
return $section_id;
}
function add_settings($settings = false) {
if ( !is_array( $settings ) || ( !array_key_exists( 'settings', $settings ) ) ) return;
foreach($settings['settings'] as $setting) {
//add a tab if needed
$tab_id = foo_safe_get( $setting, 'tab', false );
if ($tab_id !== false && !$this->has_tab( $tab_id ) && array_key_exists( 'tabs', $settings ) && array_key_exists( $tab_id, $settings['tabs'] ) ) {
$tab = $settings['tabs'][$tab_id];
$this->add_tab( $tab_id, $tab );
}
//add a section if needed
$section_id = foo_safe_get( $setting, 'section', false );
if ($section_id !== false && !$this->has_section( $section_id ) && array_key_exists( 'sections', $settings ) && array_key_exists( $section_id, $settings['sections'] ) ) {
$section = $settings['sections'][$section_id];
$this->add_section_to_tab( $tab_id, $section_id, $section['name'] );
}
$this->add_setting( $setting );
}
}
function register_settings() {
register_setting( $this->plugin_slug, $this->plugin_slug, array( 'sanitize_callback' => array($this, 'validate') ) );
}
// add a settings field
function add_setting($args = array()) {
$defaults = array(
'id' => 'default_field',
'title' => 'Default Field',
'desc' => '',
'default' => '',
'placeholder' => '',
'type' => 'text',
'section' => '',
'choices' => array(),
'class' => '',
'tab' => ''
);
//only declare up front so no debug warnings are shown
$title = $type = $id = $desc = $default = $placeholder = $choices = $class = $section = $tab = null;
extract( wp_parse_args( $args, $defaults ) );
$field_args = array(
'type' => $type,
'id' => $id,
'desc' => $desc,
'default' => $default,
'placeholder' => $placeholder,
'choices' => $choices,
'label_for' => $id,
'class' => $class
);
$this->_settings[] = $args;
$section_id = foo_convert_to_key( $section );
//check we have the tab
if ( !empty($tab) ) {
$tab_id = foo_convert_to_key( $tab );
//add the tab
$this->add_tab( $tab_id, foo_title_case( $tab ) );
//add the section
$section_id = $this->add_section_to_tab( $tab_id, $section_id, foo_title_case( $section ) );
} else {
//just add the section
$this->add_section( $section_id, foo_title_case( $section ) );
}
do_action( $this->plugin_slug . '_admin_settings_before_setting', $args );
//add the setting!
add_settings_field( $id, $title, array($this, 'render'), $this->plugin_slug, $section_id, $field_args );
do_action( $this->plugin_slug . '_admin_settings_after_setting', $args );
}
// render HTML for individual settings
function render($args = array()) {
//only declare up front so no debug warnings are shown
$type = $id = $desc = $default = $placeholder = $choices = $class = $section = $tab = null;
extract( $args );
$options = get_option($this->plugin_slug);
if ( function_exists( 'is_multisite' ) && is_multisite() ) {
//if we are in the network settings then use site options directly.
if (is_network_admin()) {
$options = get_site_option($this->plugin_slug);
} else {
$site_options = get_site_option($this->plugin_slug);
$options = wp_parse_args($options, $site_options);
}
}
$has_options = $options !== false;
if ( !isset($options[$id]) && $type != 'checkbox' ) {
$options[$id] = $default;
}
$field_class = '';
if ( $class != '' ) {
$field_class = ' class="' . $class . '"';
}
$errors = get_settings_errors( $id );
do_action( $this->plugin_slug . '_admin_settings_before_render_setting', $args );
switch ( $type ) {
case 'heading':
echo '</td></tr><tr valign="top"><td colspan="2">' . $desc;
break;
case 'html':
echo $desc;
break;
case 'checkbox':
$checked = '';
if (isset($options[$id]) && $options[$id] == 'on') {
$checked = ' checked="checked"';
} else if ($options === false && $default == 'on') {
$checked = ' checked="checked"';
} else if ($has_options === false && $default == 'on') {
$checked = ' checked="checked"';
}
//echo '<input type="hidden" name="'.$this->plugin_slug.'[' . $id . '_default]" value="' . $default . '" />';
echo '<input' . $field_class . ' type="checkbox" id="' . $id . '" name="' . $this->plugin_slug . '[' . $id . ']" value="on"' . $checked . ' /> <label for="' . $id . '"><small>' . $desc . '</small></label>';
break;
case 'select':
echo '<select' . $field_class . ' name="' . $this->plugin_slug . '[' . $id . ']">';
foreach ( $choices as $value => $label ) {
$selected = '';
if ( $options[$id] == $value ) {
$selected = ' selected="selected"';
}
echo '<option ' . $selected . ' value="' . $value . '">' . $label . '</option>';
}
echo '</select>';
break;
case 'radio':
$i = 0;
$saved_value = $options[$id];
if ( empty($saved_value) ) {
$saved_value = $default;
}
foreach ( $choices as $value => $label ) {
$selected = '';
if ( $saved_value == $value ) {
$selected = ' checked="checked"';
}
echo '<input' . $field_class . $selected . ' type="radio" name="' . $this->plugin_slug . '[' . $id . ']" id="' . $id . $i . '" value="' . $value . '"> <label for="' . $id . $i . '">' . $label . '</label>';
if ( $i < count( $choices ) - 1 ) {
echo '<br />';
}
$i++;
}
break;
case 'textarea':
echo '<textarea' . $field_class . ' id="' . $id . '" name="' . $this->plugin_slug . '[' . $id . ']" placeholder="' . $placeholder . '">' . esc_attr( $options[$id] ) . '</textarea>';
break;
case 'password':
echo '<input' . $field_class . ' type="password" id="' . $id . '" name="' . $this->plugin_slug . '[' . $id . ']" value="' . esc_attr( $options[$id] ) . '" />';
break;
case 'text':
echo '<input class="regular-text ' . $class . '" type="text" id="' . $id . '" name="' . $this->plugin_slug . '[' . $id . ']" placeholder="' . $placeholder . '" value="' . esc_attr( $options[$id] ) . '" />';
break;
case 'checkboxlist':
$i = 0;
foreach ( $choices as $value => $label ) {
$checked = '';
if ( isset($options[$id][$value]) && $options[$id][$value] == 'true' ) {
$checked = 'checked="checked"';
}
echo '<input' . $field_class . ' ' . $checked . ' type="checkbox" name="' . $this->plugin_slug . '[' . $id . '|' . $value . ']" id="' . $id . $i . '" value="on"> <label for="' . $id . $i . '">' . $label . '</label>';
if ( $i < count( $choices ) - 1 ) {
echo '<br />';
}
$i++;
}
break;
case 'image':
echo '<input class="regular-text image-upload-url" type="text" id="' . $id . '" name="' . $this->plugin_slug . '[' . $id . ']" placeholder="' . $placeholder . '" value="' . esc_attr( $options[$id] ) . '" />';
echo '<input data-uploader-title="' . __('Select An Image', $this->plugin_slug) . '" data-link="' . $id . '" class="image-upload-button" type="button" name="upload_button" value="' . __( 'Select Image', $this->plugin_slug ) . '" />';
break;
default:
do_action( $this->plugin_slug . '_admin_settings_custom_type_render_setting', $args );
break;
}
do_action( $this->plugin_slug . '_admin_settings_after_render_setting', $args );
if ( is_array( $errors ) ) {
foreach ( $errors as $error ) {
echo "<span class='error'>{$error['message']}</span>";
}
}
if ( $type != 'checkbox' && $type != 'heading' && $type != 'html' && $desc != '' ) {
echo '<br /><small>' . $desc . '</small>';
}
}
// validate our settings
function validate($input) {
//check to see if the options were reset
if ( isset ($input['reset-defaults']) ) {
delete_option( $this->plugin_slug );
add_settings_error(
'reset',
'reset_error',
__( 'Settings restored to default values', $this->plugin_slug ),
'updated'
);
return false;
}
// if (empty($input['sample_text'])) {
//
// add_settings_error(
// 'sample_text', // setting title
// 'sample_text_error', // error ID
// 'Please enter some sample text', // error message
// 'error' // type of message
// );
//
// }
if ( empty( $this->_settings ) ) {
$settings = apply_filters( $this->plugin_slug . '_admin_settings', false );
$this->add_settings( $settings );
}
foreach ( $this->_settings as $setting ) {
$this->validate_setting( $setting, $input );
}
return $input;
}
function validate_setting($setting, &$input) {
//validate a single setting
if ( $setting['type'] == 'checkboxlist' ) {
unset($checkboxarray);
foreach ( $setting['choices'] as $value => $label ) {
if ( !empty($input[$setting['id'] . '|' . $value]) ) {
// If it's not null, make sure it's true, add it to an array
$checkboxarray[$value] = 'true';
} else {
$checkboxarray[$value] = 'false';
}
}
if ( !empty($checkboxarray) ) {
$input[$setting['id']] = $checkboxarray;
}
}
}
}
}