diff --git a/core/Tracker/TableLogAction.php b/core/Tracker/TableLogAction.php index b7ec978876eb4a24ba3af8a111e20ddee9f44ff2..25deaad0cd920715fa508537b57efdd5600f8724 100644 --- a/core/Tracker/TableLogAction.php +++ b/core/Tracker/TableLogAction.php @@ -233,6 +233,15 @@ class TableLogAction */ private static function guessActionTypeFromSegment($segmentName) { + $exactMatch = array( + 'eventAction' => Action::TYPE_EVENT_ACTION, + 'eventCategory' => Action::TYPE_EVENT_CATEGORY, + 'eventName' => Action::TYPE_EVENT_NAME, + ); + if(!empty($exactMatch[$segmentName])) { + return $exactMatch[$segmentName]; + } + if (stripos($segmentName, 'pageurl') !== false) { $actionType = Action::TYPE_PAGE_URL; return $actionType; @@ -243,7 +252,7 @@ class TableLogAction $actionType = Action::TYPE_SITE_SEARCH; return $actionType; } else { - throw new \Exception(" The segment $segmentName has an unexpected value."); + throw new \Exception("We cannot guess the action type from the segment $segmentName."); } } diff --git a/lang/en.json b/lang/en.json index 981aac3ffeeab0cd616a9acbd6b8c7a9e9a1c9a8..83a340a55dfdcb82f0482d00993e476deb95b120 100644 --- a/lang/en.json +++ b/lang/en.json @@ -2310,5 +2310,14 @@ "LoadingSegmentedDataMayTakeSomeTime": "Processing segmented visitor data may take a few minutes...", "AutoArchiveRealTime": "segmented reports are processed in real time", "AutoArchivePreProcessed": "segmented reports are pre-processed (faster, requires archive.php cron)" + }, + "Events": { + "Events": "Events", + "EventCategory": "Event Category", + "EventAction": "Event Action", + "EventName": "Event Name", + "EventValue": "Event Value", + "NbEvents": "Number of Events", + "": "" } } diff --git a/plugins/API/API.php b/plugins/API/API.php index 30e11f0fcb58a680d216e769cf6d952787625f4b..deda5cb0fba2278fb27251b227e89225809430f3 100644 --- a/plugins/API/API.php +++ b/plugins/API/API.php @@ -291,7 +291,7 @@ class API extends \Piwik\Plugin\API private function sortSegments($row1, $row2) { - $columns = array('type', 'category', 'name', 'segment'); + $columns = array('category', 'name', 'segment'); foreach ($columns as $column) { // Keep segments ordered alphabetically inside categories.. $type = -1; diff --git a/plugins/API/Controller.php b/plugins/API/Controller.php index e82d1923c0cc9b4adcd817ea7d91b36f91f7f5dc..8e8842858da22bb8693f5eb0cfeb7a17004030c8 100644 --- a/plugins/API/Controller.php +++ b/plugins/API/Controller.php @@ -15,6 +15,7 @@ use Piwik\API\Proxy; use Piwik\API\Request; use Piwik\Common; use Piwik\Config; +use Piwik\Piwik; use Piwik\View; /** @@ -58,6 +59,12 @@ class Controller extends \Piwik\Plugin\Controller $customVariables = 0; $lastCategory = array(); foreach ($segments as $segment) { + // Eg. Event Value is a metric, not in the Visit metric category, + // we make sure it is displayed along with the Events dimensions + if($segment['type'] == 'metric' && $segment['category'] != Piwik::translate('General_Visit')) { + $segment['type'] = 'dimension'; + } + $onlyDisplay = array('customVariableName1', 'customVariableName2', 'customVariableValue1', 'customVariableValue2', 'customVariablePageName1', 'customVariablePageValue1'); $customVariableWillBeDisplayed = in_array($segment['segment'], $onlyDisplay); // Don't display more than 4 custom variables name/value rows diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php index fa59748bb0b98836e228dcf96ce19089e14a19d5..f15e82ce07cc456c2bcb918e6c8f6945074ab16a 100644 --- a/plugins/Actions/Actions.php +++ b/plugins/Actions/Actions.php @@ -64,7 +64,7 @@ class Actions extends \Piwik\Plugin public function getSegmentsMetadata(&$segments) { - $sqlFilter = 'TableLogAction::getIdActionFromSegment'; + $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment'; // entry and exit pages of visit $segments[] = array( diff --git a/plugins/Events/Events.php b/plugins/Events/Events.php new file mode 100644 index 0000000000000000000000000000000000000000..d703066637f23f56ac77b9788275a69edc8ba907 --- /dev/null +++ b/plugins/Events/Events.php @@ -0,0 +1,75 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + * @category Piwik_Plugins + * @package Events + */ +namespace Piwik\Plugins\Events; + +use Piwik\Piwik; +use Piwik\Plugin; + +/** + * @package Events + */ +class Events extends Plugin +{ + /** + * @see Piwik\Plugin::getListHooksRegistered + */ + public function getListHooksRegistered() + { + return array( + 'API.getSegmentsMetadata' => 'getSegmentsMetadata', + ); + } + + public function getSegmentsMetadata(&$segments) + { + $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment'; + + $segments[] = array( + 'type' => 'dimension', + 'category' => 'Events_Events', + 'name' => 'Events_EventCategory', + 'segment' => 'eventCategory', + 'sqlSegment' => 'log_link_visit_action.idaction_event_category', + 'sqlFilter' => $sqlFilter, + ); + $segments[] = array( + 'type' => 'dimension', + 'category' => 'Events_Events', + 'name' => 'Events_EventAction', + 'segment' => 'eventAction', + 'sqlSegment' => 'log_link_visit_action.idaction_event_action', + 'sqlFilter' => $sqlFilter, + ); + $segments[] = array( + 'type' => 'dimension', + 'category' => 'Events_Events', + 'name' => 'Events_EventName', + 'segment' => 'eventName', + 'sqlSegment' => 'log_link_visit_action.idaction_name', + 'sqlFilter' => $sqlFilter, + ); + $segments[] = array( + 'type' => 'metric', + 'category' => 'Events_Events', + 'name' => 'Events_EventValue', + 'segment' => 'eventValue', + 'sqlSegment' => 'log_link_visit_action.custom_float' + ); + $segments[] = array( + 'type' => 'metric', + 'category' => Piwik::translate('General_Visit'), + 'name' => 'Events_NbEvents', + 'segment' => 'events', + 'sqlSegment' => 'log_visit.visit_total_events', + 'acceptedValues' => 'To select all visits who triggered an Event, use: &segment=events>0', + ); + } +} diff --git a/plugins/Events/plugin.json b/plugins/Events/plugin.json new file mode 100644 index 0000000000000000000000000000000000000000..908441b7b5830171db368257b04288bb0eafcec7 --- /dev/null +++ b/plugins/Events/plugin.json @@ -0,0 +1,6 @@ +{ + "name": "Events", + "version": "1.0", + "description": "Track Custom Events and get reports on your visitors activity.", + "theme": false +} \ No newline at end of file diff --git a/tests/PHPUnit/Integration/CustomEventsTest.php b/tests/PHPUnit/Integration/CustomEventsTest.php index 8ab5b8e06be3e3d69084f945fb4a590e4639b1e4..e2d64d161e645830bcd0a606b93c57a80efa7ad6 100644 --- a/tests/PHPUnit/Integration/CustomEventsTest.php +++ b/tests/PHPUnit/Integration/CustomEventsTest.php @@ -53,6 +53,32 @@ class Test_Piwik_Integration_CustomEvents extends IntegrationTestCase 'periods' => $periods, 'setDateLastN' => false, 'testSuffix' => '')), + + array('Actions.getPageUrls', array( + 'idSite' => $idSite1, + 'date' => $dateTime, + 'periods' => $dayPeriod, + 'segment' => "events>0", + 'setDateLastN' => false, + 'testSuffix' => '') + ), + // FIXMEA: Add Events.get* here + array('Actions.getPageUrls', array( + 'idSite' => $idSite1, + 'date' => $dateTime, + 'periods' => $dayPeriod, + 'segment' => "eventCategory==Movie,eventName==".urlencode('La fiancée de l\'eau'), + 'setDateLastN' => false, + 'testSuffix' => '_eventCategoryOrNameMatch') + ), + array('Actions.getPageUrls', array( + 'idSite' => $idSite1, + 'date' => $dateTime, + 'periods' => $dayPeriod, + 'segment' => "eventAction=@play", + 'setDateLastN' => false, + 'testSuffix' => '_eventActionContainsPlay') + ), ); // testing metadata API for one metadata report