args and define the page_content() method */ abstract class scbAdminPage { /** Page args * $toplevel string If not empty, will create a new top level menu * $icon string Path to an icon for the top level menu * $parent string ( default: options-general.php ) * $capability string ( default: 'manage_options' ) * $page_title string ( mandatory ) * $menu_title string ( default: $page_title ) * $page_slug string ( default: sanitized $page_title ) * $nonce string ( default: $page_slug ) * $action_link string|bool Text of the action link on the Plugins page ( default: 'Settings' ) */ protected $args; // URL to the current plugin directory. // Useful for adding css and js files protected $plugin_url; // Created at page init protected $pagehook; // scbOptions object holder // Normally, it's used for storing formdata protected $options; protected $option_name; // l10n protected $textdomain; // ____________REGISTRATION COMPONENT____________ private static $registered = array(); static function register( $class, $file, $options = null ) { if ( isset( self::$registered[$class] ) ) return false; self::$registered[$class] = array( $file, $options ); add_action( '_admin_menu', array( __CLASS__, '_pages_init' ) ); return true; } static function replace( $old_class, $new_class ) { if ( ! isset( self::$registered[$old_class] ) ) return false; self::$registered[$new_class] = self::$registered[$old_class]; unset( self::$registered[$old_class] ); return true; } static function remove( $class ) { if ( ! isset( self::$registered[$class] ) ) return false; unset( self::$registered[$class] ); return true; } static function _pages_init() { foreach ( self::$registered as $class => $args ) new $class( $args[0], $args[1] ); } // ____________MAIN METHODS____________ // Constructor function __construct( $file, $options = NULL ) { if ( is_a( $options, 'scbOptions' ) ) $this->options = $options; $this->file = $file; $this->plugin_url = plugin_dir_url( $file ); $this->setup(); $this->check_args(); if ( isset( $this->option_name ) ) { add_action( 'admin_init', array( $this, 'option_init' ) ); if ( function_exists( 'settings_errors' ) ) add_action( 'admin_notices', 'settings_errors' ); } add_action( 'admin_menu', array( $this, 'page_init' ) ); add_filter( 'contextual_help', array( $this, '_contextual_help' ), 10, 2 ); if ( $this->args['action_link'] ) add_filter( 'plugin_action_links_' . plugin_basename( $file ), array( $this, '_action_link' ) ); } // This is where all the page args can be set function setup(){} // This is where the css and js go // Both wp_enqueue_*() and inline code can be added function page_head(){} // This is where the contextual help goes // @return string function page_help(){} // A generic page header function page_header() { echo "
$msg
\n" . scbForms::input( $input_args ) . "
\n"; return $output; } /* Mimics scbForms::form_wrap() $this->form_wrap( $content ); // generates a form with a default submit button $this->form_wrap( $content, false ); // generates a form with no submit button // the second argument is sent to submit_button() $this->form_wrap( $content, array( 'text' => 'Save changes', 'name' => 'action', 'ajax' => true, ) ); */ function form_wrap( $content, $submit_button = true ) { if ( is_array( $submit_button ) ) { $content .= call_user_func( array( $this, 'submit_button' ), $submit_button ); } elseif ( true === $submit_button ) { $content .= $this->submit_button(); } elseif ( false !== strpos( $submit_button, 'nonce ); } // See scbForms::form() function form( $rows, $formdata = array() ) { return scbForms::form( $rows, $formdata, $this->nonce ); } // Generates a table wrapped in a form function form_table( $rows, $formdata = array() ) { $output = ''; foreach ( $rows as $row ) $output .= $this->table_row( $row, $formdata ); $output = $this->form_table_wrap( $output ); return $output; } // Wraps the given content in a