Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/Controller.php2
-rw-r--r--core/DataTable.php16
-rw-r--r--core/DataTable/Filter/Sort.php2
-rw-r--r--core/Period.php8
-rw-r--r--core/Period/Range.php2
-rw-r--r--core/SmartyPlugins/function.sparkline.php2
-rw-r--r--core/ViewDataTable.php37
-rw-r--r--core/ViewDataTable/Cloud.php40
-rw-r--r--core/ViewDataTable/GenerateGraphData.php27
-rw-r--r--core/ViewDataTable/GenerateGraphData/ChartEvolution.php34
-rw-r--r--core/ViewDataTable/GenerateGraphHTML/ChartEvolution.php2
-rw-r--r--core/ViewDataTable/HtmlTable.php68
-rw-r--r--core/ViewDataTable/Sparkline.php50
-rw-r--r--core/Visualization/Chart.php25
-rw-r--r--core/Visualization/Chart/Evolution.php15
-rw-r--r--core/Visualization/Chart/Pie.php3
-rw-r--r--core/Visualization/Chart/VerticalBar.php6
-rw-r--r--core/Visualization/Cloud.php126
-rw-r--r--plugins/Actions/Controller.php1
-rw-r--r--plugins/CoreHome/templates/cloud.tpl3
-rw-r--r--plugins/CoreHome/templates/datatable.js3
-rw-r--r--plugins/CoreHome/templates/datatable.tpl8
-rw-r--r--plugins/CoreHome/templates/datatable_actions.tpl4
-rw-r--r--plugins/CoreHome/templates/datatable_actions_recursive.tpl4
-rw-r--r--plugins/CoreHome/templates/datatable_actions_subdatable.tpl2
-rw-r--r--plugins/CoreHome/templates/menu.css2
-rw-r--r--plugins/ExampleUI/API.php101
-rw-r--r--plugins/ExampleUI/Controller.php125
-rw-r--r--plugins/ExampleUI/ExampleUI.php61
-rw-r--r--plugins/ExampleUI/images/icons-planet/LICENSE3
-rw-r--r--plugins/ExampleUI/images/icons-planet/earth.pngbin0 -> 11823 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/jupiter.pngbin0 -> 10686 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/mars.pngbin0 -> 9837 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/mercury.pngbin0 -> 10322 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/neptune.pngbin0 -> 9770 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/saturn.pngbin0 -> 10561 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/uranus.pngbin0 -> 10358 bytes
-rw-r--r--plugins/ExampleUI/images/icons-planet/venus.pngbin0 -> 10557 bytes
-rw-r--r--plugins/Referers/API.php6
-rw-r--r--plugins/Referers/Controller.php1
-rw-r--r--plugins/VisitsSummary/Controller.php2
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}'> &nbsp; {$wordTruncated} &nbsp; </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
new file mode 100644
index 0000000000..448f8a6373
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/earth.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/jupiter.png b/plugins/ExampleUI/images/icons-planet/jupiter.png
new file mode 100644
index 0000000000..a337746530
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/jupiter.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/mars.png b/plugins/ExampleUI/images/icons-planet/mars.png
new file mode 100644
index 0000000000..1335faab10
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/mars.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/mercury.png b/plugins/ExampleUI/images/icons-planet/mercury.png
new file mode 100644
index 0000000000..90f72e69b6
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/mercury.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/neptune.png b/plugins/ExampleUI/images/icons-planet/neptune.png
new file mode 100644
index 0000000000..c2acf71b30
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/neptune.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/saturn.png b/plugins/ExampleUI/images/icons-planet/saturn.png
new file mode 100644
index 0000000000..5cbde1b1d4
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/saturn.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/uranus.png b/plugins/ExampleUI/images/icons-planet/uranus.png
new file mode 100644
index 0000000000..3657d3d836
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/uranus.png
Binary files differ
diff --git a/plugins/ExampleUI/images/icons-planet/venus.png b/plugins/ExampleUI/images/icons-planet/venus.png
new file mode 100644
index 0000000000..41af2ae01f
--- /dev/null
+++ b/plugins/ExampleUI/images/icons-planet/venus.png
Binary files differ
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".