Store screen help and options as static data against WP_Screen. Individual screen objects no longer hold data it can't re-generate on construction or otherwise fetch. convert_to_screen() now returns a WP_Screen object. Various globals are gone. Introduces WP_Screen::get_option(). Allows for a formal factory to be introduced later. see #18785.

git-svn-id: https://develop.svn.wordpress.org/trunk@18943 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Andrew Nacin 2011-10-11 21:32:16 +00:00
parent 50b17d4b68
commit 3940109c7f
1 changed files with 85 additions and 62 deletions

View File

@ -18,13 +18,12 @@ function get_column_headers( $screen ) {
if ( is_string( $screen ) ) if ( is_string( $screen ) )
$screen = convert_to_screen( $screen ); $screen = convert_to_screen( $screen );
global $_wp_column_headers; static $column_headers = array();
if ( !isset( $_wp_column_headers[ $screen->id ] ) ) { if ( ! isset( $column_headers[ $screen->id ] ) )
$_wp_column_headers[ $screen->id ] = apply_filters( 'manage_' . $screen->id . '_columns', array() ); $column_headers[ $screen->id ] = apply_filters( 'manage_' . $screen->id . '_columns', array() );
}
return $_wp_column_headers[ $screen->id ]; return $column_headers[ $screen->id ];
} }
/** /**
@ -49,7 +48,7 @@ function get_hidden_columns( $screen ) {
* *
* @param unknown_type $screen * @param unknown_type $screen
*/ */
function meta_box_prefs($screen) { function meta_box_prefs( $screen ) {
global $wp_meta_boxes; global $wp_meta_boxes;
if ( is_string($screen) ) if ( is_string($screen) )
@ -232,7 +231,7 @@ function convert_to_screen( $screen ) {
$screen .= '-user'; $screen .= '-user';
$screen = (string) apply_filters( 'screen_meta_screen', $screen ); $screen = (string) apply_filters( 'screen_meta_screen', $screen );
$screen = (object) array('id' => $screen, 'base' => $screen); $screen = new WP_Screen( $screen );
return $screen; return $screen;
} }
@ -248,16 +247,11 @@ function convert_to_screen( $screen ) {
* *
* @todo: deprecate? * @todo: deprecate?
*/ */
function add_contextual_help($screen, $help) { function add_contextual_help( $screen, $help ) {
global $_wp_contextual_help; if ( is_string( $screen ) )
$screen = convert_to_screen( $screen );
if ( is_string($screen) ) $screen->add_old_compat_help( $help );
$screen = convert_to_screen($screen);
if ( !isset($_wp_contextual_help) )
$_wp_contextual_help = array();
$_wp_contextual_help[$screen->id] = $help;
} }
/** /**
@ -441,31 +435,35 @@ final class WP_Screen {
/** /**
* The help tab data associated with the screen, if any. * The help tab data associated with the screen, if any.
* *
* @since 3.3.0 * @since 3.3.0
* @var array * @var array
* @access private * @access private
*/ */
private $_help_tabs = array(); private static $_help_tabs = array();
/** /**
* The help sidebar data associated with the screen, if any. * The help sidebar data associated with screens, if any.
* *
* @since 3.3.0 * @since 3.3.0
* @var string * @var string
* @access private * @access private
*/ */
private $_help_sidebar = ''; private static $_help_sidebar = array();
/** /**
* The screen options associated with the screen, if any. * Stores old string-based help.
*/
private static $_old_compat_help = array();
/**
* The screen options associated with screens, if any.
* *
* @since 3.3.0 * @since 3.3.0
* @var array * @var array
* @access private * @access private
*/ */
private $_options = array(); private static $_options = array();
/** /**
* Stores the result of the public show_screen_options function. * Stores the result of the public show_screen_options function.
@ -553,6 +551,17 @@ final class WP_Screen {
$this->base .= '-user'; $this->base .= '-user';
$this->id .= '-user'; $this->id .= '-user';
} }
if ( ! isset( self::$_help_tabs[ $this->id ] ) )
self::$_help_tabs[ $this->id ] = array();
if ( ! isset( self::$_help_sidebar[ $this->id ] ) )
self::$_help_sidebar[ $this->id ] = '';
if ( ! isset( self::$_options[ $this->id ] ) )
self::$_options[ $this->id ] = array();
}
function add_old_compat_help( $help ) {
self::$_old_compat_help[ $this->id ] = $help;
} }
/** /**
@ -579,7 +588,25 @@ final class WP_Screen {
* @param mixed $args Option-dependent arguments. * @param mixed $args Option-dependent arguments.
*/ */
public function add_option( $option, $args = array() ) { public function add_option( $option, $args = array() ) {
$this->_options[ $option ] = $args; self::$_options[ $this->id ][ $option ] = $args;
}
/**
* Gets the arguments for an option for the screen.
*
* @since 3.3.0
*
* @param string
*/
public function get_option( $option, $key = false ) {
if ( ! isset( self::$_options[ $this->id ][ $option ] ) )
return null;
if ( $key ) {
if ( isset( self::$_options[ $this->id ][ $option ][ $key ] ) )
return self::$_options[ $this->id ][ $option ][ $key ];
return null;
}
return self::$_options[ $this->id ][ $option ];
} }
/** /**
@ -610,7 +637,7 @@ final class WP_Screen {
if ( ! $args['id'] || ! $args['title'] ) if ( ! $args['id'] || ! $args['title'] )
return; return;
$this->_help_tabs[] = $args; self::$_help_tabs[ $this->id ][] = $args;
} }
/** /**
@ -622,7 +649,7 @@ final class WP_Screen {
* @param string $content Sidebar content in plain text or HTML. * @param string $content Sidebar content in plain text or HTML.
*/ */
public function add_help_sidebar( $content ) { public function add_help_sidebar( $content ) {
$this->_help_sidebar = $content; self::$_help_sidebar[ $this->id ] = $content;
} }
/** /**
@ -633,17 +660,14 @@ final class WP_Screen {
* @since 3.3.0 * @since 3.3.0
*/ */
public function render_screen_meta() { public function render_screen_meta() {
global $_wp_contextual_help;
// Call old contextual_help_list filter. // Call old contextual_help_list filter.
if ( ! isset( $_wp_contextual_help ) ) self::$_old_compat_help = apply_filters( 'contextual_help_list', self::$_old_compat_help );
$_wp_contextual_help = array();
$_wp_contextual_help = apply_filters( 'contextual_help_list', $_wp_contextual_help, $this );
if ( isset( $_wp_contextual_help[ $this->id ] ) || ! $this->_help_tabs ) { if ( isset( self::$_old_compat_help[ $this->id ] ) || empty(self::$_help_tabs[ $this->id ] ) ) {
// Call old contextual_help filter. // Call old contextual_help filter.
if ( isset( $_wp_contextual_help[ $this->id ] ) ) if ( isset( self::$_old_compat_help[ $this->id ] ) )
$contextual_help = apply_filters( 'contextual_help', $_wp_contextual_help[ $this->id ], $this->id, $this ); $contextual_help = apply_filters( 'contextual_help', self::$_old_compat_help[ $this->id ], $this->id );
if ( empty( $contextual_help ) ) { if ( empty( $contextual_help ) ) {
$default_help = __( '<a href="http://codex.wordpress.org/" target="_blank">Documentation</a>' ); $default_help = __( '<a href="http://codex.wordpress.org/" target="_blank">Documentation</a>' );
@ -666,8 +690,8 @@ final class WP_Screen {
'title' => __('Screen Options'), 'title' => __('Screen Options'),
'callback' => array( $this, 'render_screen_options' ), 'callback' => array( $this, 'render_screen_options' ),
) ); ) );
$_options_tab = array_pop( $this->_help_tabs ); $_options_tab = array_pop( self::$_help_tabs[ $this->id ] );
array_unshift( $this->_help_tabs, $_options_tab ); array_unshift( self::$_help_tabs[ $this->id ], $_options_tab );
} }
// Time to render! // Time to render!
@ -677,7 +701,7 @@ final class WP_Screen {
<div id="contextual-help-wrap" class="hidden"> <div id="contextual-help-wrap" class="hidden">
<div class="contextual-help-tabs"> <div class="contextual-help-tabs">
<ul> <ul>
<?php foreach ( $this->_help_tabs as $i => $tab ): <?php foreach ( self::$_help_tabs[ $this->id ] as $i => $tab ):
$link_id = "tab-link-{$tab['id']}"; $link_id = "tab-link-{$tab['id']}";
$panel_id = "tab-panel-{$tab['id']}"; $panel_id = "tab-panel-{$tab['id']}";
$classes = ( $i == 0 ) ? 'active' : ''; $classes = ( $i == 0 ) ? 'active' : '';
@ -692,12 +716,14 @@ final class WP_Screen {
</ul> </ul>
</div> </div>
<?php if ( ! empty( self::$_help_sidebar[ $this->id ] ) ) : ?>
<div class="contextual-help-sidebar"> <div class="contextual-help-sidebar">
<?php echo $this->_help_sidebar; ?> <?php echo self::$_help_sidebar[ $this->id ]; ?>
</div> </div>
<?php endif; ?>
<div class="contextual-help-tabs-wrap"> <div class="contextual-help-tabs-wrap">
<?php foreach ( $this->_help_tabs as $i => $tab ): <?php foreach ( self::$_help_tabs[ $this->id ] as $i => $tab ):
$panel_id = "tab-panel-{$tab['id']}"; $panel_id = "tab-panel-{$tab['id']}";
$classes = ( $i == 0 ) ? 'active' : ''; $classes = ( $i == 0 ) ? 'active' : '';
$classes .= ' help-tab-content'; $classes .= ' help-tab-content';
@ -733,7 +759,7 @@ final class WP_Screen {
$show_screen = true; $show_screen = true;
// Check if there are per-page options. // Check if there are per-page options.
$show_screen = $show_screen || isset( $this->_options['per_page'] ); $show_screen = $show_screen || $this->get_option('per_page');
$this->_screen_settings = apply_filters( 'screen_settings', '', $this ); $this->_screen_settings = apply_filters( 'screen_settings', '', $this );
@ -747,7 +773,7 @@ final class WP_Screen {
if ( ! empty( $this->_screen_settings ) ) if ( ! empty( $this->_screen_settings ) )
$show_screen = true; $show_screen = true;
if ( ! empty( $this->_options ) ) if ( ! empty( self::$_options[ $this->id ] ) )
$show_screen = true; $show_screen = true;
$this->_show_screen_options = apply_filters( 'screen_options_show_screen', $show_screen, $this ); $this->_show_screen_options = apply_filters( 'screen_options_show_screen', $show_screen, $this );
@ -768,8 +794,8 @@ final class WP_Screen {
?> ?>
<form id="adv-settings" action="" method="post"> <form id="adv-settings" action="" method="post">
<?php <?php
if ( isset( $this->_options['overview'] ) ) if ( $this->get_option('overview') )
echo $this->_options['overview']; echo $this->get_option('overview');
if ( isset( $wp_meta_boxes[ $this->id ] ) ) : ?> if ( isset( $wp_meta_boxes[ $this->id ] ) ) : ?>
<h5><?php _ex('Show on screen', 'Metaboxes') ?></h5> <h5><?php _ex('Show on screen', 'Metaboxes') ?></h5>
<div class="metabox-prefs"> <div class="metabox-prefs">
@ -826,17 +852,17 @@ final class WP_Screen {
if ( ! empty( $columns ) && isset( $columns[ $this->id ] ) ) if ( ! empty( $columns ) && isset( $columns[ $this->id ] ) )
$this->add_option( 'layout_columns', array('max' => $columns[ $this->id ] ) ); $this->add_option( 'layout_columns', array('max' => $columns[ $this->id ] ) );
if ( ! isset( $this->_options['layout_columns'] ) ) { if ( ! $this->get_option('layout_columns') ) {
$screen_layout_columns = 0; $screen_layout_columns = 0;
return; return;
} }
$screen_layout_columns = get_user_option("screen_layout_$this->id"); $screen_layout_columns = get_user_option("screen_layout_$this->id");
$num = $this->_options['layout_columns']['max']; $num = $this->get_option( 'layout_columns', 'max' );
if ( ! $screen_layout_columns || 'auto' == $screen_layout_columns ) { if ( ! $screen_layout_columns || 'auto' == $screen_layout_columns ) {
if ( isset( $this->_options['layout_columns']['default'] ) ) if ( $this->get_option( 'layout_columns', 'default' ) )
$screen_layout_columns = $this->_options['layout_columns']['default']; $screen_layout_columns = $this->get_option( 'layout_columns', 'default' );
} }
?> ?>
@ -862,22 +888,19 @@ final class WP_Screen {
* @since 3.3.0 * @since 3.3.0
*/ */
function render_per_page_options() { function render_per_page_options() {
if ( ! isset( $this->_options['per_page'] ) ) if ( ! $this->get_option( 'per_page' ) )
return; return;
$per_page_label = $this->_options['per_page']['label']; $per_page_label = $this->get_option( 'per_page', 'label' );
if ( empty( $this->_options['per_page']['option'] ) ) { $option = $this->get_option( 'per_page', 'option' );
if ( ! $option )
$option = str_replace( '-', '_', "{$this->id}_per_page" ); $option = str_replace( '-', '_', "{$this->id}_per_page" );
} else {
$option = $this->_options['per_page']['option'];
}
$per_page = (int) get_user_option( $option ); $per_page = (int) get_user_option( $option );
if ( empty( $per_page ) || $per_page < 1 ) { if ( empty( $per_page ) || $per_page < 1 ) {
if ( isset($this->_options['per_page']['default']) ) $per_page = $this->get_option( 'per_page', 'default' );
$per_page = $this->_options['per_page']['default']; if ( ! $per_page )
else
$per_page = 20; $per_page = 20;
} }