plugin_name = $plugin_name; $this->version = $version; add_shortcode('ays_survey_submissions_summary', array($this, 'ays_generate_submissions_summary_method')); } public function ays_survey_get_data_by_survey_id( $attr ){ global $wpdb; $surveys_table = esc_sql( $wpdb->prefix . SURVEY_MAKER_DB_PREFIX . "surveys" ); $survey_id = (isset($attr['id']) && sanitize_text_field( $attr['id'] ) != '') ? absint( sanitize_text_field( $attr['id'] ) ) : null; if ( is_null( $survey_id ) ) { return null; } $results = array(); $sql = "SELECT * FROM " . $surveys_table . " WHERE id =" . absint( $survey_id ); $survey_name = $wpdb->get_row( $sql, 'ARRAY_A' ); if ( empty( $survey_name ) || is_null( $survey_name ) ) { return null; } // // For charts in summary $survey_question_results = Survey_Maker_Data::ays_survey_question_results_for_summary( $survey_id ); $question_results = $survey_question_results['questions']; $last_submission = Survey_Maker_Data::ays_survey_get_last_submission_id_for_summary( $survey_id ); $ays_survey_individual_questions = Survey_Maker_Data::ays_survey_individual_results_for_one_submission_for_summary( $last_submission, $survey_name ); if( empty( $ays_survey_individual_questions['sections'] ) ){ $question_results = array(); } $submission_count_and_ids = Survey_Maker_Data::get_submission_count_and_ids_for_summary( $survey_id ); wp_localize_script( $this->plugin_name . 'public-charts', 'aysSurveyPublicChartLangObj', array( 'answers' => __( 'Answers' , "survey-maker" ), 'percent' => __( 'Percent' , "survey-maker" ), 'count' => __( 'Count' , "survey-maker" ), ) ); $options = array( 'perAnswerData' => $question_results, 'surveyColor' => $this->options[ $this->name_prefix . 'color' ], 'sectionDescHtml' => $this->options[ $this->name_prefix . 'allow_html_in_section_description' ], ); $script = ''; $results = array( 'ays_survey_individual_questions' => $ays_survey_individual_questions, 'submission_count_and_ids' => $submission_count_and_ids, 'question_results' => $question_results, 'script' => $script, 'options' => $options, ); return $results; } /** * Register the stylesheets for the public-facing side of the site. * * @since 1.0.0 */ public function enqueue_styles() { /** * This function is provided for demonstration purposes only. * * An instance of this class should be passed to the run() function * defined in Survey_Maker_Loader as all of the hooks are defined * in that particular class. * * The Survey_Maker_Loader will then create the relationship * between the defined hooks and the functions defined in this * class. */ wp_enqueue_style( $this->plugin_name . "-public-submissions", SURVEY_MAKER_PUBLIC_URL . '/css/partials/survey-maker-public-submissions.css', array(), $this->version, 'all' ); } /** * Register the JavaScript for the public-facing side of the site. * * @since 1.0.0 */ public function enqueue_scripts(){ /** * This function is provided for demonstration purposes only. * * An instance of this class should be passed to the run() function * defined in Survey_Maker_Loader as all of the hooks are defined * in that particular class. * * The Survey_Maker_Loader will then create the relationship * between the defined hooks and the functions defined in this * class. */ wp_enqueue_script( $this->plugin_name . 'public-charts-google', SURVEY_MAKER_ADMIN_URL . '/js/google-chart.js', array('jquery'), $this->version, true); wp_enqueue_script( $this->plugin_name . 'public-charts', SURVEY_MAKER_PUBLIC_URL . '/js/partials/survey-maker-public-submissions-charts.js', array('jquery'), $this->version, true); } public function ays_submissions_summary_html( $attr ){ $content = array(); $results = $this->ays_survey_get_data_by_survey_id( $attr ); if( $results === null ){ $content = "

" . __( "There are no questions atteched yet.", "survey-maker" ) . "

"; return $content; } $ays_survey_individual_questions = $results['ays_survey_individual_questions']; $submission_count_and_ids = $results['submission_count_and_ids']; $question_results = $results['question_results']; $script = $results['script']; // Allow HTML in description $survey_allow_html_in_section_description = (isset($results['options'][ 'sectionDescHtml' ]) && $results['options'][ 'sectionDescHtml' ] == 'on') ? true : false; $text_types = array( 'text', 'short_text', 'number', 'phone', 'name', 'email', 'date', 'time', ); $content[] = '
'; $content[] = '
'; $content[] = '
'; $content[] = sprintf( __( 'In total %s submission', "survey-maker" ), intval( $submission_count_and_ids['submission_count'] ) ); $content[] = '
'; $content[] = '
'; if( is_array( $ays_survey_individual_questions['sections'] ) ): foreach ($ays_survey_individual_questions['sections'] as $section_key => $section): $content[] = '
'; $content[] = '
'; $content[] = '
' . $section['title'] . '
'; $content[] = '
' . ($survey_allow_html_in_section_description) ? strip_tags(htmlspecialchars_decode($section['description'] )) : nl2br( $section['description'] ) . '
'; $content[] = '
'; foreach ( $section['questions'] as $q_key => $question ): $content[] = '
'; $content[] = '
'; $content[] = '
'; $content[] = '
' . nl2br( $question_results[ $question['id'] ]['question'] ) . '
'; $content[] = '
' . $question_results[ $question['id'] ]['sum_of_answers_count'] . ' ' . __( 'submissions', "survey-maker" ) . '
'; $content[] = '
'; $content[] = '
'; $content[] = '
'; if( in_array( $question_results[ $question['id'] ]['question_type'], $text_types ) && $question_results[ $question['id'] ]['question_type'] != 'date' && $question_results[ $question['id'] ]['question_type'] != 'time' ): $content[] = '
'; if( isset( $question_results[ $question['id'] ]['answers'] ) && !empty( $question_results[ $question['id'] ]['answers'] ) ): if( isset( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) && !empty( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) ): $filtered_text_answers = array_values(array_unique($question_results[ $question['id'] ]['answers'][ $question['id'] ])); foreach( $filtered_text_answers as $aid => $answer ): $text_answer_count = isset($question_results[ $question['id'] ]['sum_of_same_answers'][$answer]) && $question_results[ $question['id'] ]['sum_of_same_answers'][$answer] != "" ? $question_results[ $question['id'] ]['sum_of_same_answers'][$answer] : ""; $content[] = '
'. nl2br( htmlentities($answer) ) .'
'. nl2br( $text_answer_count ) .'
'; endforeach; endif; endif; $content[] = '
'; elseif( $question_results[ $question['id'] ]['question_type'] == 'date' ): $content[] = '
'; $content[] = '
'; if( isset( $question_results[ $question['id'] ]['answers'] ) && !empty( $question_results[ $question['id'] ]['answers'] ) ){ if( isset( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) && !empty( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) ){ $dates_array = array(); foreach( $question_results[ $question['id'] ]['answers'][ $question['id'] ] as $aid => $answer ){ $year_month = explode( '-', $answer ); $day = $year_month[2]; if( isset( $dates_array[ $year_month[0] ] ) ){ if( isset( $dates_array[ $year_month[0] ][ $year_month[1] ] ) ){ if( isset( $dates_array[ $year_month[0] ][ $year_month[1] ][ $year_month[2] ] ) ){ $dates_array[ $year_month[0] ][ $year_month[1] ][ $year_month[2] ] += 1; }else{ $dates_array[ $year_month[0] ][ $year_month[1] ][ $year_month[2] ] = 1; } }else{ $dates_array[ $year_month[0] ][ $year_month[1] ][ $year_month[2] ] = 1; } }else{ $dates_array[ $year_month[0] ][ $year_month[1] ][ $year_month[2] ] = 1; } } ksort( $dates_array, SORT_NATURAL ); foreach( $dates_array as $year => $months ){ ksort( $months, SORT_NATURAL ); foreach( $months as $month => $days ){ ksort( $days, SORT_NATURAL ); } } foreach( $dates_array as $year => $months ){ foreach( $months as $month => $days ){ $content[] = '
'; $content[] = '
' . date_i18n( 'F Y', strtotime( $year ."-". $month ) ) . '
'; $content[] = '
'; $content[] = '
'; foreach( $days as $day => $count ){ if( $count == 1 ){ $content[] = '
'; $content[] = '' . esc_html( $day ). ''; $content[] = '
'; }else{ $content[] = '
'; $content[] = '' . esc_html( $day ) . ''; $content[] = '
' . esc_html( $count ) . '
'; $content[] = '
'; } } $content[] = '
'; $content[] = '
'; $content[] = '
'; } } } } $content[] = '
'; $content[] = '
'; elseif( $question_results[ $question['id'] ]['question_type'] == 'time' ): $content[] = '
'; $content[] = '
'; if( isset( $question_results[ $question['id'] ]['answers'] ) && !empty( $question_results[ $question['id'] ]['answers'] ) ){ if( isset( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) && !empty( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) ){ $hours_array = array(); foreach( $question_results[ $question['id'] ]['answers'][ $question['id'] ] as $aid => $answer ){ $answer_hour_minutes = explode( ':', $answer ); $answer_hour = isset($answer_hour_minutes[0]) && $answer_hour_minutes[0] != "" ? esc_attr($answer_hour_minutes[0]) : "00"; $answer_minute = isset($answer_hour_minutes[1]) && $answer_hour_minutes[1] != "" ? esc_attr($answer_hour_minutes[1]) : "00"; if( isset( $hours_array[ $answer_hour ] ) ){ if( isset( $hours_array[ $answer_hour ][ $answer_minute ] ) ){ $hours_array[ $answer_hour ][ $answer_minute ] += 1; }else{ $hours_array[ $answer_hour ][ $answer_minute ] = 1; } }else{ $hours_array[ $answer_hour ][ $answer_minute ] = 1; } } ksort($hours_array); foreach( $hours_array as $k_hours => $v_hours ){ $content[] = '
'; $content[] = '
'.$k_hours.' :
'; $content[] = '
'; $content[] = '
'; foreach( $v_hours as $k_hour => $count ){ if( $count == 1 ){ $content[] = '
'. esc_html( $k_hour ) .'
'; }else{ $content[] = '
'. esc_html( $k_hour ) .'
'. esc_html( $count ) .'
'; $content[] = '
'; } } $content[] = '
'; $content[] = '
'; $content[] = '
'; } } } $content[] = '
'; $content[] = '
'; elseif( $question_results[ $question['id'] ]['question_type'] == 'date_time' ): $content[] = '
'; $content[] = '
'; if( isset( $question_results[ $question['id'] ]['answers'] ) && !empty( $question_results[ $question['id'] ]['answers'] ) ){ if( isset( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) && !empty( $question_results[ $question['id'] ]['answers'][ $question['id'] ] ) ){ $dates_array = array(); $time_array = array(); foreach( $question_results[ $question['id'] ]['answers'][ $question['id'] ] as $aid => $answer ){ $each_answer = explode(" " , trim($answer)); $date_answer = isset($each_answer[0]) && $each_answer[0] != '' ? $each_answer[0] : ''; $time_answer = isset($each_answer[1]) && $each_answer[1] != '' ? $each_answer[1] : ''; if($time_answer != '-' || $date_answer != '-'){ $year_month_day = $date_answer != '-' ? explode( '-', $date_answer ) : '-'; $dates_collected = ''; if($year_month_day != '-'){ $dates_collected = date_i18n( 'F Y d', strtotime( $year_month_day[0] ."-". $year_month_day[1] . "-". $year_month_day[2] ) ); } $dates_array[] = $dates_collected; $time_array[$dates_collected][] = $time_answer; $dates_new_array = array_count_values($dates_array); } } if(!empty($dates_array)){ foreach($dates_new_array as $new_date => $new_date_value){ $content[] = '
'; $content[] = '
'; $content[] = '
'; if( $new_date_value == 1 ){ $style_for_one_submission = (!$new_date) ? 'style="background-color: white;"' : ''; $content[] = '
'; $content[] = ''.esc_html( $new_date ).''; $content[] = '
'; }elseif($new_date != ''){ $content[] = '
'; $content[] = ''; $content[] = '
'.esc_html( $new_date_value ).'
'; $content[] = '
'; } $content[] = '
'; $content[] = '
'; $content[] = '
'; foreach($time_array[$new_date] as $f => $r){ if($r != '' && $r != '-'){ $content[] = ''.$r.''; } } $content[] = '
'; $content[] = '
'; } } } } $content[] = '
'; $content[] = '
'; else: $content[] = '
'; if( !empty( $question_results[ $question['id'] ]['otherAnswers'] ) ): $content[] = '
' . __( '"Other" answers', "survey-maker" ) . '
'; $content[] = '
'; if( isset( $question_results[ $question['id'] ]['otherAnswers'] ) && !empty( $question_results[ $question['id'] ]['otherAnswers'] ) ): $filtered_other_answers = array_values(array_unique($question_results[ $question['id'] ]['otherAnswers'])); foreach( $filtered_other_answers as $aid => $answer ): $other_answer_count = isset($question_results[ $question['id'] ]['same_other_count'][$answer]) && $question_results[ $question['id'] ]['same_other_count'][$answer] != "" ? $question_results[ $question['id'] ]['same_other_count'][$answer] : ""; $content[] = '
' . stripslashes(htmlentities($answer)) . '
' . stripslashes($other_answer_count) . '
'; endforeach; endif; $content[] = '
'; endif; endif; $content[] = '
'; $content[] = '
'; endforeach; $content[] = '
'; endforeach; endif; $content[] = $this->get_styles(); $content[] = $script; $content[] = '
'; $content = implode( '', $content ); return $content; } public function get_styles(){ $content = array(); $content[] = ''; $content = implode( '', $content ); return $content; } public function ays_generate_submissions_summary_method( $attr ) { global $post; $allow = false; // Check post author's capability if ( isset( $post->post_author ) ) { $author_id = (int) $post->post_author; $author = get_user_by( 'id', $author_id ); if ( $author && user_can( $author, 'manage_options' ) ) { $allow = true; } } // Check current logged-in user's capability if ( is_user_logged_in() && current_user_can( 'manage_options' ) ) { $allow = true; } // If neither author nor current user can manage options — stop rendering if ( ! $allow ) { return str_replace(array("\r\n", "\n", "\r"), '', ''); } $id = (isset($attr['id']) && $attr['id'] != '') ? absint(intval($attr['id'])) : null; $this->default_texts = Survey_Maker_Data::ays_set_default_texts( $this->plugin_name, array() ); if (is_null($id)) { $content = "

" . $this->default_texts['wrongShortcode'] . "

"; return str_replace(array("\r\n", "\n", "\r"), '', $content); } $this->enqueue_styles(); $this->enqueue_scripts(); $unique_id = uniqid(); $this->unique_id = $unique_id; $this->unique_id_in_class = $id . "-" . $unique_id; $survey = Survey_Maker_Data::get_survey_by_id( $id ); $this->options = Survey_Maker_Data::get_survey_validated_data_from_array( $survey, $attr ); $content = $this->ays_submissions_summary_html( $attr ); return str_replace(array("\r\n", "\n", "\r"), "\n", $content); } }