plugin_name = $plugin_name;
$this->title_length = Survey_Maker_Data::get_listtables_title_length('submissions');
parent::__construct( array(
'singular' => __( 'Submissions', "survey-maker" ), //singular name of the listed records
'plural' => __( 'Submissions', "survey-maker" ), //plural name of the listed records
'ajax' => false //does this table support ajax?
) );
add_action( 'admin_notices', array( $this, 'submissions_notices' ) );
}
/**
* Override of table nav to avoid breaking with bulk actions & according nonce field
*/
public function display_tablenav( $which ) {
?>
bulk_actions( $which ); ?>
extra_tablenav( $which );
$this->pagination( $which );
?>
prefix . SURVEY_MAKER_DB_PREFIX . "survey_categories AS s
WHERE s.status = 'published'";
$cat_titles = $wpdb->get_results($titles_sql);
$cat_id = null;
if( isset( $_GET['filterby'] )){
$cat_id = absint( sanitize_text_field( $_GET['filterby'] ) );
}
$categories_select = array();
foreach($cat_titles as $key => $cat_title){
$selected = "";
if($cat_id === intval($cat_title->id)){
$selected = "selected";
}
$categories_select[$cat_title->id]['title'] = $cat_title->title;
$categories_select[$cat_title->id]['selected'] = $selected;
$categories_select[$cat_title->id]['id'] = $cat_title->id;
}
sort($categories_select);
?>
$cat_title){
echo "".esc_attr($cat_title['title'])." ";
}
?>
prefix . SURVEY_MAKER_DB_PREFIX . "surveys";
$sql .= self::get_where_condition();
if ( ! empty( $_REQUEST['orderby'] ) ) {
$order_by = ( isset( $_REQUEST['orderby'] ) && sanitize_text_field( $_REQUEST['orderby'] ) != '' ) ? sanitize_text_field( $_REQUEST['orderby'] ) : 'id';
$order_by .= ( ! empty( $_REQUEST['order'] ) && strtolower( $_REQUEST['order'] ) == 'asc' ) ? ' ASC' : ' DESC';
$sql_orderby = sanitize_sql_orderby( $order_by );
if ( $sql_orderby ) {
$sql .= ' ORDER BY ' . $sql_orderby;
} else {
$sql .= ' ORDER BY id DESC';
}
}else{
$sql .= ' ORDER BY id DESC';
}
$sql .= " LIMIT $per_page";
$sql .= ' OFFSET ' . ( $page_number - 1 ) * $per_page;
$result = $wpdb->get_results( $sql, 'ARRAY_A' );
return $result;
}
public static function get_where_condition(){
global $wpdb;
$where = array();
$sql = '';
// $search = ( isset( $_REQUEST['s'] ) ) ? esc_sql( $_REQUEST['s'] ) : false;
// if( $search ){
// $s = array();
// $s[] = ' `user_name` LIKE \'%'.$search.'%\' ';
// $s[] = ' `user_email` LIKE \'%'.$search.'%\' ';
// $s[] = ' `user_phone` LIKE \'%'.$search.'%\' ';
// $s[] = ' `score` LIKE \'%'.$search.'%\' ';
// $where[] = ' ( ' . implode(' OR ', $s) . ' ) ';
// }
// if(isset( $_REQUEST['fstatus'] )){
// $fstatus = intval($_REQUEST['fstatus']);
// switch($fstatus){
// case 0:
// $where[] = ' `read` = 0 ';
// break;
// case 1:
// $where[] = ' `read` = 1 ';
// break;
// }
// }
if(! empty( $_REQUEST['filterby'] ) && intval( $_REQUEST['filterby'] ) > 0){
$cat_id = intval( sanitize_text_field( $_REQUEST['filterby'] ) );
$where[] = ' FIND_IN_SET( "'.$cat_id.'", `category_ids` ) ';
}
if( isset( $_REQUEST['wpuser'] ) ){
$user_id = absint( sanitize_text_field( $_REQUEST['wpuser'] ) );
$where[] = ' `user_id` = '.$user_id.' ';
}
if( isset( $_REQUEST['survey'] ) ){
$quiz_id = absint( sanitize_text_field( $_REQUEST['survey'] ) );
$where[] = ' `survey_id` = '.$quiz_id.' ';
}
if( isset( $_REQUEST['s'] ) && $_REQUEST['s'] != "" ){
$each_survey = sanitize_text_field( $_REQUEST['s'] );
$do_search = ( $each_survey ) ? sprintf( " title LIKE '%%%s%%' ", esc_sql( $wpdb->esc_like( $each_survey ) ) ) : '';
$where[] = $do_search;
}
$where[] = ' `status` != "trashed" ';
if( ! empty($where) ){
$sql = " WHERE " . implode( " AND ", $where );
}
return $sql;
}
public static function get_report_by_quiz_id( $quiz_id ){
global $wpdb;
$sql = "SELECT * FROM " . $wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "survey_categories WHERE quiz_id=" . absint( $quiz_id );
$result = $wpdb->get_row($sql, 'ARRAY_A');
return $result;
}
public function get_report_by_id( $id ){
global $wpdb;
$sql = "SELECT * FROM {$wpdb->prefix}aysquiz_reports WHERE id=" . absint( $id );
$result = $wpdb->get_row($sql, 'ARRAY_A');
return $result;
}
public function get_reports_titles(){
global $wpdb;
$sql = "SELECT id, title FROM {$wpdb->prefix}aysquiz_quizes";
$result = $wpdb->get_results($sql, 'ARRAY_A');
return $result;
}
public static function get_results_dates($quiz_id){
global $wpdb;
$sql = "SELECT MIN(DATE(`end_date`)) AS `min_date`, MAX(DATE(`end_date`)) AS `max_date`
FROM {$wpdb->prefix}aysquiz_reports
WHERE YEAR(DATE(`end_date`)) > 2000 ";
if($quiz_id !== 0){
$sql .= " AND quiz_id = ". absint( $quiz_id ) ." ";
}
$result = $wpdb->get_row($sql, 'ARRAY_A');
return $result;
}
public function ays_see_all_results(){
global $wpdb;
$sql = "UPDATE {$wpdb->prefix}aysquiz_reports SET `read`=1";
$wpdb->get_results($sql, 'ARRAY_A');
}
/**
* Delete a customer record.
*
* @param int $id customer ID
*/
public static function delete_items( $id ) {
global $wpdb;
$wpdb->delete(
$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions",
array( 'survey_id' => $id ),
array( '%d' )
);
$wpdb->delete(
$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions_questions",
array( 'survey_id' => $id ),
array( '%d' )
);
}
/**
* Returns the count of records in the database.
*
* @return null|string
*/
public static function record_count() {
global $wpdb;
$sql = "SELECT COUNT(*) FROM " . $wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "surveys WHERE status != 'trashed'";
if( isset( $_GET['filterby'] ) && intval(sanitize_text_field($_GET['filterby'])) > 0){
$cat_id = intval( sanitize_text_field( $_GET['filterby'] ) );
$sql .= '&& FIND_IN_SET('.$cat_id.',category_ids) ';
}
if( isset( $_REQUEST['s'] ) && $_REQUEST['s'] != "" ){
$each_survey = sanitize_text_field( $_REQUEST['s'] );
$do_search = ( $each_survey ) ? sprintf( " title LIKE '%%%s%%' ", esc_sql( $wpdb->esc_like( $each_survey ) ) ) : '';
$sql .= 'AND '.$do_search;
}
return $wpdb->get_var( $sql );
}
public static function unread_records_count( $id ) {
global $wpdb;
$sql = "SELECT COUNT(*)
FROM ".$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions " . "
WHERE ( `read` = 0 OR `read` = 2 ) AND survey_id=".absint( $id );
// $sql = "SELECT COUNT(*) FROM {$wpdb->prefix}aysquiz_reports WHERE `read` = 0;";
return $wpdb->get_var( $sql );
}
public static function record_complete_filter_count() {
global $wpdb;
$sql = "SELECT COUNT(*) FROM (SELECT DISTINCT `quiz_id` FROM {$wpdb->prefix}aysquiz_reports ) AS quiz_ids";
return $wpdb->get_var( $sql );
}
/** Text displayed when no customer data is available */
public function no_items() {
Survey_Maker_Data::survey_no_items_list_tables();
}
/**
* Render a column when no column specific method exist.
*
* @param array $item
* @param string $column_name
*
* @return mixed
*/
public function column_default( $item, $column_name ) {
switch ( $column_name ) {
case 'quiz_title':
case 'quiz_rate':
case 'score':
case 'user_count':
case 'unreads':
case 'category_ids':
case 'last_sub_date':
case 'id':
return $item[ $column_name ];
break;
default:
return print_r( $item, true ); //Show the whole array for troubleshooting purposes
}
}
/**
* Render the bulk edit checkbox
*
* @param array $item
*
* @return string
*/
function column_cb( $item ) {
return sprintf(
' ', $item['id']
);
}
/**
* Method for name column
*
* @param array $item an array of DB data
*
* @return string
*/
function column_title( $item ) {
global $wpdb;
$delete_nonce = wp_create_nonce( $this->plugin_name . '-delete-result' );
$survey_title = stripcslashes( $item['title'] );
$q = esc_attr( $survey_title );
$restitle = Survey_Maker_Admin::ays_restriction_string( "word", $survey_title, $this->title_length );
$restitle = esc_attr($restitle);
$result = $this->unread_records_count( $item['id'] );
if( intval( $result ) > 0 ){
$title = sprintf( '%s ', $this->plugin_name."-each-submission", absint( $item['id'] ), $q, $restitle, 0 );
}else{
$title = sprintf( '%s ', $this->plugin_name."-each-submission", absint( $item['id'] ), $q, $restitle );
}
// $title = sprintf( '%s ', $this->plugin_name."-each-submission", absint( $item['id'] ), $restitle, absint( $item['id'] ));
$actions = array(
'view_details' => sprintf( '%s ', $this->plugin_name."-each-submission", absint( $item['id'] ), __('View details', "survey-maker")),
'delete' => sprintf( 'Delete ', $restitle."'s submissions", sanitize_text_field( $_REQUEST['page'] ), 'delete', absint( $item['id'] ), $delete_nonce, __( 'Delete all submissions of this survey', "survey-maker" ) )
);
return $title . $this->row_actions( $actions );
}
function column_quiz_rate( $item ) {
global $wpdb;
$sql = "SELECT AVG(`score`) AS avg_score FROM {$wpdb->prefix}aysquiz_rates WHERE quiz_id=". absint( $item['id'] );
$result = $wpdb->get_var($sql);
if($result == null){
return;
}
$res = round($result,1);
return $res;
}
function column_score($item){
global $wpdb;
$sql = "SELECT AVG(`score`) AS avg_score FROM {$wpdb->prefix}aysquiz_reports WHERE quiz_id=". absint( $item['id'] );
$result = $wpdb->get_var($sql);
if($result == null){
return;
}
$res = round($result,2)."%";
return $res;
}
function column_user_count($item) {
global $wpdb;
$sql = "SELECT COUNT(*)
FROM ".$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions" . "
WHERE survey_id=". absint( $item['id'] );
$result = $wpdb->get_var($sql);
return $result;
}
function column_unreads($item) {
global $wpdb;
$sql = "SELECT COUNT(*)
FROM ".$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions " . "
WHERE ( `read` = 0 OR `read` = 2 ) AND survey_id=". absint( $item['id'] );
$q = intval( $wpdb->get_var( $sql ) );
if($q != 0){
$q = "$q
";
}
return $q;
}
function column_last_sub_date($item) {
global $wpdb;
$survey_id = isset($item['id']) && $item['id'] != "" ? $item['id'] : false;
$submissions_table = $wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions";
$res = '';
if($survey_id){
$sql = "SELECT submission_date
FROM ".$submissions_table."
WHERE survey_id=". absint( $survey_id ) ." ORDER BY id DESC LIMIT 1";
$res = $wpdb->get_var( $sql );
}
return $res;
}
function column_category_ids( $item ) {
global $wpdb;
// Survey categories IDs
$category_ids = isset( $item['category_ids'] ) && $item['category_ids'] != '' ? $item['category_ids'] : '';
if( ! empty( $category_ids ) ){
$sql = "SELECT id,title FROM " . $wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "survey_categories WHERE id IN (" . esc_sql( $category_ids ) . ")";
$results = $wpdb->get_results($sql, 'ARRAY_A');
$category_location = array();
foreach ($results as $key => $value) {
$category_location[] = sprintf( '%s ', 'survey-maker-survey-categories', 'edit', $value['id'], $value['title']);
}
$titles = implode( ', ', $category_location );
return $titles;
}
return '-';
}
/**
* Associative array of columns
*
* @return array
*/
function get_columns() {
$columns = array(
'cb' => ' ',
'title' => __( 'Survey', "survey-maker" ),
// 'quiz_rate' => __( 'Average Rate', "survey-maker" ),
// 'score' => __( 'Average Score', "survey-maker" ),
'user_count' => __( 'Passed Users Count', "survey-maker" ),
'unreads' => __( 'Unread results', "survey-maker" ),
'category_ids' => __( 'Categories', "survey-maker" ),
'last_sub_date' => __( 'Last submission date', "survey-maker" ),
'id' => __( 'ID', "survey-maker" ),
);
return $columns;
}
/**
* Columns to make sortable.
*
* @return array
*/
public function get_sortable_columns() {
$sortable_columns = array(
'quiz_title' => array( 'title', true ),
'id' => array( 'id', true ),
);
return $sortable_columns;
}
/**
* Returns an associative array containing the bulk action
*
* @return array
*/
public function get_bulk_actions() {
$actions = array(
'mark-as-read' => __( 'Mark as read', "survey-maker"),
'mark-as-unread' => __( 'Mark as unread', "survey-maker"),
'bulk-delete' => __( 'Delete', "survey-maker"),
);
return $actions;
}
/**
* Handles data query and filter, sorting, and pagination.
*/
public function prepare_items() {
$this->_column_headers = $this->get_column_info();
/** Process bulk action */
$this->process_bulk_action();
$per_page = $this->get_items_per_page('survey_submissions_results_per_page', 20);
$current_page = $this->get_pagenum();
$total_items = self::record_count();
// if(! empty( $_REQUEST['orderby'] ) && $_REQUEST['orderby'] == 'quiz_complete' ){
// $total_items = self::record_complete_filter_count();
// }
$this->set_pagination_args(array(
'total_items' => $total_items, //WE have to calculate the total number of items
'per_page' => $per_page //WE have to determine how many items to show on a page
));
$this->items = self::get_items( $per_page, $current_page );
}
public function process_bulk_action() {
//Detect when a bulk action is being triggered...
$message = 'deleted';
if ( 'delete' === $this->current_action() ) {
// In our file that handles the request, verify the nonce.
$nonce = sanitize_text_field( $_REQUEST['_wpnonce'] );
if ( ! wp_verify_nonce( $nonce, $this->plugin_name . '-delete-result' ) ) {
die( 'Go get a life script kiddies' );
} else {
self::delete_items( absint( sanitize_text_field($_GET['item']) ) );
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$url = esc_url_raw( remove_query_arg(array('action', 'survey', '_wpnonce') ) ) . '&status=' . $message;
wp_redirect( $url );
}
}
// If the delete bulk action is triggered
if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'bulk-delete' )
|| ( isset( $_POST['action2'] ) && $_POST['action2'] == 'bulk-delete' )
) {
$delete_ids = ( isset( $_POST['bulk-delete'] ) && ! empty( $_POST['bulk-delete'] ) ) ? esc_sql( $_POST['bulk-delete'] ) : array();
// loop over the array of record IDs and delete them
foreach ( $delete_ids as $id ) {
self::delete_items( $id );
}
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$url = esc_url_raw( remove_query_arg(array('action', 'survey', '_wpnonce') ) ) . '&status=' . $message;
wp_redirect( $url );
}
// If the mark-as-read bulk action is triggered
if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'mark-as-read' ) || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'mark-as-read' ) ) {
$delete_ids = ( isset( $_POST['bulk-delete'] ) && ! empty( $_POST['bulk-delete'] ) ) ? esc_sql( $_POST['bulk-delete'] ) : array();
// loop over the array of record IDs and delete them
foreach ( $delete_ids as $id ) {
self::mark_as_read_reports( $id );
}
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$url = esc_url_raw( remove_query_arg(array('action', 'item', '_wpnonce') ) );
$message = 'marked-as-read';
$url = add_query_arg( array(
'status' => $message,
'ays_survey_tab' => 'poststuff',
), $url );
wp_redirect( $url );
}
// If the mark-as-unread bulk action is triggered
if ( ( isset( $_POST['action'] ) && $_POST['action'] == 'mark-as-unread' ) || ( isset( $_POST['action2'] ) && $_POST['action2'] == 'mark-as-unread' ) ) {
$delete_ids = ( isset( $_POST['bulk-delete'] ) && ! empty( $_POST['bulk-delete'] ) ) ? esc_sql( $_POST['bulk-delete'] ) : array();
// loop over the array of record IDs and delete them
foreach ( $delete_ids as $id ) {
self::mark_as_unread_reports( $id );
}
// esc_url_raw() is used to prevent converting ampersand in url to "#038;"
// add_query_arg() return the current url
$url = esc_url_raw( remove_query_arg(array('action', 'item', '_wpnonce') ) );
$message = 'marked-as-unread';
$url = add_query_arg( array(
'status' => $message,
'ays_survey_tab' => 'poststuff',
), $url );
wp_redirect( $url );
}
}
public function results_notices(){
$status = (isset($_REQUEST['status'])) ? sanitize_text_field( $_REQUEST['status'] ) : '';
if ( empty( $status ) )
return;
if ( 'created' == $status )
$updated_message = __( 'Quiz created.', "survey-maker" );
elseif ( 'updated' == $status )
$updated_message = __( 'Quiz saved.', "survey-maker" );
elseif ( 'deleted' == $status )
$updated_message = __( 'Quiz deleted.', "survey-maker" );
if ( empty( $updated_message ) )
return;
?>
update(
$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions",
array('read' => 1),
array('survey_id' => intval($id)),
array('%d'),
array('%d')
);
}
/**
* Mark as unread a customer record.
*
* @param int $id customer ID
*/
public static function mark_as_unread_reports( $id ) {
global $wpdb;
$wpdb->update(
$wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "submissions",
array('read' => 2),
array('survey_id' => $id),
array('%d'),
array('%d')
);
}
}