details = $details; } /** * Makes it possible to extend the visitor details returned from API * * **Example:** * * public function extendVisitorDetails(&$visitor) { * $crmData = Model::getCRMData($visitor['userid']); * * foreach ($crmData as $prop => $value) { * $visitor[$prop] = $value; * } * } * * @param array $visitor */ public function extendVisitorDetails(&$visitor) { } /** * Makes it possible to enrich the action set for a single visit * * **Example:** * * public function provideActionsForVisit(&$actions, $visitorDetails) { * $adviews = Model::getAdviews($visitorDetails['visitid']); * $actions += $adviews; * } * * @param array $actions List of action to manipulate * @param array $visitorDetails */ public function provideActionsForVisit(&$actions, $visitorDetails) { } /** * Makes it possible to enrich the action set for multiple visits identified by given visit ids * * action set to enrich needs to have the following structure * * ``` * $actions = array ( * 'idvisit' => array ( list of actions for this visit id ), * 'idvisit' => array ( list of actions for this visit id ), * ... * ) * ``` * * **Example:** * * public function provideActionsForVisitIds(&$actions, $visitIds) { * $adviews = Model::getAdviewsByVisitIds($visitIds); * foreach ($adviews as $idVisit => $adView) { * $actions[$idVisit][] = $adView; * } * } * * @param array $actions action set to enrich * @param array $visitIds list of visit ids */ public function provideActionsForVisitIds(&$actions, $visitIds) { } /** * Allows filtering the provided actions * * **Example:** * * public function filterActions(&$actions, $visitorDetailsArray) { * foreach ($actions as $idx => $action) { * if ($action['type'] == 'customaction') { * unset($actions[$idx]); * continue; * } * } * } * * @param array $actions * @param array $visitorDetailsArray */ public function filterActions(&$actions, $visitorDetailsArray) { } /** * Allows extending each action with additional information * * **Example:** * * public function extendActionDetails(&$action, $nextAction, $visitorDetails) { * if ($action['type'] === 'Contents') { * $action['contentView'] = true; * } * } * * @param array $action * @param array $nextAction * @param array $visitorDetails */ public function extendActionDetails(&$action, $nextAction, $visitorDetails) { } /** * Called when rendering a single Action * * **Example:** * * public function renderAction($action, $previousAction, $visitorDetails) { * if ($action['type'] != Action::TYPE_CONTENT) { * return; * } * * $view = new View('@Contents/_actionContent.twig'); * $view->sendHeadersWhenRendering = false; * $view->action = $action; * $view->previousAction = $previousAction; * $view->visitInfo = $visitorDetails; * return $view->render(); * } * * @param array $action * @param array $previousAction * @param array $visitorDetails * @return string */ public function renderAction($action, $previousAction, $visitorDetails) { return ''; } /** * Called for rendering the tooltip on actions * returned array needs to look like this: * * ``` * array ( * 20, // order id * 'rendered html content' * ) * ``` * * **Example:** * * public function renderActionTooltip($action, $visitInfo) { * if (empty($action['bandwidth'])) { * return []; * } * * $view = new View('@Bandwidth/_actionTooltip'); * $view->action = $action; * return [[ 20, $view->render() ]]; * } * * @param array $action * @param array $visitInfo * @return array */ public function renderActionTooltip($action, $visitInfo) { return []; } /** * Called when rendering the Icons in visits log * * **Example:** * * public function renderIcons($visitorDetails) { * if (!empty($visitorDetails['avatar'])) { * return ''; * } * return ''; * } * * @param array $visitorDetails * @return string */ public function renderIcons($visitorDetails) { return ''; } /** * Called when rendering the visitor details in visits log * returned array needs to look like this: * array ( * 20, // order id * 'rendered html content' * ) * * **Example:** * * public function renderVisitorDetails($visitorDetails) { * $view = new View('@MyPlugin/_visitorDetails.twig'); * $view->visitInfo = $visitorDetails; * return $view->render(); * } * * @param array $visitorDetails * @return array */ public function renderVisitorDetails($visitorDetails) { return []; } /** * Allows manipulating the visitor profile properties * Will be called when visitor profile is initialized * * **Example:** * * public function initProfile($visit, &$profile) { * // initialize properties that will be filled based on visits or actions * $profile['totalActions'] = 0; * $profile['totalActionsOfMyType'] = 0; * } * * @param DataTable $visits * @param array $profile */ public function initProfile($visits, &$profile) { } /** * Allows manipulating the visitor profile properties based on included visits * Will be called for every action within the profile * * **Example:** * * public function handleProfileVisit($visit, &$profile) { * $profile['totalActions'] += $visit->getColumn('actions'); * } * * @param DataTable\Row $visit * @param array $profile */ public function handleProfileVisit($visit, &$profile) { } /** * Allows manipulating the visitor profile properties based on included actions * Will be called for every action within the profile * * **Example:** * * public function handleProfileAction($action, &$profile) * { * if ($action['type'] != 'myactiontype') { * return; * } * * $profile['totalActionsOfMyType']++; * } * * @param array $action * @param array $profile */ public function handleProfileAction($action, &$profile) { } /** * Will be called after iterating over all actions * Can be used to set profile information that requires data that was set while iterating over visits & actions * * **Example:** * * public function finalizeProfile($visits, &$profile) { * $profile['isPowerUser'] = false; * * if ($profile['totalActionsOfMyType'] > 20) { * $profile['isPowerUser'] = true; * } * } * * @param DataTable $visits * @param array $profile */ public function finalizeProfile($visits, &$profile) { } /** * @since Matomo 3.12 * @return Db|Db\AdapterInterface */ public function getDb() { return Db::getReader(); } }