Make WordPress Core

Changeset 16127


Ignore:
Timestamp:
11/01/2010 08:56:27 AM (14 years ago)
Author:
westi
Message:

Split out the list table functions into a seperate file from the base class.
See #14579.

Location:
trunk/wp-admin/includes
Files:
2 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/admin.php

    r16009 r16127  
    4040require_once(ABSPATH . 'wp-admin/includes/template.php');
    4141
    42 /** WordPress List Table Administration API */
     42/** WordPress List Table Administration API and base class */
     43require_once(ABSPATH . 'wp-admin/includes/list-table.php');
    4344require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
    4445
  • trunk/wp-admin/includes/class-wp-list-table.php

    r16125 r16127  
    11<?php
    22/**
    3  * Base class and helper functions for displaying a list of items in an ajaxified HTML table.
     3 * Base class for displaying a list of items in an ajaxified HTML table.
    44 *
    55 * @package WordPress
     
    817817    }
    818818}
    819 
    820 /**
    821  * Fetch an instance of a WP_List_Table class.
    822  *
    823  * @since 3.1.0
    824  *
    825  * @param string $class The type of the list table, which is the class name except for core list tables.
    826  * @return object|bool Object on success, false if the class does not exist.
    827  */
    828 function get_list_table( $class ) {
    829     $class = apply_filters( "get_list_table_$class", $class );
    830 
    831     require_list_table( $class );
    832 
    833     if ( class_exists( $class ) )
    834         return new $class;
    835     return false;
    836 }
    837 
    838 /**
    839  * Include the proper file for a core list table.
    840  *
    841  * Useful for extending a core class that would not otherwise be required.
    842  *
    843  * @since 3.1.0
    844  *
    845  * @param string $table The core table to include.
    846  * @return bool True on success, false on failure.
    847  */
    848 function require_list_table( $class ) {
    849     $core_classes = array(
    850         'WP_Posts_Table' => 'posts',
    851         'WP_Media_Table' => 'media',
    852         'WP_Terms_Table' => 'terms',
    853         'WP_Users_Table' => 'users',
    854         'WP_Comments_Table' => 'comments',
    855         'WP_Post_Comments_Table' => 'comments',
    856         'WP_Links_Table' => 'links',
    857         'WP_Sites_Table' => 'sites',
    858         'WP_MS_Users_Table' => 'ms-users',
    859         'WP_Plugins_Table' => 'plugins',
    860         'WP_Plugin_Install_Table' => 'plugin-install',
    861         'WP_Themes_Table' => 'themes',
    862         'WP_Theme_Install_Table' => 'theme-install',
    863         'WP_MS_Themes_Table' => 'ms-themes',
    864     );
    865 
    866     if ( isset( $core_classes[ $class ] ) ) {
    867         require_once( ABSPATH . '/wp-admin/includes/list-table-' . $core_classes[ $class ] . '.php' );
    868         return true;
    869     }
    870     return false;
    871 }
    872 
    873819?>
  • trunk/wp-admin/includes/list-table.php

    r16125 r16127  
    11<?php
    22/**
    3  * Base class and helper functions for displaying a list of items in an ajaxified HTML table.
     3 * Helper functions for displaying a list of items in an ajaxified HTML table.
    44 *
    55 * @package WordPress
     
    77 * @since 3.1.0
    88 */
    9 
    10 /**
    11  * Base class for displaying a list of items in an ajaxified HTML table.
    12  *
    13  * @package WordPress
    14  * @subpackage List_Table
    15  * @since 3.1.0
    16  */
    17 class WP_List_Table {
    18 
    19     /**
    20      * The current list of items
    21      *
    22      * @since 3.1.0
    23      * @var array
    24      * @access protected
    25      */
    26     var $items;
    27 
    28     /**
    29      * Various information about the current table
    30      *
    31      * @since 3.1.0
    32      * @var array
    33      * @access private
    34      */
    35     var $_args;
    36 
    37     /**
    38      * Various information needed for displaying the pagination
    39      *
    40      * @since 3.1.0
    41      * @var array
    42      * @access private
    43      */
    44     var $_pagination_args = array();
    45 
    46     /**
    47      * The current screen
    48      *
    49      * @since 3.1.0
    50      * @var object
    51      * @access private
    52      */
    53     var $_screen;
    54 
    55     /**
    56      * Cached bulk actions
    57      *
    58      * @since 3.1.0
    59      * @var array
    60      * @access private
    61      */
    62     var $_actions;
    63 
    64     /**
    65      * Cached pagination output
    66      *
    67      * @since 3.1.0
    68      * @var string
    69      * @access private
    70      */
    71     var $_pagination;
    72 
    73     /**
    74      * Constructor. The child class should call this constructor from it's own constructor
    75      *
    76      * @param array $args An associative array with information about the current table
    77      * @access protected
    78      */
    79     function WP_List_Table( $args ) {
    80         $args = wp_parse_args( $args, array(
    81             'screen' => '',
    82             'plural' => '',
    83             'singular' => '',
    84             'ajax' => true
    85         ) );
    86 
    87         $this->_screen = $args['screen'];
    88 
    89         if ( is_string( $this->_screen ) )
    90             $this->_screen = convert_to_screen( $this->_screen );
    91 
    92         add_filter( 'manage_' . $this->_screen->id . '_columns', array( &$this, 'get_columns' ), 0 );
    93 
    94         if ( !$args['plural'] )
    95             $args['plural'] = $this->_screen->base;
    96 
    97         $this->_args = $args;
    98 
    99         if ( $args['ajax'] ) {
    100             wp_enqueue_script( 'list-table' );
    101             add_action( 'admin_footer', array( &$this, '_js_vars' ) );
    102         }
    103     }
    104 
    105     /**
    106      * Checks the current user's permissions
    107      * @uses wp_die()
    108      *
    109      * @since 3.1.0
    110      * @access public
    111      */
    112     function check_permissions() {
    113         die( 'function WP_List_Table::check_permissions() must be over-ridden in a sub-class.' );
    114     }
    115 
    116     /**
    117      * Prepares the list of items for displaying.
    118      * @uses WP_List_Table::set_pagination_args()
    119      *
    120      * @since 3.1.0
    121      * @access public
    122      */
    123     function prepare_items() {
    124         die( 'function WP_List_Table::prepare_items() must be over-ridden in a sub-class.' );
    125     }
    126 
    127     /**
    128      * An internal method that sets all the necessary pagination arguments
    129      *
    130      * @param array $args An associative array with information about the pagination
    131      * @access protected
    132      */
    133     function set_pagination_args( $args ) {
    134         $args = wp_parse_args( $args, array(
    135             'query_var' => 'paged',
    136             'total_items' => 0,
    137             'total_pages' => 0,
    138             'per_page' => 0,
    139         ) );
    140 
    141         if ( !$args['total_pages'] && $args['per_page'] > 0 )
    142             $args['total_pages'] = ceil( $args['total_items'] / $args['per_page'] );
    143 
    144         $this->_pagination_args = $args;
    145     }
    146 
    147     /**
    148      * Access the pagination args
    149      *
    150      * @since 3.1.0
    151      * @access public
    152      *
    153      * @param string $key
    154      * @return array
    155      */
    156     function get_pagination_arg( $key ) {
    157         if ( 'page' == $key )
    158             return $this->get_pagenum();
    159 
    160         if ( isset( $this->_pagination_args[$key] ) )
    161             return $this->_pagination_args[$key];
    162     }
    163 
    164     /**
    165      * Whether the table has items to display or not
    166      *
    167      * @since 3.1.0
    168      * @access public
    169      *
    170      * @return bool
    171      */
    172     function has_items() {
    173         return !empty( $this->items );
    174     }
    175 
    176     /**
    177      * Message to be displayed when there are no items
    178      *
    179      * @since 3.1.0
    180      * @access public
    181      */
    182     function no_items() {
    183         _e( 'No items found.' );
    184     }
    185 
    186     /**
    187      * Get an associative array ( id => link ) with the list
    188      * of views available on this table.
    189      *
    190      * @since 3.1.0
    191      * @access protected
    192      *
    193      * @return array
    194      */
    195     function get_views() {
    196         return array();
    197     }
    198 
    199     /**
    200      * Display the bulk actions dropdown.
    201      *
    202      * @since 3.1.0
    203      * @access public
    204      */
    205     function views() {
    206         $views = $this->get_views();
    207         $views = apply_filters( 'views_' . $this->_screen->base, $views );
    208 
    209         if ( empty( $views ) )
    210             return;
    211 
    212         echo "<ul class='subsubsub'>\n";
    213         echo implode( " |</li>\n", $views ) . "</li>\n";
    214         echo "</ul>";
    215     }
    216 
    217     /**
    218      * Get an associative array ( option_name => option_title ) with the list
    219      * of bulk actions available on this table.
    220      *
    221      * @since 3.1.0
    222      * @access protected
    223      *
    224      * @return array
    225      */
    226     function get_bulk_actions() {
    227         return array();
    228     }
    229 
    230     /**
    231      * Display the bulk actions dropdown.
    232      *
    233      * @since 3.1.0
    234      * @access public
    235      */
    236     function bulk_actions() {
    237 
    238         if ( is_null( $this->_actions ) ) {
    239             $this->_actions = $this->get_bulk_actions();
    240             $this->_actions = apply_filters( 'bulk_actions-' . $this->_screen->base, $this->_actions );
    241             $two = '';
    242         }
    243         else {
    244             $two = '2';
    245         }
    246 
    247         if ( empty( $this->_actions ) )
    248             return;
    249 
    250         echo "<select name='action$two'>\n";
    251         echo "<option value='-1' selected='selected'>" . __( 'Bulk Actions' ) . "</option>\n";
    252         foreach ( $this->_actions as $name => $title )
    253             echo "\t<option value='$name'>$title</option>\n";
    254         echo "</select>\n";
    255 
    256         submit_button( __( 'Apply' ), 'button-secondary action', "doaction$two", false );
    257         echo "\n";
    258     }
    259 
    260     /**
    261      * Get the current action selected from the bulk actions dropdown.
    262      *
    263      * @since 3.1.0
    264      * @access public
    265      *
    266      * @return string|bool The action name or False if no action was selected
    267      */
    268     function current_action() {
    269         if ( isset( $_REQUEST['action'] ) && -1 != $_REQUEST['action'] )
    270             return $_REQUEST['action'];
    271 
    272         if ( isset( $_REQUEST['action2'] ) && -1 != $_REQUEST['action2'] )
    273             return $_REQUEST['action2'];
    274 
    275         return false;
    276     }
    277 
    278     /**
    279      * Generate row actions div
    280      *
    281      * @since 3.1.0
    282      * @access protected
    283      *
    284      * @param array $actions The list of actions
    285      * @param bool $always_visible Wether the actions should be always visible
    286      * @return string
    287      */
    288     function row_actions( $actions, $always_visible = false ) {
    289         $action_count = count( $actions );
    290         $i = 0;
    291 
    292         if ( !$action_count )
    293             return '';
    294 
    295         $out = '<div class="' . ( $always_visible ? 'row-actions-visible' : 'row-actions' ) . '">';
    296         foreach ( $actions as $action => $link ) {
    297             ++$i;
    298             ( $i == $action_count ) ? $sep = '' : $sep = ' | ';
    299             $out .= "<span class='$action'>$link$sep</span>";
    300         }
    301         $out .= '</div>';
    302 
    303         return $out;
    304     }
    305 
    306     /**
    307      * Display a monthly dropdown for filtering items
    308      *
    309      * @since 3.1.0
    310      * @access protected
    311      */
    312     function months_dropdown( $post_type ) {
    313         global $wpdb, $wp_locale;
    314 
    315         $months = $wpdb->get_results( $wpdb->prepare( "
    316             SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
    317             FROM $wpdb->posts
    318             WHERE post_type = %s
    319             ORDER BY post_date DESC
    320         ", $post_type ) );
    321 
    322         $month_count = count( $months );
    323 
    324         if ( !$month_count || ( 1 == $month_count && 0 == $months[0]->month ) )
    325             return;
    326 
    327         $m = isset( $_GET['m'] ) ? (int) $_GET['m'] : 0;
    328 ?>
    329         <select name='m'>
    330             <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates' ); ?></option>
    331 <?php
    332         foreach ( $months as $arc_row ) {
    333             if ( 0 == $arc_row->year )
    334                 continue;
    335 
    336             $month = zeroise( $arc_row->month, 2 );
    337             $year = $arc_row->year;
    338 
    339             printf( "<option %s value='%s'>%s</option>\n",
    340                 selected( $m, $year . $month, false ),
    341                 esc_attr( $arc_row->year . $month ),
    342                 $wp_locale->get_month( $month ) . " $year"
    343             );
    344         }
    345 ?>
    346         </select>
    347 <?php
    348     }
    349 
    350     /**
    351      * Display a view switcher
    352      *
    353      * @since 3.1.0
    354      * @access protected
    355      */
    356     function view_switcher( $current_mode ) {
    357         $modes = array(
    358             'list'    => __( 'List View' ),
    359             'excerpt' => __( 'Excerpt View' )
    360         );
    361 
    362 ?>
    363         <input type="hidden" name="mode" value="<?php echo esc_attr( $current_mode ); ?>" />
    364         <div class="view-switch">
    365 <?php
    366             foreach ( $modes as $mode => $title ) {
    367                 $class = ( $current_mode == $mode ) ? 'class="current"' : '';
    368                 echo "<a href='" . esc_url( add_query_arg( 'mode', $mode, $_SERVER['REQUEST_URI'] ) ) . "' $class><img id='view-switch-$mode' src='" . esc_url( includes_url( 'images/blank.gif' ) ) . "' width='20' height='20' title='$title' alt='$title' /></a>\n";
    369             }
    370         ?>
    371         </div>
    372 <?php
    373     }
    374 
    375     /**
    376      * Display a comment count bubble
    377      *
    378      * @since 3.1.0
    379      * @access protected
    380      *
    381      * @param int $post_id
    382      * @param int $pending_comments
    383      */
    384     function comments_bubble( $post_id, $pending_comments ) {
    385         $pending_phrase = sprintf( __( '%s pending' ), number_format( $pending_comments ) );
    386 
    387         if ( $pending_comments )
    388             echo '<strong>';
    389 
    390         $link = "<a href='" . add_query_arg( 'p', $post_id, admin_url('edit-comments.php') ) . "' title='$pending_phrase' class='post-com-count'><span class='comment-count'>%s</span></a>";
    391 
    392         comments_number(
    393             sprintf( $link, /* translators: comment count link */ _x( '0', 'comment count' ) ),
    394             sprintf( $link, /* translators: comment count link */ _x( '1', 'comment count' ) ),
    395             sprintf( $link, /* translators: comment count link: % will be substituted by comment count */ _x( '%', 'comment count' ) )
    396         );
    397 
    398         if ( $pending_comments )
    399             echo '</strong>';
    400     }
    401 
    402     /**
    403      * Get the current page number
    404      *
    405      * @since 3.1.0
    406      * @access protected
    407      *
    408      * @return int
    409      */
    410     function get_pagenum( $query_var = 'paged' ) {
    411         $pagenum = isset( $_REQUEST[$query_var] ) ? absint( $_REQUEST[$query_var] ) : 0;
    412 
    413         return max( 1, $pagenum );
    414     }
    415 
    416     /**
    417      * Get number of items to display on a single page
    418      *
    419      * @since 3.1.0
    420      * @access protected
    421      *
    422      * @return int
    423      */
    424     function get_items_per_page( $option, $default = 20 ) {
    425         $per_page = (int) get_user_option( $option );
    426         if ( empty( $per_page ) || $per_page < 1 )
    427             $per_page = $default;
    428 
    429         return (int) apply_filters( $option, $per_page );
    430     }
    431 
    432     /**
    433      * Display the pagination.
    434      *
    435      * @since 3.1.0
    436      * @access protected
    437      */
    438     function pagination() {
    439         if ( $this->_pagination ) {
    440             echo $this->_pagination;
    441             return;
    442         }
    443 
    444         if ( empty( $this->_pagination_args ) )
    445             return;
    446 
    447         extract( $this->_pagination_args );
    448 
    449         if ( $total_pages < 2 )
    450             return;
    451 
    452         $output = '<span class="displaying-num">' . sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) ) . '</span>';
    453 
    454         $current = $this->get_pagenum( $query_var );
    455 
    456         $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    457 
    458         $page_links = array();
    459 
    460         $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
    461             'first-page',
    462             esc_attr__( 'Go to the first page' ),
    463             esc_url( remove_query_arg( $query_var, $current_url ) ),
    464             '&laquo;&laquo;'
    465         );
    466 
    467         $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
    468             'prev-page',
    469             esc_attr__( 'Go to the previous page' ),
    470             esc_url( add_query_arg( $query_var, max( 1, $current-1 ), $current_url ) ),
    471             '&laquo;'
    472         );
    473 
    474         $html_current_page = sprintf( "<input class='current-page' title='%s' type='text' name='%s' value='%s' size='%d' />",
    475             esc_attr__( 'Current page' ),
    476             esc_attr( $query_var ),
    477             number_format_i18n( $current ),
    478             strlen( $total_pages )
    479         );
    480         $html_total_pages = sprintf( "<span class='total-pages'>%s</span>", number_format_i18n( $total_pages ) );
    481         $page_links[] = sprintf( _x( '%s of %s', 'paging' ), $html_current_page, $html_total_pages );
    482 
    483         $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
    484             'next-page',
    485             esc_attr__( 'Go to the next page' ),
    486             esc_url( add_query_arg( $query_var, min( $total_pages, $current+1 ), $current_url ) ),
    487             '&raquo;'
    488         );
    489 
    490         $page_links[] = sprintf( "<a class='%s' title='%s' href='%s'>%s</a>",
    491             'last-page',
    492             esc_attr__( 'Go to the last page' ),
    493             esc_url( add_query_arg( $query_var, $total_pages, $current_url ) ),
    494             '&raquo;&raquo;'
    495         );
    496 
    497         $output .= join( "\n", $page_links );
    498 
    499         $this->_pagination = "<div class='tablenav-pages'>$output</div>";
    500 
    501         echo $this->_pagination;
    502     }
    503 
    504     /**
    505      * Get a list of columns. The format is internal_name => title
    506      *
    507      * @since 3.1.0
    508      * @access protected
    509      *
    510      * @return array
    511      */
    512     function get_columns() {
    513         die( 'function WP_List_Table::get_columns() must be over-ridden in a sub-class.' );
    514     }
    515 
    516     /**
    517      * Get a list of sortable columns. The format is internal_name => orderby
    518      *
    519      * @since 3.1.0
    520      * @access protected
    521      *
    522      * @return array
    523      */
    524     function get_sortable_columns() {
    525         return array();
    526     }
    527 
    528     /**
    529      * Get a list of all, hidden and sortable columns, with filter applied
    530      *
    531      * @since 3.1.0
    532      * @access protected
    533      *
    534      * @return array
    535      */
    536     function get_column_info() {
    537         if ( !isset( $this->_column_headers ) ) {
    538             $columns = get_column_headers( $this->_screen );
    539             $hidden = get_hidden_columns( $this->_screen );
    540             $sortable = apply_filters( 'manage_' . $this->_screen->id . '_sortable_columns', $this->get_sortable_columns() );
    541 
    542             $this->_column_headers = array( $columns, $hidden, $sortable );
    543         }
    544 
    545         return $this->_column_headers;
    546     }
    547 
    548     /**
    549      * Print column headers, accounting for hidden and sortable columns.
    550      *
    551      * @since 3.1.0
    552      * @access protected
    553      *
    554      * @param bool $with_id Whether to set the id attribute or not
    555      */
    556     function print_column_headers( $with_id = true ) {
    557         $screen = $this->_screen;
    558 
    559         list( $columns, $hidden, $sortable ) = $this->get_column_info();
    560 
    561         $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    562 
    563         if ( isset( $_GET['orderby'] ) )
    564             $current_orderby = $_GET['orderby'];
    565         else
    566             $current_orderby = '';
    567 
    568         if ( isset( $_GET['order'] ) && 'desc' == $_GET['order'] )
    569             $current_order = 'desc';
    570         else
    571             $current_order = 'asc';
    572 
    573         foreach ( $columns as $column_key => $column_display_name ) {
    574             $class = array( 'manage-column', "column-$column_key" );
    575 
    576             $style = '';
    577             if ( in_array( $column_key, $hidden ) )
    578                 $style = 'display:none;';
    579 
    580             $style = ' style="' . $style . '"';
    581 
    582             if ( 'cb' == $column_key )
    583                 $class[] = 'check-column';
    584             elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) )
    585                 $class[] = 'num';
    586 
    587             if ( isset( $sortable[$column_key] ) ) {
    588                 $orderby = $sortable[$column_key];
    589                 if ( $current_orderby == $orderby ) {
    590                     $order = 'asc' == $current_order ? 'desc' : 'asc';
    591                     $class[] = "sorted-$current_order";
    592                 } else {
    593                     $order = 'asc';
    594                     $class[] = 'sortable';
    595                 }
    596                 $column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '">' . $column_display_name . '</a>';
    597                 $column_display_name .= '<div class="sorting-indicator"></div>';
    598             }
    599 
    600             $id = $with_id ? "id='$column_key'" : '';
    601 
    602             if ( !empty( $class ) )
    603                 $class = "class='" . join( ' ', $class ) . "'";
    604 
    605             echo "<th scope='col' $id $class $style>$column_display_name</th>";
    606         }
    607     }
    608 
    609     /**
    610      * Display the table or a message if there are no items
    611      *
    612      * @since 3.1.0
    613      * @access public
    614      */
    615     function display() {
    616         if ( $this->has_items() ) {
    617             $this->display_table();
    618         } else {
    619 ?>
    620         <br class="clear" />
    621         <p><?php $this->no_items(); ?></p>
    622 <?php
    623         }
    624     }
    625 
    626     /**
    627      * Get a list of CSS classes for the <table> tag
    628      *
    629      * @since 3.1.0
    630      * @access protected
    631      *
    632      * @return array
    633      */
    634     function get_table_classes() {
    635         extract( $this->_args );
    636 
    637         return array( 'widefat', 'fixed', $plural );
    638     }
    639 
    640     /**
    641      * Display the full table
    642      *
    643      * @since 3.1.0
    644      * @access public
    645      */
    646     function display_table() {
    647         extract( $this->_args );
    648 
    649         $this->display_tablenav( 'top' );
    650 
    651 ?>
    652 <table class="<?php echo implode( ' ', $this->get_table_classes() ); ?>" cellspacing="0">
    653     <thead>
    654     <tr>
    655         <?php $this->print_column_headers(); ?>
    656     </tr>
    657     </thead>
    658 
    659     <tfoot>
    660     <tr>
    661         <?php $this->print_column_headers( false ); ?>
    662     </tr>
    663     </tfoot>
    664 
    665     <tbody id="the-list"<?php if ( $singular ) echo " class='list:$singular'"; ?>>
    666         <?php $this->display_rows(); ?>
    667     </tbody>
    668 </table>
    669 <?php
    670 
    671         $this->display_tablenav( 'bottom' );
    672     }
    673 
    674     /**
    675      * Generate the table navigation above or below the table
    676      *
    677      * @since 3.1.0
    678      * @access protected
    679      */
    680     function display_tablenav( $which ) {
    681         if ( 'top' == $which )
    682             wp_nonce_field( 'bulk-' . $this->_args['plural'] );
    683 ?>
    684     <div class="tablenav">
    685 
    686         <div class="alignleft actions">
    687             <?php $this->bulk_actions( $which ); ?>
    688         </div>
    689 
    690     <?php
    691         $this->extra_tablenav( $which );
    692         $this->pagination( $which );
    693     ?>
    694 
    695         <br class="clear" />
    696     </div>
    697 
    698     <br class="clear" />
    699 <?php
    700     }
    701 
    702     /**
    703      * Extra controls to be displayed between bulk actions and pagination
    704      *
    705      * @since 3.1.0
    706      * @access protected
    707      */
    708     function extra_tablenav( $which ) {}
    709 
    710     /**
    711      * Generate the <tbody> part of the table
    712      *
    713      * @since 3.1.0
    714      * @access protected
    715      */
    716     function display_rows() {
    717         foreach ( $this->items as $item )
    718             $this->single_row( $item );
    719     }
    720 
    721     /**
    722      * Generates content for a single row of the table
    723      *
    724      * @since 3.1.0
    725      * @access protected
    726      *
    727      * @param $object $item The current item
    728      */
    729     function single_row( $item ) {
    730         static $row_class = '';
    731         $row_class = ( $row_class == '' ? ' class="alternate"' : '' );
    732 
    733         echo '<tr' . $row_class . '>';
    734         echo $this->single_row_columns( $item );
    735         echo '</tr>';
    736     }
    737 
    738     /**
    739      * Generates the columns for a single row of the table
    740      *
    741      * @since 3.1.0
    742      * @access protected
    743      *
    744      * @param $object $item The current item
    745      */
    746     function single_row_columns( $item ) {
    747         list( $columns, $hidden ) = $this->get_column_info();
    748 
    749         foreach ( $columns as $column_name => $column_display_name ) {
    750             $class = "class=\"$column_name column-$column_name\"";
    751 
    752             $style = '';
    753             if ( in_array( $column_name, $hidden ) )
    754                 $style = ' style="display:none;"';
    755 
    756             $attributes = "$class$style";
    757 
    758             if ( 'cb' == $column_name ) {
    759                 echo '<th scope="row" class="check-column">';
    760                 echo $this->column_cb( $item );
    761                 echo '</th>';
    762             }
    763             elseif ( method_exists( $this, 'column_' . $column_name ) ) {
    764                 echo "<td $attributes>";
    765                 echo call_user_func( array( &$this, 'column_' . $column_name ), $item );
    766                 echo "</td>";
    767             }
    768             else {
    769                 echo "<td $attributes>";
    770                 echo $this->column_default( $item, $column_name );
    771                 echo "</td>";
    772             }
    773         }
    774     }
    775 
    776     /**
    777      * Handle an incoming ajax request (called from admin-ajax.php)
    778      *
    779      * @since 3.1.0
    780      * @access public
    781      */
    782     function ajax_response() {
    783         $this->check_permissions();
    784         $this->prepare_items();
    785 
    786         extract( $this->_args );
    787         extract( $this->_pagination_args );
    788 
    789         ob_start();
    790         $this->display_rows();
    791         $rows = ob_get_clean();
    792 
    793         $response = array( 'rows' => $rows );
    794 
    795         if ( isset( $total_items ) )
    796             $response['total_items'] = sprintf( _n( '1 item', '%s items', $total_items ), number_format_i18n( $total_items ) );
    797 
    798         if ( isset( $total_pages ) )
    799             $response['total_pages'] = $total_pages;
    800 
    801         die( json_encode( $response ) );
    802     }
    803 
    804     /**
    805      * Send required variables to JavaScript land
    806      *
    807      * @access private
    808      */
    809     function _js_vars() {
    810         extract( $this->_args );
    811 
    812         $class = get_class( $this );
    813 
    814         printf( "<script type='text/javascript'>list_args = %s;</script>\n",
    815             json_encode( compact( 'screen', 'class' ) )
    816         );
    817     }
    818 }
    8199
    82010/**
     
    82818function get_list_table( $class ) {
    82919    $class = apply_filters( "get_list_table_$class", $class );
    830 
     20   
    83121    require_list_table( $class );
    83222
Note: See TracChangeset for help on using the changeset viewer.