API Docs for: 0.1.1
Show:

File: core/class_list_table.php

<?php
/**
 *
 */

require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' );

/*
 *
 * The current class is just wrapper.
 * To use dataTables Overview,
 * You should create child class
 *
 */
class WPP_List_Table extends WP_List_Table {

  public $table_scope;

  /**
   * Setup options mostly.
   *
   * @todo Get list of displayed columns from options
   *
   */
  function __construct( $args = '' ) {

    $args = wp_parse_args( $args, array(
      'plural' => '',
      'iColumns' => 3,
      'per_page' => 20,
      'iDisplayStart' => 0,
      'ajax_action' => 'wpp_list_table', // Should be set in child class!
      'current_screen' => '',
      'table_scope' => '', // Should be set in child class!
      'singular' => '',
      'ajax' => false
    ));

    $this->_args = $args;

    if ( empty( $this->_args[ 'current_screen' ] ) ) {
      if ( $this->_args[ 'ajax' ] != true ) {
        $screen = get_current_screen();
        $this->_args[ 'current_screen' ] = $screen->id;
      }
    }

    //* Returns columns, hidden, sortable */
    list( $columns, $hidden ) = $this->get_column_info();

    //** Build aoColumns for ajax return */
    $column_count = 0;
    foreach ( $columns as $column_slug => $column_title ) {

      if ( in_array( $column_slug, $hidden ) ) {
        $column_visible = 'false';
      } else {
        $column_visible = 'true';
      }
      $this->aoColumns[ ] = "{ 'sClass': '{$column_slug} column-{$column_slug}', 'bSortable':false}";
      $this->aoColumnDefs[ ] = "{ 'sName': '{$column_slug}', 'aTargets': [{$column_count}]}";
      $this->column_ids[ $column_count ] = $column_slug;
      $column_count++;
    }

    $this->_args[ 'iColumns' ] = count( $this->aoColumns );
    $this->table_scope = $this->_args[ 'table_scope' ];
  }

  /**
   * Display the search box.
   *
   * @since 3.1.0
   * @access public
   *
   * @param string $text The search button text
   * @param string $input_id The search input id
   */
  function search_box( $text, $input_id ) {
    /** Commented to prevent search field disappearing on first loading of all_properties page. korotkov@UD */
    /*if ( empty( $_REQUEST['s'] ) && !$this->has_items() ) {
      return;
    }*/

    $input_id = $input_id . '-search-input';
    ?>
    <p class="search-box">
      <label class="screen-reader-text" for="<?php echo $input_id ?>"><?php echo $text; ?>:</label>
      <input type="text" id="<?php echo $input_id ?>" name="wpp_search[post_title]"
             value="<?php _admin_search_query(); ?>"/>
      <?php /* submit_button( $text, 'button', false, false, array('id' => 'search-submit')); */ ?>
    </p>
  <?php
  }

  /**
   * Whether the table has items to display or not
   *
   */
  function has_items() {
    return !empty( $this->all_items );
  }

  /**
   * Initialize the DataTable View
   *
   */
  function data_tables_script( $args = '' ) {
    ?>
    <script type="text/javascript">
      var wp_list_table;
      var wp_table_column_ids = {}
      <?php foreach($this->column_ids as $col_id => $col_slug) : ?>
      wp_table_column_ids['<?php echo $col_slug; ?>'] = '<?php echo $col_id; ?>';
      <?php endforeach; ?>

      jQuery( document ).ready( function () {
        /* Initialize the dataTable */
        //return;
        wp_list_table = jQuery( "#wp-list-table" ).dataTable( {
          "sPaginationType": "full_numbers",
          "sDom": 'prtpl',
          "iDisplayLength": <?php echo $this->_args['per_page']; ?>,
          "bAutoWidth": false,
          "oLanguage": {
            "sLengthMenu": wpp.strings.dtables.display + ' <select><option value="25">25 </option><option value="50">50 </option><option value="100">100</option><option value="-1">' + wpp.strings.dtables.all + ' </option></select> ' + wpp.strings.dtables.records,
            "sProcessing": '<div class="ajax_loader_overview"></div>'
          },
          "iColumns": <?php echo count($this->aoColumnDefs); ?>,
          "bProcessing": true,
          "bServerSide": true,
          "aoColumnDefs": [<?php echo implode(',', $this->aoColumnDefs); ?>],
          "sAjaxSource": ajaxurl + '?&action=<?php echo $this->_args['ajax_action']; ?>',
          "fnServerData": function ( sSource, aoData, fnCallback ) {
            aoData.push( {
              name: 'wpp_filter_vars',
              value: jQuery( '#<?php echo $this->table_scope; ?>-filter' ).serialize()
            } );
            jQuery.ajax( {
              "dataType": 'json',
              "type": "POST",
              "url": sSource,
              "data": aoData,
              "success": [fnCallback, wpp.overview.initialize()]
            } );
          },
          "aoColumns": [<?php echo implode(",", $this->aoColumns); ?>],
          "fnDrawCallback": function () {
            wp_list_table_do_columns();
          }
        } );

        /* Search by Filter */
        jQuery( "#<?php echo $this->table_scope; ?>-filter #search-submit" ).click( function ( event ) {
          event.preventDefault();
          wp_list_table.fnDraw();
          return false;
        } );

        jQuery( '.metabox-prefs' ).change( function () {
          wp_list_table_do_columns();
        } );
      } );

      //** Check which columns are hidden, and hide data table columns */
      function wp_list_table_do_columns () {
        // Hide any "hidden" columns from table
        var visible_columns = jQuery( '.hide-column-tog' ).filter( ':checked' ).map( function () {
          return jQuery( this ).val();
        } );
        var hidden_columns = jQuery( '.hide-column-tog' ).filter( ':not(:checked)' ).map( function () {
          return jQuery( this ).val();
        } );

        jQuery.each( hidden_columns, function ( key, row_class ) {
          jQuery( '#wp-list-table .' + row_class ).hide();
        } );
        jQuery.each( visible_columns, function ( key, row_class ) {
          jQuery( '#wp-list-table .' + row_class ).show();
        } );
      }
    </script>
  <?php
  }

