PluginProbe
Independent Analytics – WordPress Analytics Plugin / 2.6.2
Independent Analytics – WordPress Analytics Plugin v2.6.2
2.15.5 2.15.4 2.15.3 2.15.2 2.15.1 2.15.0 2.14.10 trunk 1.1 1.10 1.10.1 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.17.1 1.17.2 1.17.3 1.17.4 1.18 1.18.1 1.19.0 All 120 releases
independent-analytics / IAWP / AJAX / Filter.php
Filter.php
108 lines 5.0 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace IAWP\AJAX;
4
5 use DateTime;
6 use IAWP\Chart;
7 use IAWP\Chart_Geo;
8 use IAWP\Date_Range\Date_Range;
9 use IAWP\Date_Range\Exact_Date_Range;
10 use IAWP\Date_Range\Relative_Date_Range;
11 use IAWP\Quick_Stats;
12 use IAWP\Statistics\Intervals\Intervals;
13 use IAWP\Tables\Table;
14 use IAWPSCOPED\Proper\Timezone;
15 use Throwable;
16 /** @internal */
17 class Filter extends \IAWP\AJAX\AJAX
18 {
19 protected function action_name() : string
20 {
21 return 'iawp_filter';
22 }
23 protected function action_required_fields() : array
24 {
25 return ['table_type', 'columns'];
26 }
27 protected function action_callback() : void
28 {
29 $date_range = $this->get_date_range();
30 $is_new_date_range = $this->get_field('is_new_date_range') === 'true';
31 $filters = $this->get_field('filters') ?? [];
32 $sort_column = $this->get_field('sort_column') ?? null;
33 $sort_direction = $this->get_field('sort_direction') ?? null;
34 $group = $this->get_field('group') ?? null;
35 $as_csv = $this->get_field('as_csv') ?? \false;
36 $is_new_group = $this->get_field('is_new_group') === 'true';
37 $chart_interval = $is_new_date_range ? Intervals::default_for($date_range->number_of_days()) : Intervals::find_by_id($this->get_field('chart_interval'));
38 $page = \intval($this->get_field('page') ?? 1);
39 $number_of_rows = $page * \IAWPSCOPED\iawp()->pagination_page_size();
40 $table_type = $this->get_field('table_type');
41 $is_geo_table = $table_type === 'geo';
42 $table_class = Table::get_table_by_type($this->get_field('table_type'));
43 if (\is_null($table_class)) {
44 return;
45 }
46 $table = new $table_class($group, $is_new_group);
47 $filters = $table->sanitize_filters($filters);
48 $sort_configuration = $table->sanitize_sort_parameters($sort_column, $sort_direction);
49 $rows_class = $table->group()->rows_class();
50 $statistics_class = $table->group()->statistics_class();
51 if ($as_csv) {
52 $rows_query = new $rows_class($date_range, null, $filters, $sort_configuration);
53 $rows = $rows_query->rows();
54 $csv = $table->csv($rows, \true);
55 echo $csv->to_string();
56 return;
57 }
58 if ($is_geo_table) {
59 $rows_query = new $rows_class($date_range, null, $filters, $sort_configuration);
60 } else {
61 $rows_query = new $rows_class($date_range, $number_of_rows, $filters, $sort_configuration);
62 }
63 $rows = $rows_query->rows();
64 if (empty($filters)) {
65 $statistics = new $statistics_class($date_range, null, $chart_interval);
66 } else {
67 $statistics = new $statistics_class($date_range, $rows_query, $chart_interval);
68 }
69 $total_number_of_rows = $statistics->total_number_of_rows();
70 if ($is_geo_table) {
71 $chart = new Chart_Geo($rows, $date_range->label());
72 $rows = \array_slice($rows, 0, $number_of_rows);
73 } else {
74 $chart = new Chart($statistics);
75 }
76 $table->set_statistics($statistics);
77 $quick_stats = new Quick_Stats($statistics);
78 \wp_send_json_success(['rows' => $table->get_rendered_template($rows, \true, $sort_configuration->column(), $sort_configuration->direction()), 'table' => $table->get_rendered_template($rows, \false, $sort_configuration->column(), $sort_configuration->direction()), 'totalNumberOfRows' => $total_number_of_rows, 'chart' => $chart->get_html(), 'stats' => $quick_stats->get_html(), 'label' => $date_range->label(), 'isLastPage' => \count($rows) < \IAWPSCOPED\iawp()->pagination_page_size() * $page, 'columns' => $table->visible_column_ids(), 'columnsHTML' => $table->column_picker_html(), 'groupId' => $table->group()->id(), 'filters' => $filters, 'filtersTemplateHTML' => $table->filters_template_html(), 'filtersButtonsHTML' => $table->filters_condition_buttons_html($filters), 'chartInterval' => $chart_interval->id()]);
79 }
80 /**
81 * Get the date range for the filter request
82 *
83 * The date info can be supplied in one of two ways.
84 *
85 * The first is to provide a relative_range_id which is converted into start, end, and label.
86 *
87 * The second is to provide explicit start and end fields which will be used as is.
88 *
89 * @return Date_Range
90 */
91 private function get_date_range() : Date_Range
92 {
93 $relative_range_id = $this->get_field('relative_range_id');
94 $start_timestamp = $this->get_field('exact_start');
95 $end_timestamp = $this->get_field('exact_end');
96 if (!\is_null($start_timestamp) && !\is_null($end_timestamp)) {
97 try {
98 $start = new DateTime($start_timestamp, Timezone::site_timezone());
99 $end = new DateTime($end_timestamp, Timezone::site_timezone());
100 return new Exact_Date_Range($start, $end);
101 } catch (Throwable $e) {
102 // Do nothing and fall back to default relative date range
103 }
104 }
105 return new Relative_Date_Range($relative_range_id);
106 }
107 }
108