diff options
41 files changed, 525 insertions, 266 deletions
diff --git a/core/Controller.php b/core/Controller.php index ad5b4a5653..36c56852a0 100644 --- a/core/Controller.php +++ b/core/Controller.php @@ -92,7 +92,7 @@ abstract class Piwik_Controller * @param bool $fetch * @return string|void */ - protected function renderView( Piwik_ViewDataTable $view, $fetch) + protected function renderView( Piwik_ViewDataTable $view, $fetch = false) { Piwik_PostEvent( 'Controller.renderView', $this, diff --git a/core/DataTable.php b/core/DataTable.php index ee4d6beb6b..b4f100b7b9 100644 --- a/core/DataTable.php +++ b/core/DataTable.php @@ -1082,13 +1082,23 @@ class Piwik_DataTable * LABEL => array(col1 => X, col2 => Y), * LABEL2 => array(col1 => X, col2 => Y), * ) - * * to the structure * array ( * array( Piwik_DataTable_Row::COLUMNS => array('label' => LABEL, col1 => X, col2 => Y)), * array( Piwik_DataTable_Row::COLUMNS => array('label' => LABEL2, col1 => X, col2 => Y)), * ) * + * It also works with array having only one value per row, eg. + * array ( + * LABEL => X, + * LABEL2 => Y, + * ) + * would be converted to the structure + * array ( + * array( Piwik_DataTable_Row::COLUMNS => array('label' => LABEL, 'value' => X)), + * array( Piwik_DataTable_Row::COLUMNS => array('label' => LABEL2, 'value' => Y)), + * ) + * * The optional parameter $subtablePerLabel is an array of subTable associated to the rows of the $array * For example if $subtablePerLabel is given * array( @@ -1116,6 +1126,10 @@ class Piwik_DataTable $cleanRow = array(); foreach($array as $label => $row) { + if(!is_array($row)) + { + $row = array('value' => $row); + } $cleanRow[Piwik_DataTable_Row::DATATABLE_ASSOCIATED] = null; // we put the 'label' column first as it looks prettier in API results $cleanRow[Piwik_DataTable_Row::COLUMNS] = array('label' => $label) + $row; diff --git a/core/DataTable/Filter/Sort.php b/core/DataTable/Filter/Sort.php index 077a09cbca..0b80a322d8 100644 --- a/core/DataTable/Filter/Sort.php +++ b/core/DataTable/Filter/Sort.php @@ -20,7 +20,7 @@ class Piwik_DataTable_Filter_Sort extends Piwik_DataTable_Filter protected $columnToSort; protected $order; - public function __construct( $table, $columnToSort, $order = 'desc', $naturalSort = false, $recursiveSort = false ) + public function __construct( $table, $columnToSort, $order = 'desc', $naturalSort = true, $recursiveSort = false ) { parent::__construct($table); if(empty($columnToSort)) diff --git a/core/Period.php b/core/Period.php index b5fbd33e0e..29323e6a45 100644 --- a/core/Period.php +++ b/core/Period.php @@ -40,6 +40,11 @@ abstract class Piwik_Period $this->date = clone $date; } + /** + * @param $strPeriod "day", "week", "month", "year" + * @param $date Piwik_Date object + * @return Piwik_Period + */ static public function factory($strPeriod, $date) { switch ($strPeriod) { @@ -129,7 +134,6 @@ abstract class Piwik_Period } /** - * * @return Piwik_Date */ protected function getDate() @@ -163,7 +167,7 @@ abstract class Piwik_Period * Returns Period_Day for a period made of days (week, month), * Period_Month for a period made of months (year) * - * @return array + * @return array Piwik_Period */ public function getSubperiods() { diff --git a/core/Period/Range.php b/core/Period/Range.php index dea4ed73ad..1d695ba971 100644 --- a/core/Period/Range.php +++ b/core/Period/Range.php @@ -101,9 +101,7 @@ class Piwik_Period_Range extends Piwik_Period if(ereg('(last|previous)([0-9]*)', $this->strDate, $regs)) { $lastN = $regs[2]; - $lastOrPrevious = $regs[1]; - if(!is_null($this->defaultEndDate)) { $defaultEndDate = $this->defaultEndDate; diff --git a/core/SmartyPlugins/function.sparkline.php b/core/SmartyPlugins/function.sparkline.php index 096bb1a05e..e96f34a4a8 100644 --- a/core/SmartyPlugins/function.sparkline.php +++ b/core/SmartyPlugins/function.sparkline.php @@ -15,7 +15,7 @@ require_once "Visualization/Sparkline.php"; * @param string $url * @return string IMG HTML tag */ -function smarty_function_sparkline($params, &$smarty) +function smarty_function_sparkline($params, &$smarty = false) { $src = $params['src']; $width = Piwik_Visualization_Sparkline::getWidth(); diff --git a/core/ViewDataTable.php b/core/ViewDataTable.php index c30cb185d6..0321171ba9 100644 --- a/core/ViewDataTable.php +++ b/core/ViewDataTable.php @@ -116,6 +116,9 @@ abstract class Piwik_ViewDataTable */ protected $columnsTranslations = array(); + + protected $columnsToDisplay = array(); + /** * Method to be implemented by the ViewDataTable_*. * This method should create and initialize a $this->view object @see Piwik_iView @@ -433,7 +436,7 @@ abstract class Piwik_ViewDataTable else { // the $uniqIdTable variable is used as the DIV ID in the rendered HTML - // we use the current Controller action name as it is supposed to be unique in the rendered page + // we use the current Controller action name as it is supposed to be unique in the rendered page $uniqIdTable = $this->currentControllerName . $this->currentControllerAction; } return $uniqIdTable; @@ -648,7 +651,7 @@ abstract class Piwik_ViewDataTable * When this method is called, the output will not contain the template datatable_footer.tpl * @return void */ - public function doNotShowFooter() + public function disableFooter() { $this->viewProperties['show_footer'] = false; } @@ -790,6 +793,36 @@ abstract class Piwik_ViewDataTable return $columnName; } } + + /** + * Sets the columns that will be displayed in the HTML output + * By default all columns are displayed ($columnsNames = array() will display all columns) + * + * @param array $columnsNames Array of column names eg. array('nb_visits','nb_hits') + */ + public function setColumnsToDisplay( $columnsNames ) + { + if(!is_array($columnsNames)) + { + $columnsNames = array($columnsNames); + } + $this->columnsToDisplay = $columnsNames; + } + + /** + * Returns columns names to display, in order. + * If no columns were specified to be displayed, return all columns found in the first row. + * @param array PHP array conversion of the data table + * @return array + */ + public function getColumnsToDisplay() + { + if(empty($this->columnsToDisplay)) + { + return array_keys($this->dataTable->getFirstRow()->getColumns()); + } + return $this->columnsToDisplay; + } /** * Sets columns translations array. diff --git a/core/ViewDataTable/Cloud.php b/core/ViewDataTable/Cloud.php index 50078fc169..c5fc45a67e 100644 --- a/core/ViewDataTable/Cloud.php +++ b/core/ViewDataTable/Cloud.php @@ -22,6 +22,11 @@ class Piwik_ViewDataTable_Cloud extends Piwik_ViewDataTable { protected $displayLogoInsteadOfLabel = false; + public function displayLogoInTagCloud() + { + $this->displayLogoInsteadOfLabel = true; + } + protected function getViewDataTableId() { return 'cloud'; @@ -59,45 +64,46 @@ class Piwik_ViewDataTable_Cloud extends Piwik_ViewDataTable $this->view = $this->buildView(); } + function getColumnToDisplay() + { + $columns = parent::getColumnsToDisplay(); + // not label, but the first numeric column + return $columns[1]; + } + protected function buildView() { $view = new Piwik_View($this->dataTableTemplate); - $words = $labelMetadata = array(); + $columnToDisplay = $this->getColumnToDisplay(); + $columnTranslation = $this->getColumnTranslation($columnToDisplay); + $values = $this->dataTable->getColumn($columnToDisplay); + $labels = $this->dataTable->getColumn('label'); foreach($this->dataTable->getRows() as $row) { - $label = $row->getColumn('label'); - $value = $row->getColumn('nb_uniq_visitors'); - - // case no unique visitors - if($value === false) - { - $value = $row->getColumn('nb_visits'); - } - $words[$label] = $value; - $logo = false; if($this->displayLogoInsteadOfLabel) { $logo = $row->getMetadata('logo'); } - - $labelMetadata[$label] = array( + $labelMetadata[$row->getColumn('label')] = array( 'logo' => $logo, 'url' => $row->getMetadata('url'), - 'hits' => $value ); } - $cloud = new Piwik_Visualization_Cloud($words); + $cloud = new Piwik_Visualization_Cloud(); + foreach($labels as $i => $label) + { + $cloud->addWord($label, $values[$i]); + } $cloudValues = $cloud->render('array'); - foreach($cloudValues as &$value) { $value['logoWidth'] = round(max(16, $value['percent'])); } + $view->columnTranslation = $columnTranslation; $view->labelMetadata = $labelMetadata; $view->cloudValues = $cloudValues; - $view->javascriptVariablesToSet = $this->getJavascriptVariablesToSet(); $view->properties = $this->getViewProperties(); return $view; diff --git a/core/ViewDataTable/GenerateGraphData.php b/core/ViewDataTable/GenerateGraphData.php index bf5285cca9..af61510bac 100644 --- a/core/ViewDataTable/GenerateGraphData.php +++ b/core/ViewDataTable/GenerateGraphData.php @@ -36,17 +36,11 @@ abstract class Piwik_ViewDataTable_GenerateGraphData extends Piwik_ViewDataTable * @var int */ protected $graphLimit = null; + protected $yAxisUnit = ''; - protected $columnsToDisplay = array(); - - public function setColumnsToDisplay($columns) - { - $this->columnsToDisplay = $columns; - } - - public function getColumnsToDisplay() + public function setAxisYUnit($unit) { - return $this->columnsToDisplay; + $this->yAxisUnit = $unit; } /** @@ -80,6 +74,7 @@ abstract class Piwik_ViewDataTable_GenerateGraphData extends Piwik_ViewDataTable // the queued filters will be manually applied later. This is to ensure that filtering using search // will be done on the table before the labels are enhanced (see ReplaceColumnNames) + $this->disableGenericFilters(); $this->disableQueuedFilters(); $this->loadDataTableFromAPI(); @@ -114,21 +109,25 @@ abstract class Piwik_ViewDataTable_GenerateGraphData extends Piwik_ViewDataTable $this->dataTable->applyQueuedFilters(); // We apply a filter to the DataTable, decoding the label column (useful for keywords for example) - $this->dataTable->filter('ColumnCallbackReplace', array('label','urldecode') ); + $this->dataTable->filter('ColumnCallbackReplace', array('label','urldecode')); $xLabels = $this->dataTable->getColumn('label'); - $columnNames = array_keys($this->dataTable->getFirstRow()->getColumns()); - unset($columnNames[array_search('label',$columnNames)]); + $columnNames = parent::getColumnsToDisplay(); + if(($labelColumnFound = array_search('label',$columnNames)) !== false) + { + unset($columnNames[$labelColumnFound]); + } - $columnNameToTranslation = $columnNameToValue = array(); + $columnNameToTranslation = $columnNameToValue = $columnNameToUnit = array(); foreach($columnNames as $columnName) { $columnNameToTranslation[$columnName] = $this->getColumnTranslation($columnName); $columnNameToValue[$columnName] = $this->dataTable->getColumn($columnName); + $columnNameToUnit[$columnName] = $this->yAxisUnit; } $this->view->setAxisXLabels($xLabels); $this->view->setAxisYValues($columnNameToValue); $this->view->setAxisYLabels($columnNameToTranslation); + $this->view->setAxisYUnits($columnNameToUnit); } } - diff --git a/core/ViewDataTable/GenerateGraphData/ChartEvolution.php b/core/ViewDataTable/GenerateGraphData/ChartEvolution.php index 30ee37fd1f..dc4eab30c0 100644 --- a/core/ViewDataTable/GenerateGraphData/ChartEvolution.php +++ b/core/ViewDataTable/GenerateGraphData/ChartEvolution.php @@ -21,6 +21,13 @@ class Piwik_ViewDataTable_GenerateGraphData_ChartEvolution extends Piwik_ViewDat protected function generateDataFromDataTable() { + // if the loaded datatable is a simple DataTable, it is most likely a plugin plotting some custom data + // we don't expect plugin developers to return a well defined Piwik_DataTable_Array + if($this->dataTable instanceof Piwik_DataTable) + { + return parent::generateDataFromDataTable(); + } + $this->dataTable->applyQueuedFilters(); if(!($this->dataTable instanceof Piwik_DataTable_Array)) { @@ -56,7 +63,6 @@ class Piwik_ViewDataTable_GenerateGraphData_ChartEvolution extends Piwik_ViewDat } } - // make sure all column values are set (at least zero) in order for all unique idDataTable $columnNameToValueCleaned = array(); foreach($uniqueIdsDataTable as $uniqueIdDataTable) @@ -76,28 +82,38 @@ class Piwik_ViewDataTable_GenerateGraphData_ChartEvolution extends Piwik_ViewDat } $columnNames = array_keys($columnNameToValueCleaned); $columnNameToTranslation = array(); - $columnNameToType = array(); - $nameToType = array( + $columnNameToUnit = array(); + $nameToUnit = array( '_rate' => '%', '_revenue' => Piwik::getCurrency(), ); foreach($columnNames as $columnName) { $columnNameToTranslation[$columnName] = $this->getColumnTranslation($columnName); - $columnNameToType[$columnName] = false; - foreach($nameToType as $pattern => $type) + + $columnNameToUnit[$columnName] = false; + // if the unit was specified, we use it + if(!empty($this->yAxisUnit)) { - if(strpos($columnName, $pattern) !== false) + $columnNameToUnit[$columnName] = $this->yAxisUnit; + } + // otherwise we guess the unit from the column name + else + { + foreach($nameToUnit as $pattern => $type) { - $columnNameToType[$columnName] = $type; - break; + if(strpos($columnName, $pattern) !== false) + { + $columnNameToUnit[$columnName] = $type; + break; + } } } } $this->view->setAxisXLabels($xLabels); $this->view->setAxisYValues($columnNameToValueCleaned); $this->view->setAxisYLabels($columnNameToTranslation); - $this->view->setAxisYValuesTypes($columnNameToType); + $this->view->setAxisYUnits($columnNameToUnit); $firstDatatable = reset($this->dataTable->metadata); $period = $firstDatatable['period']; diff --git a/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php b/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php index c169cdcf26..77082e99f9 100644 --- a/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php +++ b/core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php @@ -35,7 +35,7 @@ class Piwik_ViewDataTable_GenerateGraphHTML_ChartEvolution extends Piwik_ViewDat $apiMethodToRequestDataTable ); $this->setParametersToModify(array('date' => Piwik_Common::getRequestVar('date', 'last30', 'string'))); - $this->doNotShowFooter(); + $this->disableFooter(); } /** diff --git a/core/ViewDataTable/HtmlTable.php b/core/ViewDataTable/HtmlTable.php index ac6d56ca44..cfd079da48 100644 --- a/core/ViewDataTable/HtmlTable.php +++ b/core/ViewDataTable/HtmlTable.php @@ -20,13 +20,6 @@ class Piwik_ViewDataTable_HtmlTable extends Piwik_ViewDataTable { /** - * Array of columns names to display - * - * @var array - */ - protected $columnsToDisplay = array(); - - /** * Set to true when the DataTable must be loaded along with all its children subtables * Useful when searching for a pattern in the DataTable Actions (we display the full hierarchy) * @@ -93,8 +86,12 @@ class Piwik_ViewDataTable_HtmlTable extends Piwik_ViewDataTable */ protected function buildView() { - $phpArray = $this->getPHPArrayFromDataTable(); - $columns = $this->getColumnsToDisplay($phpArray); + $columns = $this->getColumnsToDisplay(); + $columnTranslations = array(); + foreach($columns as $columnName) + { + $columnTranslations[$columnName] = $this->getColumnTranslation($columnName); + } $nbColumns = count($columns); // case no data in the array we use the number of columns set to be displayed if($nbColumns == 0) @@ -103,8 +100,9 @@ class Piwik_ViewDataTable_HtmlTable extends Piwik_ViewDataTable } $view = new Piwik_View($this->dataTableTemplate); - $view->arrayDataTable = $phpArray; + $view->arrayDataTable = $this->getPHPArrayFromDataTable(); $view->dataTableColumns = $columns; + $view->columnTranslations = $columnTranslations; $view->nbColumns = $nbColumns; $view->javascriptVariablesToSet = $this->getJavascriptVariablesToSet(); $view->properties = $this->getViewProperties(); @@ -140,17 +138,7 @@ class Piwik_ViewDataTable_HtmlTable extends Piwik_ViewDataTable $phpArray = $renderer->originalRender(); return $phpArray; } - - /** - * Sets the columns that will be displayed in the HTML output - * By default all columns are displayed ($columnsNames = array() will display all columns) - * - * @param array $columnsNames Array of column names eg. array('nb_visits','nb_hits') - */ - public function setColumnsToDisplay( $columnsNames) - { - $this->columnsToDisplay = $columnsNames; - } + /** * Adds a column to the list of columns to be displayed @@ -161,44 +149,6 @@ class Piwik_ViewDataTable_HtmlTable extends Piwik_ViewDataTable { $this->columnsToDisplay[] = $columnName; } - - /** - * Returns array( - * array('name' => 'nb_visits', 'displayName' => 'Visits'), - * array('name' => 'nb_uniq_visitors', 'displayName' => 'Unique Visitors'), - * - * @param array PHP array conversion of the data table - * @return array - */ - protected function getColumnsToDisplay($phpArray) - { - $metadataColumnToDisplay = array(); - if(count($phpArray) > 0) - { - // we show the columns in order specified in the setColumnsToDisplay - // each column has a string name; - // this name will for example be used to specify the sorting column - $columnsToDisplay = $this->columnsToDisplay; - - if(count($columnsToDisplay) == 0) - { - $columnsToDisplay = array_keys($phpArray[0]['columns']); - } - - $columnsToDisplay = array_unique($columnsToDisplay); - foreach($columnsToDisplay as $columnToDisplay) - { - if(!empty($columnToDisplay)) - { - $metadataColumnToDisplay[] = array( - 'name' => $columnToDisplay, - 'displayName' => $this->getColumnTranslation($columnToDisplay) - ); - } - } - } - return $metadataColumnToDisplay ; - } /** * Sets the columns in the HTML table as not sortable (they are not clickable) diff --git a/core/ViewDataTable/Sparkline.php b/core/ViewDataTable/Sparkline.php index 1982cba555..4a2d0c1514 100644 --- a/core/ViewDataTable/Sparkline.php +++ b/core/ViewDataTable/Sparkline.php @@ -23,18 +23,6 @@ class Piwik_ViewDataTable_Sparkline extends Piwik_ViewDataTable return 'sparkline'; } - protected $columnsToDisplay = array(); - - public function setColumnsToDisplay($columns) - { - $this->columnsToDisplay = $columns; - } - - public function getColumnsToDisplay() - { - return $this->columnsToDisplay; - } - /** * @see Piwik_ViewDataTable::main() */ @@ -46,7 +34,7 @@ class Piwik_ViewDataTable_Sparkline extends Piwik_ViewDataTable } $this->mainAlreadyExecuted = true; - // we load the data with the filters applied + $this->disableGenericFilters(); $this->loadDataTableFromAPI(); $this->isDataAvailable = $this->dataTable->getRowsCount() != 0; @@ -55,7 +43,6 @@ class Piwik_ViewDataTable_Sparkline extends Piwik_ViewDataTable throw new Exception(Piwik_Translate('General_NoDataForGraph')); } $values = $this->getValuesFromDataTable($this->dataTable); - $graph = new Piwik_Visualization_Sparkline; $graph->setValues($values); $graph->main(); @@ -63,24 +50,17 @@ class Piwik_ViewDataTable_Sparkline extends Piwik_ViewDataTable $this->view = $graph; } - protected function getValuesFromDataTable( Piwik_DataTable_Array $dataTableArray) + protected function getValuesFromDataTableArray( $dataTableArray, $columnToPlot ) { $dataTableArray->applyQueuedFilters(); - - $columns = $this->getColumnsToDisplay(); - $columnToPlot = false; - if(!empty($columns)) - { - $columnToPlot = $columns[0]; - } $values = array(); - foreach($dataTableArray->getArray() as $keyName => $table) + foreach($dataTableArray->getArray() as $table) { - $value = 0; if($table->getRowsCount() > 1) { throw new Exception("Expecting only one row per DataTable"); } + $value = 0; $onlyRow = $table->getFirstRow(); if($onlyRow !== false) { @@ -100,4 +80,26 @@ class Piwik_ViewDataTable_Sparkline extends Piwik_ViewDataTable } return $values; } + + protected function getValuesFromDataTable( $dataTable ) + { + $columns = $this->getColumnsToDisplay(); + $columnToPlot = false; + if(!empty($columns)) + { + $columnToPlot = $columns[0]; + } + + // a Piwik_DataTable_Array is returned when using the normal code path to request data from Archives, in all core plugins + // however plugins can also return simple datatable, hence why the sparkline can accept both data types + if($this->dataTable instanceof Piwik_DataTable_Array) + { + $values = $this->getValuesFromDataTableArray($dataTable, $columnToPlot); + } + elseif($this->dataTable instanceof Piwik_DataTable) + { + $values = $this->dataTable->getColumn($columnToPlot); + } + return $values; + } } diff --git a/core/Visualization/Chart.php b/core/Visualization/Chart.php index 2f12137255..9a1ca5ebc2 100644 --- a/core/Visualization/Chart.php +++ b/core/Visualization/Chart.php @@ -29,6 +29,7 @@ abstract class Piwik_Visualization_Chart implements Piwik_iView protected $yLabels = array(); protected $yValues = array(); + protected $yUnits = array(); function __construct() { @@ -39,21 +40,27 @@ abstract class Piwik_Visualization_Chart implements Piwik_iView { $this->xLabels = $xLabels; } + + public function setAxisXOnClick($onClick) + { + $this->xOnClick = $onClick; + } public function setAxisYValues($values) { $this->yValues = $values; } + + function setAxisYUnits($yUnits) + { + $this->yUnits = $yUnits; + } public function setAxisYLabels($labels) { $this->yLabels = $labels; } - public function setAxisXOnClick($onClick) - { - $this->xOnClick = $onClick; - } //TODO call + make sure matches beginning of period? (hard..) // day -> every 7 days @@ -153,6 +160,16 @@ abstract class Piwik_Visualization_Chart implements Piwik_iView $maxValue = 1; } $this->y->set_range( $minValue, $maxValue, $stepsEveryNLabel); + $dataSetsToDisplay = $this->getDataSetsToDisplay(); + if($dataSetsToDisplay != false) + { + $dataSetToDisplay = current($dataSetsToDisplay); + if(isset($this->yUnits[$dataSetToDisplay])) + { + $unit = $this->yUnits[$dataSetToDisplay]; + $this->y->set_label_text("#val#$unit"); + } + } // Tooltip $this->tooltip = new tooltip(); diff --git a/core/Visualization/Chart/Evolution.php b/core/Visualization/Chart/Evolution.php index 6cef02f6e0..314acbffd9 100644 --- a/core/Visualization/Chart/Evolution.php +++ b/core/Visualization/Chart/Evolution.php @@ -18,12 +18,6 @@ require_once "Visualization/Chart.php"; */ class Piwik_Visualization_Chart_Evolution extends Piwik_Visualization_Chart { - protected $yValuesType = array(); - function setAxisYValuesTypes($yValuesTypes) - { - $this->yValuesTypes = $yValuesTypes; - } - function customizeGraph() { parent::customizeGraph(); @@ -71,13 +65,10 @@ class Piwik_Visualization_Chart_Evolution extends Piwik_Visualization_Chart $lineValue = new hollow_dot($value); $unit = ''; - if(!empty($this->yValuesTypes[$dataSetToDisplay])) + if(!empty($this->yUnits[$dataSetToDisplay])) { - $unit = $this->yValuesTypes[$dataSetToDisplay]; + $unit = $this->yUnits[$dataSetToDisplay]; } - // set the Y Label to display the right unit - $this->y->set_label_text("#val#$unit"); - $lineValue->tooltip("$label<br>$value$unit $labelName"); if(!empty($this->xOnClick)) { @@ -97,7 +88,7 @@ class Piwik_Visualization_Chart_Evolution extends Piwik_Visualization_Chart // if one column is a percentage we set the grid accordingly // note: it is invalid to plot a percentage dataset along with a numeric dataset //TODO only if the max was 100!! - if(array_search('%', $this->yValuesTypes) !== false) + if(array_search('%', $this->yUnits) !== false) { $this->y->set_range( 0, 100, 50); } diff --git a/core/Visualization/Chart/Pie.php b/core/Visualization/Chart/Pie.php index 8ea8e7e2ec..12effb7f6c 100644 --- a/core/Visualization/Chart/Pie.php +++ b/core/Visualization/Chart/Pie.php @@ -49,6 +49,7 @@ class Piwik_Visualization_Chart_Pie extends Piwik_Visualization_Chart // create the Pie values $yValues = $this->yValues[$dataSetToDisplay]; $labelName = $this->yLabels[$dataSetToDisplay]; + $unit = @$this->yUnits[$dataSetToDisplay]; $sum = array_sum($yValues); $pieValues = array(); $i = 0; @@ -61,7 +62,7 @@ class Piwik_Visualization_Chart_Pie extends Piwik_Visualization_Chart } $pieValue = new pie_value($value, $label); $percentage = round(100 * $value / $sum); - $pieValue->set_tooltip("$label <br>$percentage% ($value $labelName)"); + $pieValue->set_tooltip("$label<br>$percentage% ($value$unit $labelName)"); $pieValues[] = $pieValue; } $pie->set_values($pieValues); diff --git a/core/Visualization/Chart/VerticalBar.php b/core/Visualization/Chart/VerticalBar.php index a87487bb51..c9794f4f00 100644 --- a/core/Visualization/Chart/VerticalBar.php +++ b/core/Visualization/Chart/VerticalBar.php @@ -52,19 +52,17 @@ class Piwik_Visualization_Chart_VerticalBar extends Piwik_Visualization_Chart // create the bar values $yValues = $this->yValues[$dataSetToDisplay]; $labelName = $this->yLabels[$dataSetToDisplay]; - $sum = array_sum($yValues); + $unit = @$this->yUnits[$dataSetToDisplay]; $barValues = array(); $i = 0; foreach($this->xLabels as $label) { $value = $yValues[$i]; $barValue = new bar_value($value); - $percentage = round(100 * $value / $sum); - $barValue->set_tooltip("$label <br>$value $labelName ($percentage%)"); + $barValue->set_tooltip("$label<br>$value$unit $labelName"); $barValues[] = $barValue; $i++; } $bar->set_values($barValues); $this->chart->add_element($bar); } - } diff --git a/core/Visualization/Cloud.php b/core/Visualization/Cloud.php index 46ca66208d..287c57d86c 100644 --- a/core/Visualization/Cloud.php +++ b/core/Visualization/Cloud.php @@ -21,32 +21,15 @@ class Piwik_Visualization_Cloud { protected $wordsArray = array(); - public $truncatingLimit = 30; - /** - * @param array array( word => 10, word2 => 50, word3 => 1) - */ - function __construct($words = false) - { - if ($words !== false && is_array($words)) - { - foreach ($words as $word => $value) - { - $this->addWord($word, $value); - } - } - } - /* * Assign word to array - * * @param string $word * @return string */ function addWord($word, $value = 1) { - // $word = strtolower($word); if (isset($this->wordsArray[$word])) { $this->wordsArray[$word] += $value; @@ -56,11 +39,38 @@ class Piwik_Visualization_Cloud $this->wordsArray[$word] = $value; } } - + + public function render() + { + $this->shuffleCloud(); + $return = array(); + $maxValue = max($this->wordsArray); + foreach ($this->wordsArray as $word => $popularity) + { + $wordTruncated = $word; + if(strlen($word) > $this->truncatingLimit) + { + $wordTruncated = substr($word, 0, $this->truncatingLimit - 3).'...'; + } + $percent = ($popularity / $maxValue) * 100; + // CSS style value + $sizeRange = $this->getClassFromPercent($percent); + + $return[$word] = array( + 'word' => $word, + 'wordTruncated' => $wordTruncated, + 'value' => $popularity, + 'size' => $sizeRange, + 'percent' => $percent, + ); + } + return $return; + } + /* * Shuffle associated names in array */ - function shuffleCloud() + protected function shuffleCloud() { $keys = array_keys($this->wordsArray); @@ -76,30 +86,13 @@ class Piwik_Visualization_Cloud } /* - * Calculate size of words array - */ - - function getCloudSize() - { - return array_sum($this->wordsArray); - } - - /* * Get the class range using a percentage * * @returns int $class */ - function getClassFromPercent($percent) + protected function getClassFromPercent($percent) { - $mapping = array( - 95, - 70, - 50, - 30, - 15, - 5, - 0 - ); + $mapping = array(95, 70, 50, 30, 15, 5, 0); foreach($mapping as $key => $value) { if($percent >= $value) @@ -108,62 +101,5 @@ class Piwik_Visualization_Cloud } } } - - /* - * Create the HTML code for each word and apply font size. - * - * @returns string $spans - */ - - function render($returnType = "html") - { - $this->shuffleCloud(); - - if($returnType == "html") - { - $return = ''; - } - else - { - $return = array(); - } - - if (count($this->wordsArray) > 0) - { - $this->max = max($this->wordsArray); - - $return = ($returnType == "html" ? "" : ($returnType == "array" ? array() : "")); - foreach ($this->wordsArray as $word => $popularity) - { - - // truncating the word - $wordTruncated = $word; - if(strlen($word) > $this->truncatingLimit) - { - $wordTruncated = substr($word, 0, $this->truncatingLimit - 3).'...'; - } - - // computing the percentage - $percent = ($popularity / $this->max) * 100; - - // and the CSS style value - $sizeRange = $this->getClassFromPercent($percent); - - if ($returnType == "array") - { - $return[$word]['word'] = $word; - $return[$word]['wordTruncated'] = $wordTruncated; - $return[$word]['size'] = $sizeRange; - $return[$word]['percent'] = $percent; - } - else if ($returnType == "html") - { - $return .= "\n<span title='".$word."' class='word size{$sizeRange}'> {$wordTruncated} </span>"; - } - // print( $word ."=".$percent."<br>"); - } - } - return $return; - } } diff --git a/plugins/Actions/Controller.php b/plugins/Actions/Controller.php index 3f5e1a945e..b3b7e13d42 100644 --- a/plugins/Actions/Controller.php +++ b/plugins/Actions/Controller.php @@ -117,6 +117,7 @@ class Piwik_Actions_Controller extends Piwik_Controller // computing minimum value to exclude require_once "VisitsSummary/Controller.php"; $visitsInfo = Piwik_VisitsSummary_Controller::getVisitsSummary(); + $visitsInfo = $visitsInfo->getFirstRow(); $nbActions = $visitsInfo->getColumn('nb_actions'); $nbActionsLowPopulationThreshold = floor(0.02 * $nbActions); // 2 percent of the total number of actions // we remove 1 to make sure some actions/downloads are displayed in the case we have a very few of them diff --git a/plugins/CoreHome/templates/cloud.tpl b/plugins/CoreHome/templates/cloud.tpl index b3c208ccc0..70da6169b1 100644 --- a/plugins/CoreHome/templates/cloud.tpl +++ b/plugins/CoreHome/templates/cloud.tpl @@ -53,10 +53,9 @@ span.size6, span.size6 a { <div id="emptyDatatable">{'General_NoDataForTagCloud'|translate}</div> {else} {foreach from=$cloudValues key=word item=value} - <span title="{$value.word} ({$labelMetadata[$value.word].hits} hits)" class="word size{$value.size} {* we strike tags with 0 hits *} {if $labelMetadata[$value.word].hits == 0}valueIsZero{/if}"> + <span title="{$value.word} ({$value.value} {$columnTranslation})" class="word size{$value.size} {* we strike tags with 0 hits *} {if $value.value == 0}valueIsZero{/if}"> {if false !== $labelMetadata[$value.word].url}<a href="{$labelMetadata[$value.word].url}" target="_blank">{/if} {if false !== $labelMetadata[$value.word].logo}<img src="{$labelMetadata[$value.word].logo}" width="{$value.logoWidth}">{else} - {$value.wordTruncated}{/if}{if false !== $labelMetadata[$value.word].url}</a>{/if}</span> {/foreach} {/if} diff --git a/plugins/CoreHome/templates/datatable.js b/plugins/CoreHome/templates/datatable.js index a14b49eb83..9dae015f58 100644 --- a/plugins/CoreHome/templates/datatable.js +++ b/plugins/CoreHome/templates/datatable.js @@ -902,7 +902,8 @@ actionDataTable.prototype = var parents = $(this).attr('parent'); if(parents) { - if(parents.indexOf(idSubTable) >= 0 || parents.indexOf('subDataTable_'+idSubTable) >= 0) + if(parents.indexOf(idSubTable) >= 0 + || parents.indexOf('subDataTable_'+idSubTable) >= 0) { if(plusDetected) { diff --git a/plugins/CoreHome/templates/datatable.tpl b/plugins/CoreHome/templates/datatable.tpl index a3cc8876f9..7cbdc6f2cc 100644 --- a/plugins/CoreHome/templates/datatable.tpl +++ b/plugins/CoreHome/templates/datatable.tpl @@ -11,7 +11,7 @@ <thead> <tr> {foreach from=$dataTableColumns item=column} - <th class="sortable" id="{$column.name}"><div id="thDIV">{$column.displayName}</div></th> + <th class="sortable" id="{$column}"><div id="thDIV">{$columnTranslations[$column]}</div></th> {/foreach} </tr> </thead> @@ -21,9 +21,9 @@ <tr {if $row.idsubdatatable && $javascriptVariablesToSet.controllerActionCalledWhenRequestSubTable != null}class="subDataTable" id="{$row.idsubdatatable}"{/if}> {foreach from=$dataTableColumns item=column} <td> -{if !$row.idsubdatatable && $column.name=='label' && isset($row.metadata.url)}<span id="urlLink">{$row.metadata.url}</span>{/if} -{if $column.name=='label'}{logoHtml metadata=$row.metadata alt=$row.columns.label}{/if} -{if isset($row.columns[$column.name])}{$row.columns[$column.name]}{else}{$defaultWhenColumnValueNotDefined}{/if} +{if !$row.idsubdatatable && $column=='label' && isset($row.metadata.url)}<span id="urlLink">{$row.metadata.url}</span>{/if} +{if $column=='label'}{logoHtml metadata=$row.metadata alt=$row.columns.label}{/if} +{if isset($row.columns[$column])}{$row.columns[$column]}{else}{$defaultWhenColumnValueNotDefined}{/if} </td> {/foreach} </tr> diff --git a/plugins/CoreHome/templates/datatable_actions.tpl b/plugins/CoreHome/templates/datatable_actions.tpl index 31300cd878..1ffa6b99c1 100644 --- a/plugins/CoreHome/templates/datatable_actions.tpl +++ b/plugins/CoreHome/templates/datatable_actions.tpl @@ -10,7 +10,7 @@ <thead> <tr> {foreach from=$dataTableColumns item=column} - <th class="sortable" id="{$column.name}">{$column.displayName}</td> + <th class="sortable" id="{$column}">{$columnTranslations[$column]}</td> {/foreach} </tr> </thead> @@ -20,7 +20,7 @@ <tr {if $row.idsubdatatable}class="rowToProcess subActionsDataTable" id="{$row.idsubdatatable}"{else} class="actionsDataTable rowToProcess"{/if}> {foreach from=$dataTableColumns item=column} <td> - {if isset($row.columns[$column.name])}{$row.columns[$column.name]}{else}{$defaultWhenColumnValueNotDefined}{/if} + {if isset($row.columns[$column])}{$row.columns[$column]}{else}{$defaultWhenColumnValueNotDefined}{/if} </td> {/foreach} </tr> diff --git a/plugins/CoreHome/templates/datatable_actions_recursive.tpl b/plugins/CoreHome/templates/datatable_actions_recursive.tpl index be24f32f9d..d405ea3fdc 100644 --- a/plugins/CoreHome/templates/datatable_actions_recursive.tpl +++ b/plugins/CoreHome/templates/datatable_actions_recursive.tpl @@ -10,7 +10,7 @@ <thead> <tr> {foreach from=$dataTableColumns item=column} - <th class="sortable" id="{$column.name}">{$column.displayName}</td> + <th class="sortable" id="{$column}">{$columnTranslations[$column]}</td> {/foreach} </tr> </thead> @@ -20,7 +20,7 @@ <tr {if $row.idsubdatatable}class="level{$row.level} rowToProcess subActionsDataTable" id="{$row.idsubdatatable}"{else}class="actionsDataTable rowToProcess level{$row.level}"{/if}> {foreach from=$dataTableColumns item=column} <td> - {if isset($row.columns[$column.name])}{$row.columns[$column.name]}{else}{$defaultWhenColumnValueNotDefined}{/if} + {if isset($row.columns[$column])}{$row.columns[$column]}{else}{$defaultWhenColumnValueNotDefined}{/if} </td> {/foreach} </tr> diff --git a/plugins/CoreHome/templates/datatable_actions_subdatable.tpl b/plugins/CoreHome/templates/datatable_actions_subdatable.tpl index c040d21941..0a1ec0bb0d 100644 --- a/plugins/CoreHome/templates/datatable_actions_subdatable.tpl +++ b/plugins/CoreHome/templates/datatable_actions_subdatable.tpl @@ -9,7 +9,7 @@ <tr {if $row.idsubdatatable}class="subActionsDataTable" id="{$row.idsubdatatable}"{else}class="actionsDataTable"{/if}> {foreach from=$dataTableColumns item=column} <td> - {if isset($row.columns[$column.name])}{$row.columns[$column.name]}{else}{$defaultWhenColumnValueNotDefined}{/if} + {if isset($row.columns[$column])}{$row.columns[$column]}{else}{$defaultWhenColumnValueNotDefined}{/if} </td> {/foreach} </tr> diff --git a/plugins/CoreHome/templates/menu.css b/plugins/CoreHome/templates/menu.css index 199a163020..b95539af8c 100644 --- a/plugins/CoreHome/templates/menu.css +++ b/plugins/CoreHome/templates/menu.css @@ -11,6 +11,7 @@ line-height: 1.0; margin-bottom: 1.5em; position: relative; + width:100%; } .nav ul { @@ -56,7 +57,6 @@ left: 0; top: -999em; position: absolute; - width: 48em; } /* LEVEL1 HOVER */ diff --git a/plugins/ExampleUI/API.php b/plugins/ExampleUI/API.php new file mode 100644 index 0000000000..97f0ad8100 --- /dev/null +++ b/plugins/ExampleUI/API.php @@ -0,0 +1,101 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later + * @version $Id$ + * + */ + +class Piwik_ExampleUI_API +{ + static private $instance = null; + static public function getInstance() + { + if (self::$instance == null) + { + $c = __CLASS__; + self::$instance = new $c(); + } + return self::$instance; + } + + function getTemperaturesEvolution($date, $period) + { + $period = new Piwik_Period_Range($period, 'last30'); + $dateStart = $period->getDateStart()->get('Y-m-d'); // eg. "2009-04-01" + $dateEnd = $period->getDateEnd()->get('Y-m-d'); // eg. "2009-04-30" + + // here you could select from your custom table in the database, eg. + $query = "SELECT AVG(temperature) + FROM server_temperatures + WHERE date > ? + AND date < ? + GROUP BY date + ORDER BY date ASC"; + //$result = Piwik_FetchAll($query, array($dateStart, $dateEnd)); + // to keep things simple, we generate the data + foreach($period->getSubperiods() as $subPeriod) + { + $server1 = rand(50,90); + $server2 = rand(40, 110); + $value = array('server1' => $server1, 'server2' => $server2); + $temperatures[$subPeriod->getLocalizedShortString()] = $value; + } + + // convert this array to a DataTable object + $dataTable = new Piwik_DataTable(); + $dataTable->addRowsFromArrayWithIndexLabel($temperatures); + return $dataTable; + } + + // we generate an array of random server temperatures + function getTemperatures() + { + $xAxis = array( + '12AM', '1AM', '2AM', '3AM', '4AM', '5AM', '6AM', '7AM', '8AM', '9AM', '10AM', '11AM', + '12PM', '1PM', '2PM', '3PM', '4PM', '5PM', '6PM', '7PM', '8PM', '9PM', '10PM', '11PM', + ); + $temperatureValues = array_slice(range(50,90), 0, count($xAxis)); + shuffle($temperatureValues); + $temperatures = array(); + foreach($xAxis as $i => $xAxisLabel) { + $temperatures[$xAxisLabel] = $temperatureValues[$i]; + } + + // convert this array to a DataTable object + $dataTable = new Piwik_DataTable(); + $dataTable->addRowsFromArrayWithIndexLabel($temperatures); + return $dataTable; + } + + function getPlanetRatios() + { + $planetRatios = array( + 'Mercury' => 0.382, + 'Venus' => 0.949, + 'Earth' => 1.00, + 'Mars' => 0.532, + 'Jupiter' => 11.209, + 'Saturn' => 9.449, + 'Uranus' => 4.007, + 'Neptune' => 3.883, + ); + // convert this array to a DataTable object + $dataTable = new Piwik_DataTable(); + $dataTable->addRowsFromArrayWithIndexLabel($planetRatios); + return $dataTable; + } + + function getPlanetRatiosWithLogos() + { + $planetsDataTable = $this->getPlanetRatios(); + foreach($planetsDataTable->getRows() as $row) + { + $row->addMetadata('logo', "plugins/ExampleUI/images/icons-planet/".strtolower($row->getColumn('label').".png")); + $row->addMetadata('url', "http://en.wikipedia.org/wiki/".$row->getColumn('label')); + } + return $planetsDataTable; + } +}
\ No newline at end of file diff --git a/plugins/ExampleUI/Controller.php b/plugins/ExampleUI/Controller.php new file mode 100644 index 0000000000..92041a3fd5 --- /dev/null +++ b/plugins/ExampleUI/Controller.php @@ -0,0 +1,125 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later + * @version $Id$ + * + */ + +class Piwik_ExampleUI_Controller extends Piwik_Controller +{ + protected function getCustomData() + { + } + + function dataTables() + { + $view = Piwik_ViewDataTable::factory('table'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getTemperatures' ); + $view->setColumnTranslation('value', "Temperature in °C"); + $view->setGraphLimit( 24 ); + $view->setLimit( 24 ); + $view->disableExcludeLowPopulation(); + $view->disableShowAllColumns(); + $view->setAxisYUnit('°C'); // useful if the user requests the bar graph + return $this->renderView($view); + } + + function evolutionGraph() + { + echo "<h2>Evolution of server temperatures over the last few days</h2>"; + $this->echoEvolutionGraph(); + } + + function echoEvolutionGraph() + { + $view = Piwik_ViewDataTable::factory('graphEvolution'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getTemperaturesEvolution' ); + $view->setColumnTranslation('server1', "Temperature server piwik.org"); + $view->setColumnTranslation('server2', "Temperature server dev.piwik.org"); + $view->setAxisYUnit('°C'); // useful if the user requests the bar graph + return $this->renderView($view); + } + + function barGraph() + { + $view = Piwik_ViewDataTable::factory('graphVerticalBar'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getTemperatures' ); + $view->setColumnTranslation('value', "Temperature"); + $view->setAxisYUnit('°C'); + $view->setGraphLimit( 24 ); + $view->disableFooter(); + return $this->renderView($view); + } + + function pieGraph() + { + $view = Piwik_ViewDataTable::factory('graphPie'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getPlanetRatios' ); + $view->setColumnsToDisplay( 'value' ); + $view->setColumnTranslation('value', "times the diameter of Earth"); + $view->setGraphLimit( 10 ); + $view->disableFooterIcons(); + return $this->renderView($view); + } + + function tagClouds() + { + echo "<h2>Simple tag cloud</h2>"; + $this->echoSimpleTagClouds(); + + echo "<br/><br/><h2>Advanced tag cloud: with logos and links</h2> + <ul style='list-style-type:disc;margin-left:50px'> + <li>The logo size is proportional to the value returned by the API</li> + <li>The logo is linked to a specific URL</li> + </ul><br/><br/>"; + $this->echoAdvancedTagClouds(); + } + function echoSimpleTagClouds() + { + $view = Piwik_ViewDataTable::factory('cloud'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getPlanetRatios' ); + $view->setColumnsToDisplay( array('label','value') ); + $view->setColumnTranslation('value', "times the diameter of Earth"); + $view->disableFooter(); + $this->renderView($view); + } + function echoAdvancedTagClouds() + { + $view = Piwik_ViewDataTable::factory('cloud'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getPlanetRatiosWithLogos' ); + $view->displayLogoInTagCloud(); + $view->disableFooterExceptExportIcons(); + $view->setColumnsToDisplay( array('label','value') ); + $view->setColumnTranslation('value', "times the diameter of Earth"); + $this->renderView($view); + } + + function sparklines() + { + require_once "SmartyPlugins/function.sparkline.php"; + $srcSparkline1 = Piwik_Url::getCurrentQueryStringWithParametersModified(array('action'=>'generateSparkline', 'server' => 'server1', 'rand'=>rand())); + $htmlSparkline1 = smarty_function_sparkline(array('src' => $srcSparkline1)); + echo "<div class='sparkline'>$htmlSparkline1 Evolution of temperature for server piwik.org</div>"; + + $srcSparkline2 = Piwik_Url::getCurrentQueryStringWithParametersModified(array('action'=>'generateSparkline', 'server' => 'server2', 'rand'=>rand())); + $htmlSparkline2 = smarty_function_sparkline(array('src' => $srcSparkline2)); + echo "<div class='sparkline'>$htmlSparkline2 Evolution of temperature for server dev.piwik.org</div>"; + } + + function generateSparkline() + { + $serverRequested = Piwik_Common::getRequestVar('server'); + $view = Piwik_ViewDataTable::factory('sparkline'); + $view->init( $this->pluginName, __FUNCTION__, 'ExampleUI.getTemperaturesEvolution' ); + $view->setColumnsToDisplay($serverRequested); + $this->renderView($view); + } + + function sparklinesWithEvolutionGraph() + { + + } +}
\ No newline at end of file diff --git a/plugins/ExampleUI/ExampleUI.php b/plugins/ExampleUI/ExampleUI.php new file mode 100644 index 0000000000..8ef1e8e15f --- /dev/null +++ b/plugins/ExampleUI/ExampleUI.php @@ -0,0 +1,61 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later + * @version $Id$ + * + * @package Piwik_ExampleUI + */ + + +// TODO this plugin should be used to test all piwik UI features before release +/* +- prepare a page with all use cases +- test the actions datatable in this page? +- test datatable with search disabled +- test datatable with low population disabled +- without footer +- without all columns icon ++ update http://dev.piwik.org/trac/wiki/HowToTestUI +*/ +class Piwik_ExampleUI extends Piwik_Plugin +{ + public function getInformation() + { + return array( + 'name' => 'Example User Interface', + 'description' => 'Example Plugin: This plugin shows how to work with the Piwik UI: create tables, graphs, etc.', + 'author' => 'Piwik', + 'homepage' => 'http://piwik.org/', + 'version' => '0.1', + ); + } + + function getListHooksRegistered() + { + $hooks = array( + 'Menu.add' => 'addMenus', + ); + return $hooks; + } + + function addMenus() + { + $menus = array( + 'Data tables' => 'dataTables', + 'Evolution graph' => 'evolutionGraph', + 'Bar graph' => 'barGraph', + 'Pie graph' => 'pieGraph', + 'Tag clouds' => 'tagClouds', + 'Sparklines' => 'sparklines', + 'Sparklines with evolution graph' => 'sparklinesWithEvolutionGraph', + ); + foreach($menus as $subMenu => $action) + { + Piwik_AddMenu('UI Framework', $subMenu, array('module' => 'ExampleUI', 'action' => $action)); + } + } + +}
\ No newline at end of file diff --git a/plugins/ExampleUI/images/icons-planet/LICENSE b/plugins/ExampleUI/images/icons-planet/LICENSE new file mode 100644 index 0000000000..229295935c --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/LICENSE @@ -0,0 +1,3 @@ +Author : Dan Wiersema
+License: Free for non-commercial use.
+http://www.iconspedia.com/icon/neptune-4672.html
\ No newline at end of file diff --git a/plugins/ExampleUI/images/icons-planet/earth.png b/plugins/ExampleUI/images/icons-planet/earth.png Binary files differnew file mode 100644 index 0000000000..448f8a6373 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/earth.png diff --git a/plugins/ExampleUI/images/icons-planet/jupiter.png b/plugins/ExampleUI/images/icons-planet/jupiter.png Binary files differnew file mode 100644 index 0000000000..a337746530 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/jupiter.png diff --git a/plugins/ExampleUI/images/icons-planet/mars.png b/plugins/ExampleUI/images/icons-planet/mars.png Binary files differnew file mode 100644 index 0000000000..1335faab10 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/mars.png diff --git a/plugins/ExampleUI/images/icons-planet/mercury.png b/plugins/ExampleUI/images/icons-planet/mercury.png Binary files differnew file mode 100644 index 0000000000..90f72e69b6 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/mercury.png diff --git a/plugins/ExampleUI/images/icons-planet/neptune.png b/plugins/ExampleUI/images/icons-planet/neptune.png Binary files differnew file mode 100644 index 0000000000..c2acf71b30 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/neptune.png diff --git a/plugins/ExampleUI/images/icons-planet/saturn.png b/plugins/ExampleUI/images/icons-planet/saturn.png Binary files differnew file mode 100644 index 0000000000..5cbde1b1d4 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/saturn.png diff --git a/plugins/ExampleUI/images/icons-planet/uranus.png b/plugins/ExampleUI/images/icons-planet/uranus.png Binary files differnew file mode 100644 index 0000000000..3657d3d836 --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/uranus.png diff --git a/plugins/ExampleUI/images/icons-planet/venus.png b/plugins/ExampleUI/images/icons-planet/venus.png Binary files differnew file mode 100644 index 0000000000..41af2ae01f --- /dev/null +++ b/plugins/ExampleUI/images/icons-planet/venus.png diff --git a/plugins/Referers/API.php b/plugins/Referers/API.php index 47a214d190..0f0affebf4 100644 --- a/plugins/Referers/API.php +++ b/plugins/Referers/API.php @@ -50,9 +50,13 @@ class Piwik_Referers_API return $dataTable; } - function getRefererType($idSite, $period, $date) + function getRefererType($idSite, $period, $date, $typeReferer = false) { $dataTable = $this->getDataTable('Referers_type', $idSite, $period, $date, $expanded = false); + if($typeReferer !== false) + { + $dataTable->filter('Pattern', array('label', $typeReferer)); + } $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getRefererTypeLabel')); return $dataTable; } diff --git a/plugins/Referers/Controller.php b/plugins/Referers/Controller.php index 1ae05933c9..ed120e09e4 100644 --- a/plugins/Referers/Controller.php +++ b/plugins/Referers/Controller.php @@ -242,7 +242,6 @@ class Piwik_Referers_Controller extends Piwik_Controller $typeReferer = Piwik_Common::getRequestVar('typeReferer'); } $view->setColumnsToDisplay($columns); - $view->setSearchPattern($typeReferer, 'label'); $view->setParametersToModify(array('typeReferer' => $typeReferer)); foreach($columns as $columnName) { diff --git a/plugins/VisitsSummary/Controller.php b/plugins/VisitsSummary/Controller.php index d622dfb19b..48d43d97aa 100644 --- a/plugins/VisitsSummary/Controller.php +++ b/plugins/VisitsSummary/Controller.php @@ -29,7 +29,7 @@ class Piwik_VisitsSummary_Controller extends Piwik_Controller $view->setColumnsToDisplay($columns); return $this->renderView($view, $fetch); } - + static public function getVisitsSummary() { $requestString = "method=VisitsSummary.get". |