  /**
   * Get a list of all, hidden and sortable columns, with filter applied
   *
   * @since 3.1.0
   * @access protected
   *
   * @return array
   */
  function get_column_info() {

    if ( isset( $this->_column_headers ) ) {
      return $this->_column_headers;
    }

    $screen = convert_to_screen( $this->_args[ 'current_screen' ] );

    //print_r( $this->_args );

    $columns = get_column_headers( $screen );

    $hidden = get_hidden_columns( $screen );

    $_sortable = apply_filters( "manage_{$screen->id}_sortable_columns", $this->get_sortable_columns());

    $sortable = array();
    foreach ( $_sortable as $id => $data ) {
      if ( empty( $data ) )
        continue;

      $data = (array)$data;
      if ( !isset( $data[ 1 ] ) )
        $data[ 1 ] = false;

      $sortable[ $id ] = $data;
    }

    $this->_column_headers = array( $columns, $hidden, $sortable );
    return $this->_column_headers;
  }

  /**
   * Get search results based on query.
   *
   * @todo Needs to be updated to handle the AJAX requests.
   *
   */
  function prepare_items( $wpp_search = false, $ajax = true ) {

    $wpp_search = apply_filters( 'prepare_wpp_properties_search', $wpp_search );

    if ( !$ajax ) $this->all_items = array();

    if ( !isset( $this->all_items ) ) {
      $this->all_items = WPP_F::get_properties( $wpp_search );
    }

    //** Do pagination  */
    if ( !empty( $this->all_items ) && $this->_args[ 'per_page' ] != -1 ) {
      $this->item_pages = array_chunk( $this->all_items, $this->_args[ 'per_page' ] );

      $total_chunks = count( $this->item_pages );

      //** figure out what page chunk we are on based on iDisplayStart
      $this_chunk = ( $this->_args[ 'iDisplayStart' ] / $this->_args[ 'per_page' ] );

      //** Get page items */
      $this->items = $this->item_pages[ $this_chunk ];

    } else {
      $this->items = $this->all_items;
    }
  }

  /**
   * Generate the table navigation above or below the table
   *
   * @since 3.1.0
   * @access protected
   */
  function display_tablenav( $which ) {
    if ( 'top' == $which ) {
      wp_nonce_field( 'bulk-' . $this->_args[ 'plural' ] );
    }
    /* Get Bulk actions HTML */
    ob_start();
    $this->bulk_actions( $which );
    $bulk_actions = ob_get_contents();
    ob_end_clean();

    /* Always show tablenav wrapper. */
    ?>
    <div class="tablenav <?php echo esc_attr( $which ); ?>">
      <?php if ( !empty( $bulk_actions ) ) { ?>
        <div class="alignleft actions">
          <?php echo $bulk_actions; ?>
        </div>
      <?php } ?>
      <br class="clear"/>
    </div>
  <?php

  }

