diff --git a/core/Archive.php b/core/Archive.php index a909a76dfecc080e5c5de191f344d7bae721feb0..f5f658d440030fd2903db64a8dafcfdd5b9c8126 100644 --- a/core/Archive.php +++ b/core/Archive.php @@ -21,7 +21,7 @@ require_once 'Archive/Single.php'; * <pre> * $archive = Piwik_Archive::build($idSite = 1, $period = 'week', '2008-03-08' ); * $dataTable = $archive->getDataTable('Provider_hostnameExt'); - * $dataTable->queuefilter('ReplaceColumnNames'); + * $dataTable->queueFilter('ReplaceColumnNames'); * return $dataTable; * </pre> * diff --git a/core/Common.php b/core/Common.php index fd18c9571781920982f7b016ad8f0a4fc6fffa23..855e5b287af35acd4de208ee8a14142711c71a20 100644 --- a/core/Common.php +++ b/core/Common.php @@ -94,7 +94,7 @@ class Piwik_Common require_once "Zend/Auth.php"; require_once "Timer.php"; require_once "PluginsManager.php"; - require_once "Piwik.php"; + require_once "core/Piwik.php"; require_once "Access.php"; require_once "Auth.php"; require_once "API/Proxy.php"; @@ -497,22 +497,12 @@ class Piwik_Common return md5(uniqid(rand(), true)); } - /** - * Convert dotted IP to a stringified integer representation - * - * @return string ip - */ - static public function getIp() - { - return sprintf("%u", ip2long(self::getIpString())); - } - /** * Returns the best possible IP of the current user, in the format A.B.C.D * * @return string ip */ - static public function getIpString() + static public function getIp() { if(isset($_SERVER['HTTP_CLIENT_IP']) && ($ip = Piwik_Common::getFirstIpFromList($_SERVER['HTTP_CLIENT_IP'])) @@ -808,9 +798,9 @@ class Piwik_Common } if(function_exists('iconv') - && isset($GLOBALS['Piwik_SearchEngines'][$refererHost][2])) + && isset($GLOBALS['Piwik_SearchEngines'][$refererHost][3])) { - $charset = trim($GLOBALS['Piwik_SearchEngines'][$refererHost][2]); + $charset = trim($GLOBALS['Piwik_SearchEngines'][$refererHost][3]); if(!empty($charset)) { $key = @iconv($charset, 'utf-8//IGNORE', $key); diff --git a/core/DataFiles/SearchEngines.php b/core/DataFiles/SearchEngines.php index 814096265edbaf5880443ac52eddca6df35a86c4..a1aafd460f2984be4918027ca5ceb06aee58abc3 100644 --- a/core/DataFiles/SearchEngines.php +++ b/core/DataFiles/SearchEngines.php @@ -22,13 +22,14 @@ * The main search engine URL has to be at the top of the list for the given search Engine. * You can add new search engines icons by adding the icon in the plugins/Referers/images/SearchEngines directory * using the format "mainSearchEngineUrl.png". Example: www.google.com.png + * To help Piwik link directly the search engine result page for the keyword, specify the third entry in the array + * using the macro {k} that will automatically be replaced by the keyword. * * A simple example is: - * "www.google.com" => array("Google", "q"), + * "www.google.com" => array("Google", "q", "search?q={k}"), * * A more complicated example, with an array of possible variable names, and a custom charset: - * "www.baidu.com" => array("Baidu", array("wd","word","kw"), "gb2312"), - * + * "www.baidu.com" => array("Baidu", array("wd","word","kw"), "s?wd={k}", "gb2312"), */ if(!isset($GLOBALS['Piwik_SearchEngines'] )) { @@ -37,8 +38,8 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) //" " => array(" ", " " [, " "]), // 1 - "1.cz" => array("1.cz", "q", "iso-8859-2"), - "www.1.cz" => array("1.cz", "q", "iso-8859-2"), + "1.cz" => array("1.cz", "q", "index.php?q={k}", "iso-8859-2"), + "www.1.cz" => array("1.cz", "q", false, "iso-8859-2"), // 123people "www.123people.com" => array("123people", "search_term"), @@ -74,7 +75,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "acont.de" => array("Acont", "query"), //Alexa - "www.alexa.com" => array("Alexa", "q"), + "www.alexa.com" => array("Alexa", "q", "search?q={k}"), "alexa.com" => array("Alexa", "q"), //Alice Adsl @@ -118,7 +119,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "apollo7.de" => array("Apollo7", "query"), // AOL - "search.aol.com" => array("AOL", array("query", "q")), + "search.aol.com" => array("AOL", array("query", "q"), "aol/search?query={k}"), "aolsearch.aol.com" => array("AOL", array("query", "q")), "www.aolrecherche.aol.fr" => array("AOL", array("query", "q")), "www.aolrecherches.aol.fr" => array("AOL", array("query", "q")), @@ -148,7 +149,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "arianna.libero.it" => array("Arianna", "query"), // Ask - "www.ask.com" => array("Ask", array("ask","q")), + "www.ask.com" => array("Ask", array("ask","q"), "web?q={k}"), "web.ask.com" => array("Ask", array("ask","q")), "www.ask.co.uk" => array("Ask", "q"), "uk.ask.com" => array("Ask", "q"), @@ -160,7 +161,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "ask.jp" => array("Ask", "q"), // Atlas - "search.atlas.cz" => array("Atlas", "q", "windows-1250"), + "search.atlas.cz" => array("Atlas", "q", "?q={k}", "windows-1250"), // Austronaut "www2.austronaut.at" => array("Austronaut", "begriff"), @@ -169,11 +170,11 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "search.babylon.com" => array("Babylon (Powered by Google)","q"), // Baidu - "www.baidu.com" => array("Baidu", array("wd","word","kw"), "gb2312"), - "www1.baidu.com" => array("Baidu", array("wd","word","kw"), "gb2312"), - "zhidao.baidu.com" => array("Baidu", array("wd","word","kw"), "gb2312"), - "tieba.baidu.com" => array("Baidu", array("wd","word","kw"), "gb2312"), - "news.baidu.com" => array("Baidu", array("wd","word","kw"), "gb2312"), + "www.baidu.com" => array("Baidu", array("wd","word","kw"), "s?wd={k}", "gb2312"), + "www1.baidu.com" => array("Baidu", array("wd","word","kw"), false, "gb2312"), + "zhidao.baidu.com" => array("Baidu", array("wd","word","kw"), false, "gb2312"), + "tieba.baidu.com" => array("Baidu", array("wd","word","kw"), false, "gb2312"), + "news.baidu.com" => array("Baidu", array("wd","word","kw"), false, "gb2312"), "web.gougou.com" => array("Baidu", "search"), // BBC @@ -207,9 +208,9 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "www.cegetel.net" => array("Cegetel (Google)", "q"), // Centrum - "fulltext.centrum.cz" => array("Centrum", "q", "windows-1250"), - "morfeo.centrum.cz" => array("Centrum", "q", "windows-1250"), - "search.centrum.cz" => array("Centrum", "q", "windows-1250"), + "search.centrum.cz" => array("Centrum", "q", "index.php?q={k}", "windows-1250"), + "fulltext.centrum.cz" => array("Centrum", "q", false, "windows-1250"), + "morfeo.centrum.cz" => array("Centrum", "q", false, "windows-1250"), // Chello "www.chello.fr" => array("Chello", "q1"), @@ -218,7 +219,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "recherche.club-internet.fr" => array("Club Internet", "q"), // Conduit - "search.conduit.com" => array("Conduit.com (Powered by Google)", "q"), + "search.conduit.com" => array("Conduit.com", "q", "Results.aspx?q={k}"), // Comcast "www.comcast.net" => array("Comcast", "query"), @@ -238,7 +239,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "www.crossbot.de" => array("Crossbot", "q"), // Cuil - "www.cuil.com" => array("Cuil", "q"), + "www.cuil.com" => array("Cuil", "q", "search?q={k}"), // DasOertliche "www.dasoertliche.de" => array("DasOertliche", "kw"), @@ -301,7 +302,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "www.excite.fr" => array("Excite", "search"), // Exalead - "www.exalead.fr" => array("Exalead", "q"), + "www.exalead.fr" => array("Exalead", "q", "search/results?q={k}"), "www.exalead.com" => array("Exalead", "q"), // eo @@ -371,7 +372,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "ocnsearch.goo.ne.jp" => array("goo", "mt"), // Google - "www.google.com" => array("Google", "q"), + "www.google.com" => array("Google", "q", "search?q={k}"), "gogole.fr" => array("Google", "q"), "www.gogole.fr" => array("Google", "q"), "wwwgoogle.fr" => array("Google", "q"), @@ -555,7 +556,6 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "buscador.terra.es" => array("Google", "query"), "buscador.terra.cl" => array("Google", "query"), "buscador.terra.com.br" => array("Google", "query"), - "www.icq.com" => array("Google", "q"), "www.adelphia.net" => array("Google", "q"), "so.qq.com" => array("Google", "word"), "misc.skynet.be" => array("Google", "keywords"), @@ -566,7 +566,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) //Google Blogsearch - "blogsearch.google.com" => array("Google Blogsearch", "q"), + "blogsearch.google.com" => array("Google Blogsearch", "q", "blogsearch?q={k}"), "blogsearch.google.de" => array("Google Blogsearch", "q"), "blogsearch.google.fr" => array("Google Blogsearch", "q"), "blogsearch.google.co.uk" => array("Google Blogsearch", "q"), @@ -589,8 +589,9 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "directory.google.com" => array("Google Directory", " "), // Google Images - "images.google.com" => array("Google Images", "q"), + "images.google.com" => array("Google Images", "q", "images?q={k}"), "images.google.cz" => array("Google Images", "q"), + "images.google.lt" => array("Google Images", "q"), "images.google.hr" => array("Google Images", "q"), "images.google.hu" => array("Google Images", "q"), "images.google.com.kw" => array("Google Images", "q"), @@ -647,8 +648,6 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "images.google.ru" => array("Google Images", "q"), "images.google.se" => array("Google Images", "q"), "images.google.sk" => array("Google Images", "q"), - "images.google.com" => array("Google Images", "q"), - // Google News "news.google.com" => array("Google News", "q"), @@ -708,7 +707,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "blogs.icerocket.com" => array("Icerocket", "qt"), // ICQ - "www.icq.com" => array("ICQ", "q"), + "www.icq.com" => array("ICQ", "q", "search/results.php?q={k}"), "search.icq.com" => array("ICQ", "q"), // Ilse @@ -767,17 +766,17 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "recherche.toile.qc.ca" => array("La Toile Du Québec", "query"), // Live.com - "www.live.com" => array("Live", "q"), + "search.live.com" => array("Live", "q", "results.aspx?q={k}"), "beta.search.live.com" => array("Live", "q"), - "search.live.com" => array("Live", "q"), + "www.live.com" => array("Live", "q"), "search.msn.com" => array("Live", "q"), - "beta.search.msn.fr" => array("Live", "q"), + "beta.search.msn.fr" => array("Live", "q"), "search.msn.fr" => array("Live", "q"), "search.msn.es" => array("Live", "q"), "search.msn.se" => array("Live", "q"), - "search.latam.msn.com" => array("Live", "q"), + "search.latam.msn.com" => array("Live", "q"), "search.msn.nl" => array("Live", "q"), - "leguide.fr.msn.com" => array("Live", "s"), + "leguide.fr.msn.com" => array("Live", "s"), "leguide.msn.fr" => array("Live", "s"), "search.msn.co.jp" => array("Live", "q"), "search.msn.no" => array("Live", "q"), @@ -857,6 +856,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "home.meinestadt.de" => array("Meinestadt.de", "words"), // Mister Wong + "www.mister-wong.com" => array('Mister Wong', 'keywords', "search/?keywords={k}"), "www.mister-wong.de" => array('Mister Wong', 'keywords'), // Monstercrawler @@ -890,8 +890,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "ko.search.need2find.com" => array("Needtofind", "searchfor"), // Neti - "www.neti.ee" => array("Neti", "query", "iso-8859-1"), - "www.neti.ee/odp/" => array("Neti World", "query", "iso-8859-1"), + "www.neti.ee" => array("Neti", "query", "cgi-bin/otsing?query={k}", "iso-8859-1"), // Netster "www.netster.com" => array("Netster", "keywords"), @@ -953,10 +952,10 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "www.qualigo.nl" => array("Qualigo", "q"), // Rambler + "nova.rambler.ru" => array("Rambler", "query", "search?query={k}"), "search.rambler.ru" => array("Rambler", "words"), "www.rambler.ru" => array("Rambler", "words"), - "nova.rambler.ru" => array("Rambler", "query"), - "nova.rambler.ru" => array('Rambler', 'q'), + "nova.rambler.ru" => array("Rambler", "q"), // Reacteur.com "www.reacteur.com" => array("Reacteur", "kw"), @@ -1010,9 +1009,9 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "sesam.no" => array("Sesam", "q"), // Seznam + "search.seznam.cz" => array("Seznam", "q"), "search1.seznam.cz" => array("Seznam", "q"), "search2.seznam.cz" => array("Seznam", "q"), - "search.seznam.cz" => array("Seznam", "q"), // Sharelook "www.sharelook.fr" => array("Sharelook", "keyword"), @@ -1053,7 +1052,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "search-dyn.tiscali.it" => array("Tiscali", "key"), "www.tiscali.co.uk" => array("Tiscali", "query"), "search-dyn.tiscali.de" => array("Tiscali", "key"), - "hledani.tiscali.cz" => array("Tiscali", "query", "windows-1250"), + "hledani.tiscali.cz" => array("Tiscali", "query", false, "windows-1250"), // T-Online "suche.t-online.de" => array("T-Online", "q"), @@ -1083,7 +1082,8 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "beta.voila.fr" => array("Voila", "kw"), // Volny - "web.volny.cz" => array("Volny", "search", "windows-1250"), + "volny.zlatestranky.cz" => array("Volny", "search", "fulltext/?search={k}", "windows-1250"), + "web.volny.cz" => array("Volny", "search", false, "windows-1250"), // Wanadoo "search.ke.wanadoo.fr" => array("Wanadoo", "kw"), @@ -1100,7 +1100,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "www.x-recherche.com" => array("X-Recherche", "mots"), // Yahoo - "search.yahoo.com" => array("Yahoo!", "p"), + "search.yahoo.com" => array("Yahoo!", "p", "search?p={k}"), "ink.yahoo.com" => array("Yahoo!", "p"), "ink.yahoo.fr" => array("Yahoo!", "p"), "fr.ink.yahoo.com" => array("Yahoo!", "p"), @@ -1133,11 +1133,12 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "cf.dir.yahoo.com" => array("Yahoo! Directory", ""), "fr.dir.yahoo.com" => array("Yahoo! Directory", ""), - "images.search.yahoo.com" => array('Yahoo! Images', 'p'), + // Yahoo! Images + "images.search.yahoo.com" => array('Yahoo! Images', 'p', "search/images?p={k}"), // Yandex - "www.yandex.ru" => array("Yandex", "text"), - "yandex.ru" => array("Yandex", "text"), + "yandex.ru" => array("Yandex", "text", "yandsearch?text={k}"), + "www.yandex.ru" => array("Yandex", "text"), "search.yaca.yandex.ru" => array("Yandex", "text"), "ya.ru" => array("Yandex", "text"), "www.ya.ru" => array("Yandex", "text"), @@ -1193,8 +1194,8 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] )) "www.zoeken.nl" => array("Zoeken","query"), // Zoohoo - "zoohoo.cz" => array("Zoohoo", "q", "windows-1250"), - "www.zoohoo.cz" => array("Zoohoo", "q", "windows-1250"), + "zoohoo.cz" => array("Zoohoo", "q", "?q={k}", "windows-1250"), + "www.zoohoo.cz" => array("Zoohoo", "q", false, "windows-1250"), // Zoznam "www.zoznam.sk" => array("Zoznam", "s"), diff --git a/core/DataTable.php b/core/DataTable.php index b4f100b7b9476815d94de2bf31bc44fbb5ef7ed8..c69e4fad69f2c08cf176ae7dc82e99ca303884fb 100644 --- a/core/DataTable.php +++ b/core/DataTable.php @@ -485,6 +485,25 @@ class Piwik_DataTable return $this->rows[$id]; } + /** + * Returns a row that has the subtable ID matching the parameter + * + * @param int $idSubTable + * @return Piwik_DataTable_Row or false if not found + */ + public function getRowFromIdSubDataTable($idSubTable) + { + $idSubTable = (int)$idSubTable; + foreach($this->rows as $row) + { + if($row->getIdSubDataTable() === $idSubTable) + { + return $row; + } + } + return false; + } + /** * Add a row to the table and rebuild the index if necessary * diff --git a/core/DataTable/Filter.php b/core/DataTable/Filter.php index 64654905ce6930e5ab67652086972058e5f5d844..b1545a500d02c91f11f0c1d146f5085ab9bc0171 100644 --- a/core/DataTable/Filter.php +++ b/core/DataTable/Filter.php @@ -47,6 +47,7 @@ require_once "DataTable/Filter/ColumnCallbackAddMetadata.php"; require_once "DataTable/Filter/ColumnCallbackReplace.php"; require_once "DataTable/Filter/ColumnCallbackAddColumnPercentage.php"; require_once "DataTable/Filter/MetadataCallbackAddMetadata.php"; +require_once "DataTable/Filter/MetadataCallbackReplace.php"; require_once "DataTable/Filter/AddConstantMetadata.php"; require_once "DataTable/Filter/Null.php"; require_once "DataTable/Filter/ExcludeLowPopulation.php"; diff --git a/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php b/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php index 15ffab66c5bca8488594d6eb25351311a2b9b61c..4ac709634411042c60da0a22401936efddb24cae 100644 --- a/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php +++ b/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php @@ -9,7 +9,7 @@ * * Usage: * $nbVisits = Piwik_VisitsSummary_API::getVisits($idSite, $period, $date); - * $dataTable->queuefilter('ColumnCallbackAddColumnPercentage', array('nb_visits', 'nb_visits_percentage', $nbVisits, 1)); + * $dataTable->queueFilter('ColumnCallbackAddColumnPercentage', array('nb_visits', 'nb_visits_percentage', $nbVisits, 1)); * */ class Piwik_DataTable_Filter_ColumnCallbackAddColumnPercentage extends Piwik_DataTable_Filter diff --git a/core/DataTable/Filter/ColumnCallbackAddMetadata.php b/core/DataTable/Filter/ColumnCallbackAddMetadata.php index 36558c357faa418ce0ad0141446616c837ae05fe..0dd44f7003ba321f88851a30173c2beea70112cf 100644 --- a/core/DataTable/Filter/ColumnCallbackAddMetadata.php +++ b/core/DataTable/Filter/ColumnCallbackAddMetadata.php @@ -25,12 +25,14 @@ class Piwik_DataTable_Filter_ColumnCallbackAddMetadata extends Piwik_DataTable_F { private $columnToRead; private $functionToApply; + private $functionParameters; private $metadataToAdd; - public function __construct( $table, $columnToRead, $metadataToAdd, $functionToApply ) + public function __construct( $table, $columnToRead, $metadataToAdd, $functionToApply, $functionParameters = null ) { parent::__construct($table); $this->functionToApply = $functionToApply; + $this->functionParameters = $functionParameters; $this->columnToRead = $columnToRead; $this->metadataToAdd = $metadataToAdd; $this->filter(); @@ -41,7 +43,12 @@ class Piwik_DataTable_Filter_ColumnCallbackAddMetadata extends Piwik_DataTable_F foreach($this->table->getRows() as $key => $row) { $oldValue = $row->getColumn($this->columnToRead); - $newValue = call_user_func( $this->functionToApply, $oldValue); + $parameters = array($oldValue); + if(!is_null($this->functionParameters)) + { + $parameters = array_merge($parameters, $this->functionParameters); + } + $newValue = call_user_func_array( $this->functionToApply, $parameters); $row->addMetadata($this->metadataToAdd, $newValue); } } diff --git a/core/DataTable/Filter/ColumnCallbackReplace.php b/core/DataTable/Filter/ColumnCallbackReplace.php index ec296cb50e1a5b599ae81ec8843b859cd82f3e61..0fc435589ed8ac058b8ddcd5b7f0d99875a57343 100644 --- a/core/DataTable/Filter/ColumnCallbackReplace.php +++ b/core/DataTable/Filter/ColumnCallbackReplace.php @@ -34,14 +34,22 @@ class Piwik_DataTable_Filter_ColumnCallbackReplace extends Piwik_DataTable_Filte { foreach($this->table->getRows() as $key => $row) { - $parameters = array($row->getColumn($this->columnToFilter)); + $parameters = array($this->getElementToReplace($row, $this->columnToFilter)); if(!is_null($this->functionParameters)) { $parameters = array_merge($parameters, $this->functionParameters); } $newValue = call_user_func_array( $this->functionToApply, $parameters); - $row->setColumn($this->columnToFilter, $newValue); + $this->setElementToReplace($row, $this->columnToFilter, $newValue); } } + + protected function setElementToReplace($row, $columnToFilter, $newValue) + { + $row->setColumn($columnToFilter, $newValue); + } + protected function getElementToReplace($row, $columnToFilter) + { + return $row->getColumn($columnToFilter); + } } - diff --git a/core/DataTable/Filter/MetadataCallbackReplace.php b/core/DataTable/Filter/MetadataCallbackReplace.php new file mode 100644 index 0000000000000000000000000000000000000000..cf3d071b1a296f7d2741505eda3337716e849a8c --- /dev/null +++ b/core/DataTable/Filter/MetadataCallbackReplace.php @@ -0,0 +1,35 @@ +<?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_DataTable + */ + +/** + * Replace a metadata value with a new value resulting + * from the function called with the metadata's value + * + * @package Piwik_DataTable + * @subpackage Piwik_DataTable_Filter + */ +class Piwik_DataTable_Filter_MetadataCallbackReplace extends Piwik_DataTable_Filter_ColumnCallbackReplace +{ + public function __construct( $table, $metadataToFilter, $functionToApply, $functionParameters = null ) + { + parent::__construct($table, $metadataToFilter, $functionToApply, $functionParameters); + } + + protected function setElementToReplace($row, $metadataToFilter, $newValue) + { + $row->setMetadata($metadataToFilter, $newValue); + } + + protected function getElementToReplace($row, $metadataToFilter) + { + return $row->getMetadata($metadataToFilter); + } +} diff --git a/core/DataTable/Row.php b/core/DataTable/Row.php index d29b70f5e1a0b39376beeef49ba67f1ab67a49fc..de2a2c6831232adcb30633d725efc0776d6a5a05 100644 --- a/core/DataTable/Row.php +++ b/core/DataTable/Row.php @@ -276,7 +276,7 @@ class Piwik_DataTable_Row { $this->c[self::COLUMNS] = $columns; } - + /** * Set the value $value to the column called $name. * @@ -288,6 +288,17 @@ class Piwik_DataTable_Row $this->c[self::COLUMNS][$name] = $value; } + /** + * Set the value $value to the metadata called $name. + * + * @param string $name of the metadata to set + * @param mixed $value of the metadata to set + */ + public function setMetadata($name, $value) + { + $this->c[self::METADATA][$name] = $value; + } + /** * Add a new column to the row. If the column already exists, throws an exception * diff --git a/plugins/Actions/API.php b/plugins/Actions/API.php index f9725828d1e4c3406d6085aecfcc7cafc1c8b639..38521703e4d391206e57bd03380126f727ce5bd9 100644 --- a/plugins/Actions/API.php +++ b/plugins/Actions/API.php @@ -47,7 +47,7 @@ class Piwik_Actions_API $dataTable = $archive->getDataTable($name, $idSubtable); } $dataTable->filter('Sort', array('nb_visits', 'desc', $naturalSort = false, $expanded)); - $dataTable->queuefilter('ReplaceSummaryRowLabel'); + $dataTable->queueFilter('ReplaceSummaryRowLabel'); return $dataTable; } diff --git a/plugins/Live/Visitor.php b/plugins/Live/Visitor.php index 638dd91e65fcfac5b236ae99934c4943c38237a9..9a2a8c10d218b269306ff0215d94cf9926e932b7 100644 --- a/plugins/Live/Visitor.php +++ b/plugins/Live/Visitor.php @@ -168,10 +168,10 @@ class Piwik_Live_Visitor function getSearchEngineIcon() { - $searchEngine = $this->getSearchEngineUrl(); - if( !is_null($searchEngine) ) + $searchEngineUrl = $this->getSearchEngineUrl(); + if( !is_null($searchEngineUrl) ) { - return Piwik_getSearchEngineLogoFromName($searchEngine); + return Piwik_getSearchEngineLogoFromUrl($searchEngineUrl); } return null; } diff --git a/plugins/Provider/API.php b/plugins/Provider/API.php index 19b185c619a6e3776d8e10d38bb97c7b71cf2789..0e2c3f6dd91d097da7cab3ea365f0ee952f47bd6 100644 --- a/plugins/Provider/API.php +++ b/plugins/Provider/API.php @@ -34,9 +34,9 @@ class Piwik_Provider_API $archive = Piwik_Archive::build($idSite, $period, $date ); $dataTable = $archive->getDataTable('Provider_hostnameExt'); $dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS)); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'url', 'Piwik_getHostnameUrl')); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getHostnameName')); - $dataTable->queuefilter('ReplaceColumnNames'); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', 'Piwik_getHostnameUrl')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getHostnameName')); + $dataTable->queueFilter('ReplaceColumnNames'); return $dataTable; } } diff --git a/plugins/Referers/API.php b/plugins/Referers/API.php index 0f0affebf4ca6bd61dc03f7587b54e34f83fbcee..1ae24a1832f7867511ae5caf8e6e4563d1eb9703 100644 --- a/plugins/Referers/API.php +++ b/plugins/Referers/API.php @@ -45,8 +45,8 @@ class Piwik_Referers_API $dataTable = $archive->getDataTable($name, $idSubtable); } $dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS, 'desc', $naturalSort = false, $expanded)); - $dataTable->queuefilter('ReplaceColumnNames', array($expanded)); - $dataTable->queuefilter('ReplaceSummaryRowLabel'); + $dataTable->queueFilter('ReplaceColumnNames', array($expanded)); + $dataTable->queueFilter('ReplaceSummaryRowLabel'); return $dataTable; } @@ -57,7 +57,7 @@ class Piwik_Referers_API { $dataTable->filter('Pattern', array('label', $typeReferer)); } - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getRefererTypeLabel')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getRefererTypeLabel')); return $dataTable; } @@ -70,22 +70,33 @@ class Piwik_Referers_API function getSearchEnginesFromKeywordId($idSite, $period, $date, $idSubtable) { $dataTable = $this->getDataTable('Referers_searchEngineByKeyword',$idSite, $period, $date, $expanded = false, $idSubtable); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') ); - $dataTable->queuefilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromName') ); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') ); + $dataTable->queueFilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromUrl') ); + + // get the keyword and create the URL to the search result page + $keywords = $this->getKeywords($idSite, $period, $date); + $keyword = $keywords->getRowFromIdSubDataTable($idSubtable)->getColumn('label'); + $dataTable->queueFilter('MetadataCallbackReplace', array( 'url', 'Piwik_getSearchEngineUrlFromUrlAndKeyword', array($keyword)) ); return $dataTable; } function getSearchEngines($idSite, $period, $date, $expanded = false) { $dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $expanded); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') ); - $dataTable->queuefilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromName') ); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') ); + $dataTable->queueFilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromUrl') ); return $dataTable; } function getKeywordsFromSearchEngineId($idSite, $period, $date, $idSubtable) { $dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $expanded = false, $idSubtable); + + // get the search engine and create the URL to the search result page + $searchEngines = $this->getSearchEngines($idSite, $period, $date); + $searchEngines->applyQueuedFilters(); + $searchEngineUrl = $searchEngines->getRowFromIdSubDataTable($idSubtable)->getMetadata('url'); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromKeywordAndUrl', array($searchEngineUrl))); return $dataTable; } @@ -110,8 +121,8 @@ class Piwik_Referers_API function getUrlsFromWebsiteId($idSite, $period, $date, $idSubtable) { $dataTable = $this->getDataTable('Referers_urlByWebsite',$idSite, $period, $date, $expanded = false, $idSubtable); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'url', create_function('$label', 'return $label;')) ); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', create_function('$label', 'return $label;')) ); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl')); return $dataTable; } diff --git a/plugins/Referers/functions.php b/plugins/Referers/functions.php index 1683d9bdbcf427d242d8fd1e3e45da12ca08dbb5..c0118ae837816ad972af04d3ed7ad967cf1f4d73 100644 --- a/plugins/Referers/functions.php +++ b/plugins/Referers/functions.php @@ -23,14 +23,10 @@ function Piwik_getSearchEngineUrlFromName($name) return $url; } - -function Piwik_getSearchEngineLogoFromName($url) +function Piwik_getSearchEngineLogoFromUrl($url) { - require_once "DataFiles/SearchEngines.php"; - $beginningUrl = strpos($url,'//') + 2; - $pathInPiwik = 'plugins/Referers/images/searchEngines/%s.png'; - $pathWithCode = sprintf($pathInPiwik, substr($url,$beginningUrl)); + $pathWithCode = sprintf($pathInPiwik, Piwik_getSearchEngineHostFromUrl($url)); $absolutePath = PIWIK_INCLUDE_PATH . '/' . $pathWithCode; if(file_exists($absolutePath)) { @@ -39,6 +35,24 @@ function Piwik_getSearchEngineLogoFromName($url) return sprintf($pathInPiwik, 'xx'); } +function Piwik_getSearchEngineHostFromUrl($url) +{ + return substr($url, strpos($url,'//') + 2); +} + +function Piwik_getSearchEngineUrlFromUrlAndKeyword($url, $keyword) +{ + require_once "DataFiles/SearchEngines.php"; + $keyword = urlencode($keyword); + $path = @$GLOBALS['Piwik_SearchEngines'][Piwik_getSearchEngineHostFromUrl($url)][2]; + $path = str_replace("{k}", $keyword, $path); + return $url . '/' . $path; +} + +function Piwik_getSearchEngineUrlFromKeywordAndUrl($keyword, $url) +{ + return Piwik_getSearchEngineUrlFromUrlAndKeyword($url, $keyword); +} function Piwik_getRefererTypeLabel($label) { diff --git a/plugins/Referers/images/searchEngines/www.rambler.ru.png b/plugins/Referers/images/searchEngines/nova.rambler.ru.png similarity index 100% rename from plugins/Referers/images/searchEngines/www.rambler.ru.png rename to plugins/Referers/images/searchEngines/nova.rambler.ru.png diff --git a/plugins/Referers/images/searchEngines/www.live.com.png b/plugins/Referers/images/searchEngines/search.live.com.png similarity index 100% rename from plugins/Referers/images/searchEngines/www.live.com.png rename to plugins/Referers/images/searchEngines/search.live.com.png diff --git a/plugins/Referers/images/searchEngines/search2.seznam.cz.png b/plugins/Referers/images/searchEngines/search2.seznam.cz.png deleted file mode 100644 index 49ea24c48cc7eefe6c7dee9a2cd05e7250b37831..0000000000000000000000000000000000000000 Binary files a/plugins/Referers/images/searchEngines/search2.seznam.cz.png and /dev/null differ diff --git a/plugins/Referers/images/searchEngines/web.volny.cz.png b/plugins/Referers/images/searchEngines/volny.zlatestranky.cz.png similarity index 100% rename from plugins/Referers/images/searchEngines/web.volny.cz.png rename to plugins/Referers/images/searchEngines/volny.zlatestranky.cz.png diff --git a/plugins/UserCountry/API.php b/plugins/UserCountry/API.php index 976f649344932a460508263b23c9c16f1a0c452a..ba54bcfab877adbc7ad8e7d4b6ce094c352d1b30 100644 --- a/plugins/UserCountry/API.php +++ b/plugins/UserCountry/API.php @@ -35,8 +35,8 @@ class Piwik_UserCountry_API $dataTable->filter('ColumnCallbackAddMetadata', array('label', 'code', create_function('$label', 'return $label;'))); $dataTable->filter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getFlagFromCode')); $dataTable->filter('ColumnCallbackReplace', array('label', 'Piwik_CountryTranslate')); - $dataTable->queuefilter('AddConstantMetadata', array('logoWidth', 18)); - $dataTable->queuefilter('AddConstantMetadata', array('logoHeight', 12)); + $dataTable->queueFilter('AddConstantMetadata', array('logoWidth', 18)); + $dataTable->queueFilter('AddConstantMetadata', array('logoHeight', 12)); return $dataTable; } @@ -44,7 +44,7 @@ class Piwik_UserCountry_API { $dataTable = $this->getDataTable('UserCountry_continent', $idSite, $period, $date); $dataTable->filter('ColumnCallbackReplace', array('label', 'Piwik_ContinentTranslate')); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'code', create_function('$label', 'return $label;'))); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'code', create_function('$label', 'return $label;'))); return $dataTable; } @@ -54,7 +54,7 @@ class Piwik_UserCountry_API $archive = Piwik_Archive::build($idSite, $period, $date ); $dataTable = $archive->getDataTable($name); $dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS)); - $dataTable->queuefilter('ReplaceColumnNames'); + $dataTable->queueFilter('ReplaceColumnNames'); return $dataTable; } diff --git a/plugins/UserSettings/API.php b/plugins/UserSettings/API.php index 9b51464a70fdbbbbd14241b3f57ba8affa77807e..2fe37170549e7ec4946b0a2d4ef93ba0dbec0610 100644 --- a/plugins/UserSettings/API.php +++ b/plugins/UserSettings/API.php @@ -33,7 +33,7 @@ class Piwik_UserSettings_API $archive = Piwik_Archive::build($idSite, $period, $date ); $dataTable = $archive->getDataTable($name); $dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS)); - $dataTable->queuefilter('ReplaceColumnNames'); + $dataTable->queueFilter('ReplaceColumnNames'); return $dataTable; } public function getResolution( $idSite, $period, $date ) @@ -45,49 +45,49 @@ class Piwik_UserSettings_API public function getConfiguration( $idSite, $period, $date ) { $dataTable = $this->getDataTable('UserSettings_configuration', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getConfigurationLabel')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getConfigurationLabel')); return $dataTable; } public function getOS( $idSite, $period, $date ) { $dataTable = $this->getDataTable('UserSettings_os', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getOSLogo')); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'shortLabel', 'Piwik_getOSShortLabel') ); - $dataTable->queuefilter('ColumnCallbackReplace', array( 'label', 'Piwik_getOSLabel') ); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getOSLogo')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'shortLabel', 'Piwik_getOSShortLabel') ); + $dataTable->queueFilter('ColumnCallbackReplace', array( 'label', 'Piwik_getOSLabel') ); return $dataTable; } public function getBrowser( $idSite, $period, $date ) { $dataTable = $this->getDataTable('UserSettings_browser', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getBrowsersLogo')); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'Piwik_getBrowserShortLabel')); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserLabel')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getBrowsersLogo')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'Piwik_getBrowserShortLabel')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserLabel')); return $dataTable; } public function getBrowserType( $idSite, $period, $date ) { $dataTable = $this->getDataTable('UserSettings_browserType', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'ucfirst')); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserTypeLabel')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'ucfirst')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserTypeLabel')); return $dataTable; } public function getWideScreen( $idSite, $period, $date ) { $dataTable = $this->getDataTable('UserSettings_wideScreen', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getScreensLogo')); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'ucfirst')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getScreensLogo')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'ucfirst')); return $dataTable; } public function getPlugin( $idSite, $period, $date ) { $dataTable = $this->getDataTable('UserSettings_plugin', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getPluginsLogo')); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'ucfirst')); + $dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getPluginsLogo')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'ucfirst')); return $dataTable; } } diff --git a/plugins/VisitTime/API.php b/plugins/VisitTime/API.php index 0e88059befcd5b6363860fb18c474ed40e30fea3..6290a6030605401a818dc01f84c717cecc109f28 100644 --- a/plugins/VisitTime/API.php +++ b/plugins/VisitTime/API.php @@ -33,8 +33,8 @@ class Piwik_VisitTime_API $archive = Piwik_Archive::build($idSite, $period, $date ); $dataTable = $archive->getDataTable($name); $dataTable->filter('Sort', array('label', 'asc', true)); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getTimeLabel')); - $dataTable->queuefilter('ReplaceColumnNames'); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getTimeLabel')); + $dataTable->queueFilter('ReplaceColumnNames'); return $dataTable; } diff --git a/plugins/VisitorInterest/API.php b/plugins/VisitorInterest/API.php index 9d7be0264e45f62599699ec088c29c11f8349476..3a95380a663cbb4bb99176ad4f422c692e4dd2b8 100644 --- a/plugins/VisitorInterest/API.php +++ b/plugins/VisitorInterest/API.php @@ -32,22 +32,22 @@ class Piwik_VisitorInterest_API $archive = Piwik_Archive::build($idSite, $period, $date ); $dataTable = $archive->getDataTable($name); $dataTable->filter('Sort',array(Piwik_Archive::INDEX_NB_VISITS)); - $dataTable->queuefilter('ReplaceColumnNames'); - $dataTable->queuefilter('Sort', array('label', 'asc', true)); + $dataTable->queueFilter('ReplaceColumnNames'); + $dataTable->queueFilter('Sort', array('label', 'asc', true)); return $dataTable; } public function getNumberOfVisitsPerVisitDuration( $idSite, $period, $date ) { $dataTable = $this->getDataTable('VisitorInterest_timeGap', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getDurationLabel')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getDurationLabel')); return $dataTable; } public function getNumberOfVisitsPerPage( $idSite, $period, $date ) { $dataTable = $this->getDataTable('VisitorInterest_pageGap', $idSite, $period, $date); - $dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getPageGapLabel')); + $dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getPageGapLabel')); return $dataTable; } } diff --git a/tests/core/Common.test.php b/tests/core/Common.test.php index 574e5fe210708b8306338d4c8addf7b030335953..1f7c3d8623ce5d6404fb5af88de3518cd4a3f3b2 100755 --- a/tests/core/Common.test.php +++ b/tests/core/Common.test.php @@ -585,6 +585,18 @@ class Test_Piwik_Common extends UnitTestCase } } + public function test_SearchEngines_areDefinedCorrectly() + { + require_once "DataFiles/SearchEngines.php"; + foreach($GLOBALS['Piwik_SearchEngines'] as $host => $info) + { + if(isset($info[2]) && $info[2] !== false) + { + $this->assertTrue(strrpos($info[2], "{k}") !== false, "$host search URL is not defined correctly, found {$info[2]} but must contain the macro {k}"); + } + } + } + public function test_extractSearchEngineInformationFromUrl() { $urls = array( diff --git a/tests/core/DataTable.test.php b/tests/core/DataTable.test.php index b9f679acd4a8fc199e1100793329311cd28469f7..878ca2e5ef671d2648987cc5ba12ffb16a9fac26 100644 --- a/tests/core/DataTable.test.php +++ b/tests/core/DataTable.test.php @@ -76,6 +76,22 @@ class Test_Piwik_DataTable extends UnitTestCase $this->assertTrue($table->getLastRow(), $table->getRowFromId($rowsCount-2)); } + public function test_getRowFromIdSubDataTable() + { + $table1 = $this->getDataTable1ForTest(); + $idTable1 = $table1->getId(); + $table2 = $this->getDataTable2ForTest(); + $this->assertEqual($table2->getRowFromIdSubDataTable($idTable1), false); + + $table2->getFirstRow()->addSubtable($table1); + $this->assertEqual($table2->getRowFromIdSubDataTable($idTable1), $table2->getFirstRow()); + + $table3 = $this->getDataTable1ForTest(); + $idTable3 = $table3->getId(); + $table2->getLastRow()->addSubtable($table3); + $this->assertEqual($table2->getRowFromIdSubDataTable($idTable3), $table2->getLastRow()); + } + /** * we test the count rows and the count rows recursive version * on a Simple array (1 level only)