db = &EL_Db::get_instance();
$this->categories = &EL_Categories::get_instance();
$this->filterbar = &EL_Filterbar::get_instance();
$this->set_args();
global $status, $page;
//Set parent defaults
parent::__construct(array(
'singular' => __('event','event-list'), //singular name of the listed records
'plural' => __('events','event-list'), //plural name of the listed records
'ajax' => false //does this table support ajax?
));
}
/** ************************************************************************
* This method is called when the parent class can't find a method
* specifically build for a given column.
*
* @param array $item A singular item (one full row's worth of data)
* @param array $column_name The name/slug of the column to be processed
* @return string Text or HTML to be placed inside the column
***************************************************************************/
protected function column_default($item, $column_name) {
switch($column_name) {
case 'date' :
return $this->format_event_date($item->start_date, $item->end_date, $item->time);
case 'details' :
return '
';
case 'pub_user' :
return get_userdata($item->pub_user)->user_login;
case 'pub_date' :
return $this->format_pub_date($item->pub_date);
case 'categories' :
return esc_html($this->categories->convert_db_string($item->$column_name));
default :
return esc_html($item->$column_name);
}
}
/** ************************************************************************
* This is a custom column method and is responsible for what is
* rendered in any column with a name/slug of 'title'.
*
* @see WP_List_Table::::single_row_columns()
* @param array $item A singular item (one full row's worth of data)
* @return string Text to be placed inside the column
(movie title only)
***************************************************************************/
protected function column_title($item) {
//Prepare Columns
$actions = array(
'edit' => ''.__('Edit','event-list').'',
'duplicate' => ''.__('Duplicate','event-list').'',
'delete' => ''.__('Delete','event-list').'');
//Return the title contents
return sprintf('%1$s(id:%2$s)%3$s',
esc_html($item->title),
$item->id,
$this->row_actions($actions));
}
/** ************************************************************************
* Required if displaying checkboxes or using bulk actions! The 'cb' column
* is given special treatment when columns are processed.
*
* @see WP_List_Table::::single_row_columns()
* @param array $item A singular item (one full row's worth of data)
* @return string Text to be placed inside the column
(movie title only)
***************************************************************************/
protected function column_cb($item) {
//Let's simply repurpose the table's singular label ("event")
//The value of the checkbox should be the record's id
return '';
}
/** ************************************************************************
* This method dictates the table's columns and titles. This should returns
* an array where the key is the column slug (and class) and the value is
* the column's title text.
*
* @see WP_List_Table::::single_row_columns()
* @return array An associative array containing column information: 'slugs'=>'Visible Titles'
***************************************************************************/
public function get_columns() {
return array(
'cb' => '', //Render a checkbox instead of text
'date' => __('Date','event-list'),
'title' => __('Title','event-list'),
'location' => __('Location','event-list'),
'details' => __('Details','event-list'),
'categories' => __('Categories','event-list'),
'pub_user' => __('Author','event-list'),
'pub_date' => __('Published','event-list')
);
}
/** ************************************************************************
* If you want one or more columns to be sortable (ASC/DESC toggle), you
* will need to register it here. This should return an array where the key
* is the column that needs to be sortable, and the value is db column to
* sort by.
*
* @return array An associative array containing all the columns that should be sortable: 'slugs'=>array('data_values',bool)
***************************************************************************/
public function get_sortable_columns() {
$sortable_columns = array(
'date' => array('date', true), //true means its already sorted
'title' => array('title', false),
'location' => array('location', false),
'pub_user' => array('pub_user', false),
'pub_date' => array('pub_date', false)
);
return $sortable_columns;
}
/** ************************************************************************
* Optional. If you need to include bulk actions in your list table, this is
* the place to define them. Bulk actions are an associative array in the format
* 'slug'=>'Visible Title'
* If this method returns an empty value, no bulk action will be rendered.
*
* @return array An associative array containing all the bulk actions: 'slugs'=>'Visible Titles'
****************************************************************************/
public function get_bulk_actions() {
$actions = array(
'delete_bulk' => __('Delete','event-list')
);
return $actions;
}
/** ************************************************************************
* Function to handle the process of the bulk actions.
*
* @see $this->prepare_items()
***************************************************************************/
private function process_bulk_action() {
//Detect when a bulk action is being triggered...
if('delete_bulk'===$this->current_action()) {
// Show confirmation window before deleting
echo '';
}
}
public function extra_tablenav($which) {
$out = '';
// add filter elements
if('top' === $which) {
$out = '
';
}
echo $out;
}
/** ************************************************************************
* In this function the data for the display is prepared.
*
* @param string $date_range Date range for displaying the events
* @uses $this->_column_headers
* @uses $this->items
* @uses $this->get_columns()
* @uses $this->get_sortable_columns()
* @uses $this->get_pagenum()
* @uses $this->set_pagination_args()
***************************************************************************/
public function prepare_items() {
$per_page = 20;
// define column headers
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array($columns, $hidden, $sortable);
// handle the bulk actions
$this->process_bulk_action();
// get the required event data
$data = $this->get_events();
// setup pagination
$current_page = $this->get_pagenum();
$total_items = count($data);
$data = array_slice($data, (($current_page-1)*$per_page), $per_page);
$this->set_pagination_args(array(
'total_items' => $total_items,
'per_page' => $per_page,
'total_pages' => ceil($total_items/$per_page)
));
// setup items which are used by the rest of the class
$this->items = $data;
}
private function set_args() {
$this->args = array('date_filter' => 'all',
'cat_filter' => 'all',
'sc_id_for_url' => '',
'actual_date' => isset($_GET['date']) ? $_GET['date'] : 'upcoming',
'actual_cat' => isset($_GET['cat']) ? $_GET['cat'] : 'all',
);
}
private function get_events() {
// define sort_array
$order = 'ASC';
if(isset($_GET['order']) && $_GET['order'] === 'desc') {
$order = 'DESC';
}
$orderby = '';
if(isset($_GET['orderby'])){
$orderby = $_GET['orderby'];
}
// set standard sort according date ASC, only when date should be sorted desc, DESC should be used
if($orderby == 'date' && $order == 'DESC') {
$sort_array = array('start_date DESC', 'time DESC', 'end_date DESC');
}
else {
$sort_array = array('start_date ASC', 'time ASC', 'end_date ASC');
}
// add primary order column to the front of the standard sort array
switch($orderby)
{
case 'title' :
array_unshift($sort_array, 'title '.$order);
break;
case 'location' :
array_unshift($sort_array, 'location '.$order);
break;
case 'pub_user' :
array_unshift($sort_array, 'pub_user '.$order);
break;
case 'pub_date' :
array_unshift($sort_array, 'pub_date '.$order);
break;
}
// get and return events in the correct order
return $this->db->get_events($this->args['actual_date'], $this->args['actual_cat'], 0, $sort_array);
}
/** ************************************************************************
* In this function the start date, the end date and time is formated for
* the output.
*
* @param string $start_date The start date of the event
* @param string $end_date The end date of the event
* @param string $time The start time of the event
***************************************************************************/
private function format_event_date($start_date, $end_date, $start_time) {
$out = '';
// start date
$out .= mysql2date(__('Y/m/d'), $start_date);
// end date for multiday event
if($start_date !== $end_date) {
$out .= ' - '.mysql2date(__('Y/m/d'), $end_date);
}
// event time
if('' !== $start_time) {
// set time format if a known format is available, else only show the text
$date_array = date_parse($start_time);
if(empty($date_array['errors']) && is_numeric($date_array['hour']) && is_numeric($date_array['minute'])) {
$start_time = mysql2date(get_option('time_format'), $start_time);
}
$out .= ' '.esc_html($start_time).'';
}
$out .= '';
return $out;
}
private function format_pub_date($pub_date) {
// similar output than for post or pages
$timestamp = strtotime($pub_date);
$time_diff = time() - $timestamp;
if($time_diff >= 0 && $time_diff < 24*60*60) {
$date = sprintf(__('%s ago','event-list'), human_time_diff($timestamp));
}
else {
$date = mysql2date(__('Y/m/d'), $pub_date);
}
$datetime = mysql2date(__('Y/m/d g:i:s A'), $pub_date);
return ''.$date.'';
}
}