  /**
   * Display a monthly dropdown for filtering items
   *
   * @since 3.1.0
   * @access protected
   */
  function months_dropdown( $post_type, $field_name = 'm', $return = false ) {
    global $wpdb, $wp_locale;

    $months = $wpdb->get_results( $wpdb->prepare( "
      SELECT DISTINCT YEAR( post_date ) AS year, MONTH( post_date ) AS month
      FROM $wpdb->posts
      WHERE post_type = %s
      ORDER BY post_date DESC
    ", $post_type ));

    $month_count = count( $months );

    if ( !$month_count || ( 1 == $month_count && 0 == $months[ 0 ]->month ) ) {
      return false;
    }

    $m = isset( $_GET[ 'm' ] ) ? (int)$_GET[ 'm' ] : 0;

    ob_start();

    ?>
    <select name="<?php echo $field_name; ?>">
      <option<?php selected( $m, 0 ); ?> value='0'><?php _e( 'Show all dates' ); ?></option>
      <?php
      foreach ( $months as $arc_row ) {
        if ( 0 == $arc_row->year ) {
          continue;
        }

        $month = zeroise( $arc_row->month, 2 );
        $year = $arc_row->year;

        printf( "<option %s value='%s'>%s</option>\n",
          selected( $m, $year . $month, false ),
          esc_attr( $arc_row->year . $month ),
          $wp_locale->get_month( $month ) . " $year"
        );
      }
      ?>
    </select>
    <?php

    $content = ob_get_contents();
    ob_end_clean();

    if ( $return ) {
      return $content;
    } else {
      echo $content;
    }

  }

  function display_rows() {
    foreach ( $this->items as $userid => $object ) {
      echo "\n\t", $this->single_row( $object );
    }
  }

  /**
   * Display the table
   *
   * @since 3.1.0
   * @access public
   */
  function display( $args = '' ) {
    /* Display Bulk Actions if exist */
    $this->display_tablenav( 'top', $args );
    ?>
    <div class="wpp_above_overview_table"></div>
    <table id="wp-list-table" class="wp-list-table <?php echo implode( ' ', $this->get_table_classes()); ?>"
           cellspacing="0">
      <thead>
      <tr>
        <?php $this->print_column_headers(); ?>
      </tr>
      </thead>

      <tfoot>
      <tr>
        <?php $this->print_column_headers( false ); ?>
      </tr>
      </tfoot>

      <tbody id="the-list">
      <?php $this->display_rows_or_placeholder(); ?>
      </tbody>
    </table>
  <?php
  }

  /**
   * -
   *
   * @return array
   */
  function no_items() {
    //** DataTables expects a set number of columns */
    $result[ 0 ] = '';
    $result[ 1 ] = __( 'Nothing found.' );

    if ( count( $result ) < $this->_args[ 'iColumns' ] ) {
      $add_columns = ( $this->_args[ 'iColumns' ] - count( $result ));
      //** Add some blank rows to not break json result array */
      $i = 1;
      while ( $i <= $add_columns ) {
        $result[ ] = '';
        $i++;
      }
    }
    return $result;
  }

  /**
   * Keep it simple here.  Mostly to be either replaced by child classes, or hook into
   *
   */
  function single_cell( $full_column_name, $object, $object_id ) {
    global $wpi;

    $object = (array)$object;

    $column_name = str_replace( 'wpp_', '', $full_column_name );

    $cell_data = array(
      'table_scope' => $this->_args[ 'table_scope' ],
      'column_name' => $column_name,
      'object_id' => $object_id,
      'object' => $object,
      'wpp_list_table' => $this
    );

    $value = ( isset( $object[ $column_name ] ) ) ? $object[ $column_name ] : "";

    $r = apply_filters( $this->_args[ 'table_scope' ] . '_table_cell', $value, $cell_data );

    return $r;
  }

  /**
   * Print column headers, accounting for hidden and sortable columns.
   *
   * @since 3.1.0
   * @access protected
   *
   * @param bool $with_id Whether to set the id attribute or not
   */
  function print_column_headers( $with_id = true ) {
    $screen = get_current_screen();

    list( $columns, $hidden, $sortable ) = $this->get_column_info();

    $current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ];
    $current_url = remove_query_arg( 'paged', $current_url );

    if ( isset( $_GET[ 'orderby' ] ) )
      $current_orderby = $_GET[ 'orderby' ];
    else
      $current_orderby = '';

    if ( isset( $_GET[ 'order' ] ) && 'desc' == $_GET[ 'order' ] )
      $current_order = 'desc';
    else
      $current_order = 'asc';

    foreach ( $columns as $column_key => $column_display_name ) {
      $class = array( 'manage-column', "column-$column_key" );

      $style = '';
      if ( in_array( $column_key, $hidden ) )
        $style = 'display:none;';

      $style = ' style="' . $style . '"';

      if ( 'cb' == $column_key )
        $class[ ] = 'check-column';
      elseif ( in_array( $column_key, array( 'posts', 'comments', 'links' ) ) )
        $class[ ] = 'num';

      if ( isset( $sortable[ $column_key ] ) ) {
        list( $orderby, $desc_first ) = $sortable[ $column_key ];

        if ( $current_orderby == $orderby ) {
          $order = 'asc' == $current_order ? 'desc' : 'asc';
          $class[ ] = 'sorted';
          $class[ ] = $current_order;
        } else {
          $order = $desc_first ? 'desc' : 'asc';
          $class[ ] = 'sortable';
          $class[ ] = $desc_first ? 'asc' : 'desc';
        }

        $column_display_name = '<a href="' . esc_url( add_query_arg( compact( 'orderby', 'order' ), $current_url ) ) . '"><span>' . $column_display_name . '</span><span class="sorting-indicator"></span></a>';

      }

      $id = $with_id ? "id='$column_key'" : '';

      if ( !empty( $class ) )
        $class = "class='" . join( ' ', $class ) . "'";

      if ( 'cb' == $column_key )
        $column_display_name = '<input type="checkbox" class="check-all" />';

      echo "<th scope='col' $id $class $style>$column_display_name</th>";
    }
  }

}