1<?php 2/** 3 * Matomo - free/libre analytics platform 4 * 5 * @link https://matomo.org 6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later 7 * 8 */ 9namespace Piwik\Plugins\DBStats\Reports; 10 11use Piwik\Metrics\Formatter; 12use Piwik\Option; 13use Piwik\Piwik; 14use Piwik\Plugin\ViewDataTable; 15use Piwik\Plugins\CoreVisualizations\Visualizations\Graph; 16use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable; 17use Piwik\Plugins\DBStats\DBStats; 18 19abstract class Base extends \Piwik\Plugin\Report 20{ 21 public function isEnabled() 22 { 23 return Piwik::hasUserSuperUserAccess(); 24 } 25 26 public function configureReportMetadata(&$availableReports, $info) 27 { 28 // DBStats is not supposed to appear in report metadata 29 } 30 31 protected function addBaseDisplayProperties(ViewDataTable $view) 32 { 33 $view->requestConfig->filter_sort_column = 'label'; 34 $view->requestConfig->filter_sort_order = 'desc'; 35 $view->requestConfig->filter_limit = 25; 36 37 $view->config->show_exclude_low_population = false; 38 $view->config->show_table_all_columns = false; 39 $view->config->show_tag_cloud = false; 40 $view->config->show_search = false; 41 42 if ($view->isViewDataTableId(HtmlTable::ID)) { 43 $view->config->keep_summary_row = true; 44 $view->config->disable_row_evolution = true; 45 $view->config->highlight_summary_row = true; 46 } 47 48 if ($view->isViewDataTableId(Graph::ID)) { 49 $view->config->show_series_picker = false; 50 } 51 52 $view->config->addTranslations(array( 53 'label' => Piwik::translate('DBStats_Table'), 54 'year' => Piwik::translate('Intl_PeriodYear'), 55 'data_size' => Piwik::translate('DBStats_DataSize'), 56 'index_size' => Piwik::translate('DBStats_IndexSize'), 57 'total_size' => Piwik::translate('DBStats_TotalSize'), 58 'row_count' => Piwik::translate('DBStats_RowCount'), 59 'percent_total' => '% ' . Piwik::translate('DBStats_DBSize'), 60 'estimated_size' => Piwik::translate('DBStats_EstimatedSize') 61 )); 62 } 63 64 protected function addPresentationFilters(ViewDataTable $view, $addTotalSizeColumn = true, $addPercentColumn = false, 65 $sizeColumns = array('data_size', 'index_size')) 66 { 67 // add total_size column 68 if ($addTotalSizeColumn) { 69 $getTotalTableSize = function ($dataSize, $indexSize) { 70 return $dataSize + $indexSize; 71 }; 72 73 $view->config->filters[] = array('ColumnCallbackAddColumn', 74 array(array('data_size', 'index_size'), 'total_size', $getTotalTableSize), $isPriority = true); 75 76 $sizeColumns[] = 'total_size'; 77 } 78 79 $runPrettySizeFilterBeforeGeneric = false; 80 81 if ($view->isViewDataTableId(HtmlTable::ID)) { 82 83 // add summary row only if displaying a table 84 $view->config->filters[] = array('AddSummaryRow', Piwik::translate('General_Total')); 85 86 // add percentage column if desired 87 if ($addPercentColumn 88 && $addTotalSizeColumn 89 ) { 90 $view->config->filters[] = array( 91 'ColumnCallbackAddColumnPercentage', 92 array('percent_total', 'total_size', 'total_size', $quotientPrecision = 0, 93 $shouldSkipRows = false, $getDivisorFromSummaryRow = true), 94 $isPriority = false 95 ); 96 97 $view->requestConfig->filter_sort_column = 'percent_total'; 98 } 99 100 } else if ($view->isViewDataTableId(Graph::ID)) { 101 if ($addTotalSizeColumn) { 102 $view->config->columns_to_display = array('label', 'total_size'); 103 104 // when displaying a graph, we force sizes to be shown as the same unit so axis labels 105 // will be readable. NOTE: The unit should depend on the smallest value of the data table, 106 // however there's no way to know this information, short of creating a custom filter. For 107 // now, just assume KB. 108 $fixedMemoryUnit = 'K'; 109 $view->config->y_axis_unit = ' K'; 110 $view->requestConfig->filter_sort_column = 'total_size'; 111 $view->requestConfig->filter_sort_order = 'desc'; 112 } else { 113 $view->config->columns_to_display = array('label', 'row_count'); 114 $view->config->y_axis_unit = ' ' . Piwik::translate('General_Rows'); 115 116 $view->requestConfig->filter_sort_column = 'row_count'; 117 $view->requestConfig->filter_sort_order = 'desc'; 118 } 119 $view->config->selectable_rows = array(); 120 } 121 122 $formatter = new Formatter(); 123 124 $getPrettySize = array($formatter, 'getPrettySizeFromBytes'); 125 $params = !isset($fixedMemoryUnit) ? array() : array($fixedMemoryUnit); 126 127 $view->config->filters[] = function ($dataTable) use ($sizeColumns, $getPrettySize, $params) { 128 $dataTable->filter('ColumnCallbackReplace', array($sizeColumns, $getPrettySize, $params)); 129 }; 130 131 // jqPlot will display as, well, ' ', so don't replace the spaces when rendering as a graph 132 if ($view->isViewDataTableId(HtmlTable::ID)) { 133 $replaceSpaces = function ($value) { 134 return str_replace(' ', ' ', $value); 135 }; 136 137 $view->config->filters[] = array('ColumnCallbackReplace', array($sizeColumns, $replaceSpaces)); 138 } 139 140 $getPrettyNumber = array($formatter, 'getPrettyNumber'); 141 $view->config->filters[] = array('ColumnCallbackReplace', array('row_count', $getPrettyNumber)); 142 } 143 144 /** 145 * Sets the footer message for the Individual...Summary reports. 146 */ 147 protected function setIndividualSummaryFooterMessage(ViewDataTable $view) 148 { 149 $lastGenerated = self::getDateOfLastCachingRun(); 150 if ($lastGenerated !== false) { 151 $view->config->show_footer_message = Piwik::translate('Mobile_LastUpdated', $lastGenerated); 152 } 153 } 154 155 /** Returns the date when the cacheDataByArchiveNameReports was last run. */ 156 private static function getDateOfLastCachingRun() 157 { 158 return Option::get(DBStats::TIME_OF_LAST_TASK_RUN_OPTION); 159 } 160} 161