PDF rausgenommen

This commit is contained in:
aschwarz
2023-01-23 11:03:31 +01:00
parent 82d562a322
commit a6523903eb
28078 changed files with 4247552 additions and 2 deletions

View File

@ -0,0 +1,37 @@
<li class="{% if action.goalName is defined %}goal{% else %}action{% endif %}"
title="{{ postEvent('Live.renderActionTooltip', action, visitInfo) }}">
<div>
{# Page view / Download / Outlink #}
{% if action.pageTitle|default(false) is not empty %}
<span class="truncated-text-line">{{ action.pageTitle|rawSafeDecoded }}</span>
{% endif %}
{% if action.siteSearchKeyword is defined %}
{% if action.type == 'search' %}
<img src='{{ action.iconSVG|default(action.icon) }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}'
class="action-list-action-icon search">
{% endif %}
<span class="truncated-text-line">{{ action.siteSearchKeyword|rawSafeDecoded }}</span>
{% endif %}
{% if action.url is not empty %}
{% if action.iconSVG|default(action.icon) is not empty %}
<img src='{{ action.iconSVG|default(action.icon) }}' class="action-list-action-icon {{ action.type }}">
{% endif %}
{% if action.type == 'action' and action.pageTitle|default(false) is not empty %}<p>{% endif %}
{% if action.url|trim|lower starts with 'javascript:' or
action.url|trim|lower starts with 'vbscript:' or
action.url|trim|lower starts with 'data:' %}
{{ action.url }}
{% else %}
<a href="{{ action.url|safelink|e('html_attr') }}" rel="noreferrer noopener" target="_blank"
class="action-list-url truncated-text-line">
{{ action.url|replace({'http://': '', 'https://': ''}) }}
</a>
{% endif %}
{% if action.type == 'action' and action.pageTitle|default(false) is not empty %}</p>{% endif %}
{% elseif action.type != 'search' %}
<p>
<span>{{ 'General_NotDefined'|translate('Actions_ColumnPageURL'|translate) }}</span>
</p>
{% endif %}
</div>
</li>

View File

@ -0,0 +1,54 @@
<li class="action"
title="{{ postEvent('Live.renderActionTooltip', action, visitInfo) }}">
<div>
{# Ecommerce Abandoned Cart / Ecommerce Order #}
<img src="{{ action.iconSVG|default(action.icon) }}" class="action-list-action-icon"/>
{% if action.type == 'ecommerceOrder' %}
<strong>{{ 'Goals_EcommerceOrder'|translate }}</strong>
<span style='color:#666;'>({{ action.orderId }})</span>
{% else %}
<strong>{{ 'Goals_AbandonedCart'|translate }}</strong>
{# TODO: would be nice to have the icons Orders / Cart in the ecommerce log footer #}
{% endif %}
<p>
<span {% if not isWidget %}style='margin-left:22px;'{% endif %}>
{% if action.type == 'ecommerceOrder' %}
{# spacing is important for tooltip to look nice #}
{% set ecommerceOrderTooltip %}{{ 'General_ColumnRevenue'|translate }}: {{ action.revenue|money(visitInfo.idSite)|raw }}
{% if action.revenueSubTotal is not empty %} - {{ 'General_Subtotal'|translate }}: {{ action.revenueSubTotal|money(visitInfo.idSite)|raw }}{% endif %}
{% if action.revenueTax is not empty %} - {{ 'General_Tax'|translate }}: {{ action.revenueTax|money(visitInfo.idSite)|raw }}{% endif %}
{% if action.revenueShipping is not empty %} - {{ 'General_Shipping'|translate }}: {{ action.revenueShipping|money(visitInfo.idSite)|raw }}{% endif %}
{% if action.revenueDiscount is not empty %} - {{ 'General_Discount'|translate }}: {{ action.revenueDiscount|money(visitInfo.idSite)|raw }}{% endif %}
{% endset %}
<abbr title="{{ ecommerceOrderTooltip }}">{{ 'General_ColumnRevenue'|translate }}:
{% else %}
{% set revenueLeft %}{{ 'General_ColumnRevenue'|translate }}{% endset %}
{{ 'Goals_LeftInCart'|translate(revenueLeft) }}:
{% endif %}
<strong>{{ action.revenue|money(visitInfo.idSite)|raw }}</strong>
{% if action.type == 'ecommerceOrder' %}
</abbr>
{% endif %}, {{ 'General_Quantity'|translate }}: {{ action.items }}
{# Ecommerce items in Cart/Order #}
{% if action.itemDetails is not empty %}
<ul style='list-style:square;margin-left:{% if isWidget %}15{% else %}50{% endif %}px;'>
{% for product in action.itemDetails %}
<li>
{{ product.itemSKU }}{% if product.itemName is not empty %}: {{ product.itemName }}{% endif %}
{% if product.itemCategory is not empty %} ({{ product.itemCategory }}){% endif %}
,
{{ 'General_Quantity'|translate }}: {{ product.quantity }},
{{ 'General_Price'|translate }}: {{ product.price|money(visitInfo.idSite)|raw }}
</li>
{% endfor %}
</ul>
{% endif %}
</span>
</p>
</div>
</li>

View File

@ -0,0 +1,11 @@
<li class="action"
title="{{ postEvent('Live.renderActionTooltip', action, visitInfo) }}">
<div>
{# Goal conversion #}
<img src="{{ action.iconSVG|default(action.icon) }}" class="action-list-action-icon" />
<strong>{{ action.goalName }}</strong>
{% if action.revenue > 0 %}, {{ 'General_ColumnRevenue'|translate }}:
<strong>{{ action.revenue|money(visitInfo.idSite)|raw }}</strong>
{% endif %}
</div>
</li>

View File

@ -0,0 +1,8 @@
{{ action.serverTimePretty }}{% if action.url is defined and action.url|trim|length %}
{{ action.url }}{% endif %}{%- if action.generationTime is defined %}
{{ 'General_ColumnGenerationTime'|translate }}: {{ action.generationTime|raw }}{% endif %}
{%- if action.timeSpentPretty is defined %}
{{ 'General_TimeOnPage'|translate }}: {{ action.timeSpentPretty|raw }}{% endif -%}

View File

@ -0,0 +1,14 @@
{% set previousAction = false %}
{% for action in actionDetails %}
{{ postEvent('Live.renderAction', action, previousAction, visitInfo) }}
{% set previousAction = action %}
{% endfor %}
{% if visitInfo.truncatedActionsCount is defined %}
<li class="more">
<span class="icon-info"></span>
{{ 'Live_MorePagesNotDisplayed'|translate }}
</li>
{% endif %}

View File

@ -0,0 +1,54 @@
{% set displayVisitorsInOwnColumn = (isWidget ? false : true) %}
{% set cycleIndex=0 %}
{% for visitor in dataTable.getRows() %}
{% set visitorRow %}
<div class="card row hoverable">
{% if visitor.getColumn('visitorId') is not empty and not clientSideParameters.hideProfileLink %}
<a class="visitor-log-visitor-profile-link visitorLogTooltip" data-visitor-id="{{ visitor.getColumn("visitorId") }}">
<img src="plugins/Live/images/visitorProfileLaunch.png"/> <span>{{ 'Live_ViewVisitorProfile'|translate }}
{%- if visitor.getColumn('userId') is not empty %}: {{ visitor.getColumn('userId')|rawSafeDecoded }}{% endif %}</span>
</a>
{% endif %}
{% set cycleIndex=cycleIndex+1 %}
<div class="col s12 m{% if displayVisitorsInOwnColumn %}3{% else %}4{% endif %}">
{{ postEvent('Live.renderVisitorDetails', visitor) }}
</div>
{% if displayVisitorsInOwnColumn %}
<div class="col s12 m2 own-visitor-column">
{{ postEvent('Live.renderVisitorIcons', visitor) }}
</div>
{% endif %}
<div class="col s12 m{% if displayVisitorsInOwnColumn %}7{% else %}8{% endif %} column {% if visitor.getColumn('visitConverted') and not isWidget %}highlightField{% endif %}">
{{ postEvent('Live.visitorLogViewBeforeActionsInfo', visitor) }}
<strong>
{% set actionCount = visitor.getColumn('actionDetails')|length %}
{% if visitor.truncatedActionsCount is defined %}
{% set actionCount = actionCount + visitor.truncatedActionsCount %}
{% endif %}
{{ actionCount }}
{% if actionCount <= 1 %}
{{ 'General_Action'|translate }}
{% else %}
{{ 'General_Actions'|translate }}
{% endif %}
{% if visitor.getColumn('visitDuration') > 0 %}- {{ visitor.getColumn('visitDurationPretty')|raw }}{% endif %}
</strong>
<div class="visitor-log-page-list">
<ol class='visitorLog'>
{% include "@Live/_actionsList.twig" with {'actionDetails': visitor.getColumn('actionDetails'), 'visitInfo': visitor} %}
</ol>
</div>
{{ postEvent('Live.visitorLogViewAfterActionsInfo', visitor) }}
</div>
</div>
{% endset %}
{{ visitorRow }}
{% endfor %}

View File

@ -0,0 +1,48 @@
{% set pageviewDetails %}
{{ visitorData.totalUniquePageViews }} {{ 'General_ColumnUniquePageviews'|translate }}, {{ visitorData.totalRevisitedPages }} {{ 'Actions_RevisitedPages'|translate }}
{% endset %}
<div class="visitor-profile-summary visitor-profile-resume">
<h1>{{ 'General_Summary'|translate }}</h1>
<div>
{% if visitorData.hasMoreVisits %}
<p>{{ 'Live_LimitedSummary'|translate('<strong>' ~ visitorData.totalVisits ~ '</strong>')|raw }}</p>
{% endif %}
{% if visitorData.totalPageViews != visitorData.totalActions %}
{% set actionDetails = [] %}
{% if visitorData.totalPageViews > 0 %}{% set actionDetails = actionDetails|merge(['<span title="' ~ pageviewDetails ~ '">' ~ visitorData.totalPageViews ~ ' ' ~ 'General_ColumnPageviews'|translate ~ '</span>']) %}{% endif %}
{% if visitorData.totalEvents is defined and visitorData.totalEvents > 0 %}{% set actionDetails = actionDetails|merge([visitorData.totalEvents ~ ' ' ~ 'Events_Events'|translate]) %}{% endif %}
{% if visitorData.totalDownloads > 0 %}{% set actionDetails = actionDetails|merge([visitorData.totalDownloads ~ ' ' ~ 'General_Downloads'|translate]) %}{% endif %}
{% if visitorData.totalOutlinks > 0 %}{% set actionDetails = actionDetails|merge([visitorData.totalOutlinks ~ ' ' ~ 'General_Outlinks'|translate]) %}{% endif %}
{% if visitorData.totalSearches > 0 %}{% set actionDetails = actionDetails|merge([visitorData.totalSearches ~ ' ' ~ 'Actions_ColumnSearches'|translate]) %}{% endif %}
<p>{{ 'Live_VisitSummaryWithActionDetails'|translate('<strong>' ~ visitorData.totalVisitDurationPretty ~ '</strong>', '', '', '<strong>' ~ visitorData.totalActions, '</strong>', actionDetails|join(', ') , '<strong>' ~ visitorData.totalVisits, '</strong>')|raw }}</p>
{% else %}
<p>{{ 'Live_VisitSummary'|translate('<strong>' ~ visitorData.totalVisitDurationPretty ~ '</strong>', '', '', '<strong title="' ~ pageviewDetails ~ '">' ~ visitorData.totalActions, '</strong>', '<strong>' ~ visitorData.totalVisits, '</strong>')|raw }}</p>
{% endif %}
{% if visitorData.totalGoalConversions is defined %}
<p>{% if visitorData.totalGoalConversions %}<strong>{% endif %}{{ 'Live_ConvertedNGoals'|translate(visitorData.totalGoalConversions) }}{% if visitorData.totalGoalConversions %}</strong>{% endif %}
{%- if visitorData.totalGoalConversions %}
{% set goalList %}
{%- for idGoal, totalConversions in visitorData.totalConversionsByGoal -%}
{%- set idGoal = idGoal[7:] -%}
{% if goals[idGoal] is defined %}
{%- if not loop.first %}, {% endif -%}{{- totalConversions }} {{ goals[idGoal]['name'] -}}
{% endif %}
{%- endfor -%}
{% endset %}
{% if goalList %}({{ goalList }}){% endif %}
{%- endif %}.</p>
{% endif %}
{% if visitorData.totalSearches|default(0) %}
<p>
{{ 'Actions_WidgetSearchKeywords'|translate }}:
{%- for entry in visitorData.searches %} <strong title="{% if entry.searches == 1 %}{{ 'Actions_OneSearch'|translate }}{% else %}{{ 'UserCountryMap_Searches'|translate(entry.searches) }}{% endif %}">{{ entry.keyword }}</strong>{% if not loop.last %},{% endif %}{% endfor %}
</p>
{% endif %}
{% if visitorData.averagePageGenerationTime is defined %}
<p title="{{ 'Live_CalculatedOverNPageViews'|translate(visitorData.totalPageViewsWithTiming) }}">
{{ 'Live_AveragePageGenerationTime'|translate('<strong>' ~ visitorData.averagePageGenerationTime ~ 's</strong>')|raw }}
</p>
{% endif %}
</div>
</div>

View File

@ -0,0 +1,39 @@
<div class="visitor-profile-summary visitor-profile-important-visits">
{%- set keywordNotDefined = 'General_NotDefined'|translate('General_ColumnKeyword'|translate) -%}
<div>
<h1>{% if visitorData.visitsAggregated == 100 %}{{ 'General_Visit'|translate }}# 100{% else %}{{ 'Live_FirstVisit'|translate }}{% endif %}</h1>
<div>
<p><strong>{{ visitorData.firstVisit.prettyDate }}</strong>&nbsp;- {{ 'UserCountryMap_DaysAgo'|translate(visitorData.firstVisit.daysAgo) }}</p>
<p>
{{ 'General_FromReferrer'|translate }} <strong {% if visitorData.firstVisit.referrerType == 'search' and '(' not in visitorData.firstVisit.referralSummary %}title="{{ keywordNotDefined }}"{% endif %}>
{%- if visitorData.firstVisit.referrerType == 'website' %}
<a href="{{ visitorData.firstVisit.referrerUrl|safelink|e('html_attr') }}" target="_blank">
{{ visitorData.firstVisit.referralSummary }}
</a>
{% else %}
{{ visitorData.firstVisit.referralSummary }}
{% endif %}
</strong>
</p>
</div>
</div>
{% if visitorData.lastVisits.getRowsCount() != 1 %}
<div>
<h1>{{ 'Live_LastVisit'|translate }}</h1>
<div>
<p><strong>{{ visitorData.lastVisit.prettyDate }}</strong>&nbsp;- {{ 'UserCountryMap_DaysAgo'|translate(visitorData.lastVisit.daysAgo) }}</p>
<p>
{{ 'General_FromReferrer'|translate }} <strong {% if visitorData.lastVisit.referrerType == 'search' and '(' not in visitorData.lastVisit.referralSummary %}title="{{ keywordNotDefined }}"{% endif %}>
{%- if visitorData.lastVisit.referrerType == 'website' %}
<a href="{{ visitorData.lastVisit.referrerUrl|safelink|e('html_attr') }}" target="_blank">
{{ visitorData.lastVisit.referralSummary }}
</a>
{% else %}
{{ visitorData.lastVisit.referralSummary }}
{% endif %}
</strong>
</p>
</div>
</div>
{% endif %}
</div>

View File

@ -0,0 +1,29 @@
<div id="visitsTotal">
<table class="dataTable" cellspacing="0">
<thead>
<tr>
<th id="label" class="sortable label first" style="cursor: auto;">
<div id="thDIV">{{ 'General_Date'|translate }}</div>
</th>
<th id="label" class="sortable label" style="cursor: auto;">
<div id="thDIV">{{ 'General_ColumnNbVisits'|translate }}</div>
</th>
<th id="label" class="sortable label" style="cursor: auto;">
<div id="thDIV">{{ 'General_Actions'|translate }}</div>
</th>
</tr>
</thead>
<tbody>
<tr class="">
<td class="label column">{{ 'Live_LastHours'|translate(24) }}</td>
<td class="column">{{ visitorsCountToday|number }}</td>
<td class="column">{{ pisToday|number }}</td>
</tr>
<tr class="">
<td class="label column">{{ 'Live_LastMinutes'|translate(30) }}</td>
<td class="column">{{ visitorsCountHalfHour|number }}</td>
<td class="column">{{ pisHalfhour|number }}</td>
</tr>
</tbody>
</table>
</div>

View File

@ -0,0 +1,23 @@
<strong class="visitor-log-datetime visitorLogTooltip" title="{% if visitInfo.getColumn('visitorType')=='new' %}{{ 'General_NewVisitor'|translate }}{% else %}{{ 'Live_VisitorsLastVisit'|translate(visitInfo.getColumn('daysSinceLastVisit')) }}{% endif %}">
{{ visitInfo.getColumn('serverDatePrettyFirstAction') }}
{% if isWidget %}<br/>{% else %}-{% endif %} {{ visitInfo.getColumn('serverTimePrettyFirstAction') }}</strong>
{% if visitInfo.getColumn('visitIp') is not empty %}
<span class="visitor-log-ip-location visitorLogTooltip" title="{% if visitInfo.getColumn('userId') is not empty %}{{ 'General_UserId'|translate }}: {{ visitInfo.getColumn('userId')|rawSafeDecoded }}
{% endif %}{% if visitInfo.getColumn('visitorId') is not empty %}{{ 'General_VisitorID'|translate }}: {{ visitInfo.getColumn('visitorId') }}
{% endif %}{% if visitInfo.getColumn('idVisit') is not empty %}
{{ 'General_Visit'|translate }} ID: {{ visitInfo.getColumn('idVisit') }}
{% endif %}{% if visitInfo.getColumn('latitude') or visitInfo.getColumn('longitude') %}{{ visitInfo.getColumn('location') }}
GPS (lat/long): {{ visitInfo.getColumn('latitude') }},{{ visitInfo.getColumn('longitude') }}
{% endif %}{% if visitInfo.getColumn('providerName') %}
{{ 'Provider_ColumnProvider'|translate }}: {{ visitInfo.getColumn('providerName') }}{% endif %}">
IP: {{ visitInfo.getColumn('visitIp') }}
<br />
{% if visitInfo.getColumn('location') != 'General_Unknown'|translate %}<span><img width="16" class="flag" src="{{ visitInfo.getColumn('countryFlag') }}"/>&nbsp;
{% if visitInfo.getColumn('city') is not empty %}{{ visitInfo.getColumn('city') }}{% else %}{{ visitInfo.getColumn('country') }}{% endif %}</span>{% endif %}
{% if visitInfo.getColumn('userId') is not empty %}<br/><br/>{{ visitInfo.getColumn('userId')|rawSafeDecoded }}{% endif %}
</span>{% endif %}
{% if isWidget %}
<br />
{{ postEvent('Live.renderVisitorIcons', visitInfo) }}
{% endif %}

View File

@ -0,0 +1,84 @@
{% set visitHasEcommerceActivity = visitor.getColumn('visitEcommerceStatusIcon') %}
{% set breakBeforeVisitorRank = (visitHasEcommerceActivity and visitor.getColumn('visitorTypeIcon')) ? true : false %}
<span class="visitorLogIcons">
<span class="visitorDetails">
{% if visitor.getColumn('visitorTypeIcon') %}
<span class="visitorLogIconWithDetails visitorTypeIcon">
<img src="{{ visitor.getColumn('visitorTypeIcon') }}"/>
<ul class="details">
<li>{{ 'General_ReturningVisitor'|translate }} - {{ 'General_NVisits'|translate(visitor.getColumn('visitCount')) }}</li>
</ul>
</span>
{% endif %}
{% if visitor.getColumn('countryFlag') %}
<span class="visitorLogIconWithDetails flag" profile-header-text="{% if visitor.getColumn('city') %}{{ visitor.getColumn('city')|e('html_attr') }}{% else %}{{ visitor.getColumn('country') }}{% endif %}">
<img src="{{ visitor.getColumn('countryFlag') }}"/>
<ul class="details">
<li>{{ 'UserCountry_Country'|translate }}: {{ visitor.getColumn('country') }}</li>
{% if visitor.getColumn('region') %}<li>{{ 'UserCountry_Region'|translate }}: {{ visitor.getColumn('region') }}</li>{% endif %}
{% if visitor.getColumn('city') %}<li>{{ 'UserCountry_City'|translate }}: {{ visitor.getColumn('city') }}</li>{% endif %}
{% if visitor.getColumn('language') %}<li>{{ 'UserLanguage_BrowserLanguage'|translate }}: {{ visitor.getColumn('language') }}</li>{% endif %}
{% if visitor.getColumn('providerName') %}<li>{{ 'Provider_ColumnProvider'|translate }}: {{ visitor.getColumn('providerName') }}</li>{% endif %}
<li>{{ 'General_IP'|translate }}: {{ visitor.getColumn('visitIp') }}</li>
{% if visitor.getColumn('visitorId') is not empty %}<li>{{ 'General_VisitorID'|translate }}: {{ visitor.getColumn('visitorId') }}</li>{% endif %}
</ul>
</span>
{% endif %}
{% if visitor.getColumn('browserIcon') %}
<span class="visitorLogIconWithDetails" profile-header-text="{{ visitor.getColumn('browser')|e('html_attr') }}">
<img src="{{ visitor.getColumn('browserIcon') }}"/>
<ul class="details">
<li>{{ 'DevicesDetection_ColumnBrowser'|translate }}: {{ visitor.getColumn('browser') }}</li>
<li>{{ 'DevicesDetection_BrowserEngine'|translate }}: {{ visitor.getColumn('browserFamily') }}</li>
{% if visitor.getColumn('pluginsIcons')|length > 0 %}
<li>
{{ 'General_Plugins'|translate }}:
{% for pluginIcon in visitor.getColumn('pluginsIcons') %}
<img width="16px" height="16px" src="{{ pluginIcon.pluginIcon }}" alt="{{ pluginIcon.pluginName|capitalize(true) }}"/>
{% endfor %}
</li>
{% endif %}
</ul>
</span>
{% endif %}
{% if visitor.getColumn('operatingSystemIcon') %}
<span class="visitorLogIconWithDetails" profile-header-text="{{ visitor.getColumn('operatingSystem')|e('html_attr') }}">
<img src="{{ visitor.getColumn('operatingSystemIcon') }}"/>
<ul class="details">
<li>{{ 'DevicesDetection_ColumnOperatingSystem'|translate }}: {{ visitor.getColumn('operatingSystem') }}</li>
</ul>
</span>
{% endif %}
{% if visitor.getColumn('deviceTypeIcon') %}
<span class="visitorLogIconWithDetails" profile-header-text="{% if visitor.getColumn('resolution') %}{{ visitor.getColumn('resolution')|e('html_attr') }}{% else %}{{ visitor.getColumn('deviceType') }}{% endif %}">
<img src="{{ visitor.getColumn('deviceTypeIcon') }}"/>
<ul class="details">
<li>{{ 'DevicesDetection_DeviceType'|translate }}: {{ visitor.getColumn('deviceType') }}</li>
{% if visitor.getColumn('deviceBrand') %}<li>{{ 'DevicesDetection_DeviceBrand'|translate }}: {{ visitor.getColumn('deviceBrand') }}</li>{% endif %}
{% if visitor.getColumn('deviceModel') %}<li>{{ 'DevicesDetection_DeviceModel'|translate }}: {{ visitor.getColumn('deviceModel') }}</li>{% endif %}
{% if visitor.getColumn('resolution') %}<li>{{ 'Resolution_ColumnResolution'|translate }}: {{ visitor.getColumn('resolution') }}</li>{% endif %}
</ul>
</span>
{% endif %}
</span>
{% if visitor.getColumn('goalConversions') or visitHasEcommerceActivity %}
<span class="visitorType">
{# Goals, and/or Ecommerce activity #}
{% if visitor.getColumn('goalConversions') %}
<span title="{{ 'General_VisitConvertedNGoals'|translate(visitor.getColumn('goalConversions')) }}" class="visitorLogTooltip">
<img src="{{ visitor.getColumn('visitConvertedIcon') }}"/>
<span class="conversionCount">{% if visitor.getColumn('goalConversions') > 99 %}99+{% else %}{{ visitor.getColumn('goalConversions') }}{% endif %}</span>
</span>
{% endif %}
{# Ecommerce activity #}
{% if visitHasEcommerceActivity %}
<img class="visitorLogTooltip" src="{{ visitor.getColumn('visitEcommerceStatusIcon') }}" title="{{ visitor.getColumn('visitEcommerceStatus') }}"/>
{% endif %}
</span>
{% endif %}
</span>

View File

@ -0,0 +1 @@
{% include "@Live/_totalVisitors.twig" %}

View File

@ -0,0 +1,130 @@
{# some users view thousands of pages which can crash the browser viewing Live! #}
{% set maxPagesDisplayedByVisitor=100 %}
<ul id="visitsLive">
{% for visitor in visitors.getRows() %}
<li id="{{ visitor.getColumn('idVisit') }}" class="visit">
<div style="display:none;" class="idvisit">{{ visitor.idVisit }}</div>
<div title="{{ visitor.getColumn('actionDetails')|length }} {{ 'General_Actions'|translate }}" class="datetime">
<span style="display:none;" class="serverTimestamp">{{ visitor.getColumn('serverTimestamp')|raw }}</span>
{{ postEvent('Live.visitorLogWidgetViewBeforeVisitInfo', visitor) }}
{% set year = visitor.getColumn('serverTimestamp')|date('Y') %}
<span class="realTimeWidget_datetime">{{ visitor.getColumn('serverDatePretty')|replace({(year): ' '}) }} - {{ visitor.getColumn('serverTimePretty') }} {% if visitor.getColumn('visitDuration') > 0 %}({{ visitor.getColumn('visitDurationPretty')|raw }}){% endif %}</span>
{% if visitor.getColumn('userId')|default(false) is not empty %}
&nbsp; <a class="visits-live-launch-visitor-profile rightLink" title="{{ 'Live_ViewVisitorProfile'|translate }} {% if visitor.getColumn('userId') is not empty %}{{ visitor.getColumn('userId') }}{% endif %}" data-visitor-id="{{ visitor.getColumn('visitorId') }}">
<span>{{ visitor.getColumn('userId')|rawSafeDecoded}}</span>
</a>
{% endif %}
{{ postEvent('Live.renderVisitorIcons', visitor) }}
{% if not userIsAnonymous %}
<a class="visits-live-launch-visitor-profile rightLink" title="{{ 'Live_ViewVisitorProfile'|translate }} {% if visitor.getColumn('userId') is not empty %}{{ visitor.getColumn('userId') }}{% endif %}" data-visitor-id="{{ visitor.getColumn('visitorId') }}">
<span class="icon-visitor-profile"></span>
</a>
{% endif %}
<span class="referrer">
{% include "@Referrers/_visitorDetails.twig" with {'visitInfo': visitor} %}
</span>
</div>
<div id="{{ visitor.getColumn('idVisit')|e('html_attr') }}_actions" class="settings">
<span class="pagesTitle"
title="{{ visitor.getColumn('actionDetails')|length }} {{ 'General_Actions'|translate }}"
>{{ 'General_Actions'|translate }}:</span>&nbsp;
{% set col = 0 %}
{% for action in visitor.getColumn('actionDetails') %}
{% if loop.index <= maxPagesDisplayedByVisitor %}
{% if action.type == 'ecommerceOrder' or action.type == 'ecommerceAbandonedCart' %}
{% set title %}
{%- if action.type == 'ecommerceOrder' %}
{{- 'Goals_EcommerceOrder'|translate -}}
{% else %}
{{- 'Goals_AbandonedCart'|translate -}}
{% endif %}
{{- "\n - " -}}
{%- if action.type == 'ecommerceOrder' -%}
{{- 'General_ColumnRevenue'|translate -}}:
{%- else -%}
{%- set revenueLeft -%}
{{- 'General_ColumnRevenue'|translate -}}
{%- endset -%}
{{- 'Goals_LeftInCart'|translate(revenueLeft) -}}:
{%- endif %} {{ action.revenue|money(idSite)|raw -}}
{{- "\n - " -}}{{- action.serverTimePretty -}}
{{- "\n" -}}
{% if action.itemDetails is not empty -%}
{% for product in action.itemDetails -%}
{{- "\n# " -}}{{ product.itemSKU }}{% if product.itemName is not empty %}: {{ product.itemName }}{% endif %}{% if product.itemCategory is not empty %} ({{ product.itemCategory }}){% endif %}, {{ 'General_Quantity'|translate }}: {{ product.quantity }}, {{ 'General_Price'|translate }}: {{ product.price|money(idSite)|raw }}
{%- endfor %}
{%- endif %}
{% endset %}
<span title="{{- title -}}">
<img class='iconPadding' src="{{ action.iconSVG|default(action.icon) }}"/>
{% if action.type == 'ecommerceOrder' %}
{{ 'General_ColumnRevenue'|translate }}: {{ action.revenue|money(idSite)|raw }}
{% endif %}
</span>
{% else %}
{% if action.url is defined and action.url is not empty %}
<a href="{{ action.url|safelink|e('html_attr') }}" target="_blank">
{% endif %}
{% if action.type == 'action' %}
{# white spacing matters as Chrome tooltip display whitespaces #}
{% set title %}
{% if action.url|trim is not empty %}<span class='tooltip-action-url'>{{ action.url }}</span>{% endif %}
{% if action.pageTitle is not empty %}<span class='tooltip-action-page-title'>{{ action.pageTitle }}</span>{% endif %}
<span class="tooltip-action-server-time">{{ action.serverTimePretty }}</span>
{% if action.timeSpentPretty is defined %}<span class='tooltip-time-on-page'>{{ 'General_TimeOnPage'|translate }}: {{ action.timeSpentPretty|raw }}</span>{% endif %}
{%- endset %}
<img class='iconPadding' src="{{ action.iconSVG|default(action.icon) }}" title="{{- title|e('html_attr') -}}"/>
{% elseif action.type == 'outlink' or action.type == 'download' %}
<img class='iconPadding' src="{{ action.iconSVG|default(action.icon) }}"
title="{% if action.url is defined %}{{ action.url }} - {% endif %}{{ action.serverTimePretty }}"/>
{% elseif action.type == 'search' %}
<img class='iconPadding' src="{{ action.iconSVG|default(action.icon) }}"
title="{{ 'Actions_SubmenuSitesearch'|translate }}: {{ action.siteSearchKeyword }} - {{ action.serverTimePretty }}"/>
{% elseif action.eventCategory|default(false) is not empty %}
<img class="iconPadding" src='{{ action.iconSVG|default(action.icon) }}'
title="{{ 'Events_Event'|translate }} {{ action.eventCategory }} - {{ action.eventAction }} {% if action.eventName is defined %}- {{ action.eventName }}{% endif %} {% if action.eventValue is defined %}- {{ action.eventValue }}{% endif %}"/>
{% elseif action.type == 'goal' or action.type == constant('Piwik\\Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER') or
action.type == constant('Piwik\\Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_CART') %}
<img class='iconPadding' src="{{ action.iconSVG|default(action.icon) }}"
title="{{ action.goalName }} - {% if action.revenue > 0 %}{{ 'General_ColumnRevenue'|translate }}: {{ action.revenue|money(idSite)|raw }} - {% endif %} {{ action.serverTimePretty }}"/>
{% endif %}
{% if action.url is defined and action.url is not empty %}
</a>
{% endif %}
{% endif %}
{% endif %}
{% endfor %}
{% if visitor.getColumn('actionDetails')|length > maxPagesDisplayedByVisitor %}
({{ 'Live_MorePagesNotDisplayed'|translate }})
{% endif %}
</div>
</li>
{% endfor %}
</ul>
<script type="text/javascript">
$(function () {
$('#visitsLive').on('click', '.visits-live-launch-visitor-profile', function (e) {
e.preventDefault();
broadcast.propagateNewPopoverParameter('visitorProfile', $(this).attr('data-visitor-id'));
return false;
}).tooltip({
track: true,
content: function() {
var title = $(this).attr('title');
return piwikHelper.escape(title.replace(/\n/g, '<br />'));
},
show: {delay: 100, duration: 0},
hide: false
});
});
</script>

View File

@ -0,0 +1,21 @@
<div class='simple-realtime-visitor-widget' data-refreshAfterXSecs="{{ refreshAfterXSecs }}" data-last-minutes="{{ lastMinutes }}" data-translations="{{ translations|json_encode }}">
<div class='simple-realtime-visitor-counter' title="{% if visitors == 1 %}{{ 'Live_NbVisitor'|translate }}{% else %}{{ 'Live_NbVisitors'|translate(visitors) }}{% endif %}">
<div>{{ visitors }}</div>
</div>
<br/>
<div class='simple-realtime-elaboration'>
{% set visitsMessage %}
<span class="simple-realtime-metric" data-metric="visits">{% if visits == 1 %}{{ 'General_OneVisit'|translate }}{% else %}{{ 'General_NVisits'|translate(visits) }}{% endif %}</span>
{% endset %}
{% set actionsMessage %}
<span class="simple-realtime-metric" data-metric="actions">{% if actions == 1 %}{{ 'General_OneAction'|translate }}{% else %}{{ 'VisitsSummary_NbActionsDescription'|translate(actions) }}{% endif %}</span>
{% endset %}
{% set minutesMessage %}
<span class="simple-realtime-metric" data-metric="minutes">{% if lastMinutes == 1 %}{{ 'Intl_OneMinute'|translate }}{% else %}{{ 'Intl_NMinutes'|translate(lastMinutes) }}{% endif %}</span>
{% endset %}
{{ 'Live_SimpleRealTimeWidget_Message'|translate(visitsMessage,actionsMessage,minutesMessage) | raw }}
</div>
</div>
<script type="text/javascript">$(document).ready(function () {require('piwik/Live').initSimpleRealtimeVisitorWidget();});</script>

View File

@ -0,0 +1,35 @@
{% for visitInfo in visits.getRows() %}
<li data-number="{{ startCounter }}">
<div>
<div class="visitor-profile-visit-title" data-idvisit="{{ visitInfo.getColumn('idVisit') }}" title="{{ 'Live_ClickToViewMoreAboutVisit'|translate }}">
{{ 'General_Visit'|translate }} #{{ startCounter }}
<span class="visitor-profile-date" title="{{ visitInfo.getColumn('serverDatePrettyFirstAction') }} {{ visitInfo.getColumn('serverTimePrettyFirstAction') }}">
{{ visitInfo.getColumn('serverDatePrettyFirstAction') }} {{ visitInfo.getColumn('serverTimePrettyFirstAction') }}
</span>
</div>
<div class="visitor-profile-visit-details-extended">
{{ postEvent('Live.renderVisitorDetails', visitInfo) }}
</div>
<div class="visitor-profile-visit-details">
{{ postEvent('Live.renderVisitorIcons', visitInfo) }}
<a href="#" class="visitor-profile-show-actions">
{% set actionCount = visitInfo.getColumn('actionDetails')|length %}
{% if visitInfo.truncatedActionsCount is defined %}
{% set actionCount = actionCount + visitInfo.truncatedActionsCount %}
{% endif %}
{% if visitInfo.getColumn('visitDuration') != 0 %}
{{ 'Live_ActionsAndDuration'|translate(actionCount, visitInfo.getColumn('visitDurationPretty')) }}
{% else %}
{{ actionCount }} {{ 'General_Actions'|translate }}
{% endif %}
</a>
</div>
<ol class="visitorLog visitor-profile-actions">
{% include "@Live/_actionsList.twig" with {'actionDetails': visitInfo.getColumn('actionDetails'),
'visitInfo': visitInfo} %}
</ol>
</div>
</li>
{% set startCounter = startCounter - 1 %}
{% endfor %}

View File

@ -0,0 +1,94 @@
{% if not visitorData %}
<div class="pk-emptyDataTable">{{ 'CoreHome_ThereIsNoDataForThisReport'|translate }}</div>
{% else %}
<div class="visitor-profile"
data-visitor-id="{{ visitorData.lastVisits.getFirstRow().getColumn('visitorId') }}"
data-next-visitor="{{ visitorData.nextVisitorId }}"
data-prev-visitor="{{ visitorData.previousVisitorId }}"
tabindex="0">
<div class="visitor-profile-options">
<a href class="visitor-profile-close" title="{{ 'General_Close'|translate }} "></a>
<a href="https://matomo.org/docs/user-profile/" class="visitor-profile-help" rel="noreferrer"
target="_blank"
title="{{ 'General_ViewDocumentationFor'|translate("Live_VisitorProfile"|translate|ucwords) }}">
</a>
<a href class="visitor-profile-toggle-actions" title="{{ 'Live_ToggleActions'|translate }} "></a>
</div>
<div class="visitor-profile-info">
<div class="visitor-profile-overview">
<div class="visitor-profile-header">
<div class="visitor-profile-avatar">
<img src="{{ visitorData.visitorAvatar|default("plugins/Live/images/unknown_avatar.png") }}"
alt="{{ visitorData.visitorDescription|default('') }}"
title="{{ visitorData.visitorDescription|default('') }}"/>
</div>
<div class="visitor-profile-header-details">
<div class="visitor-profile-headline">
{% if visitorData.previousVisitorId is not empty %}<a class="visitor-profile-prev-visitor"
href="#"
title="{{ 'Live_PreviousVisitor'|translate }}">
&larr;</a>{% endif %}
<h1>
{%- if visitorData.userId is empty %}
{{ 'Live_VisitorProfile'|translate }}
{%- else %}
<span title="{{ 'General_UserId'|translate }}: {{ visitorData.userId|rawSafeDecoded }}">{{ visitorData.userId|rawSafeDecoded }}</span>
{% endif -%}
</h1>
{% if visitorData.nextVisitorId is not empty %}<a class="visitor-profile-next-visitor"
href="#"
title="{{ 'Live_NextVisitor'|translate }}">
&rarr;</a>{% endif %}
</div>
<div class="visitor-profile-latest-visit">
<div class="visitor-profile-id">
<span>{{ 'General_Id'|translate|upper }}</span>
{% if widgetizedLink is defined %}<a class="visitor-profile-widget-link"
href="{{ widgetizedLink }}" target="_blank"
title="{{ 'Widgetize_OpenInNewWindow'|translate }} - {{ 'Live_VisitorProfile'|translate }} {{ 'General_Id'|translate|upper }} {{ visitorData.visitorId }}">{% endif %}
<span>{{ visitorData.visitorId }}</span>
{%- if widgetizedLink is defined %}</a>{% endif %}
<a class="visitor-profile-export" href="{{ exportLink }}" target="_blank"
title="{{ 'General_ExportThisReport'|translate }}">
<span class="icon-export"></span>
</a>
</div>
{{ postEvent('Live.renderVisitorIcons', visitorData.lastVisits|first) }}
</div>
</div>
</div>
{{ profileSummary|raw }}
{{ postEvent('Template.afterVisitorProfileOverview') }}
</div>
<div class="visitor-profile-visits-info">
<div class="visitor-profile-visits-container">
<ol class="visitor-profile-visits">
{% include "@Live/getVisitList.twig" with {'visits': visitorData.lastVisits, 'startCounter': visitorData.totalVisits} %}
</ol>
</div>
<div class="visitor-profile-more-info">
{% if visitorData.lastVisits.getRowsCount() >= constant("Piwik\\Plugins\\Live\\VisitorProfile::VISITOR_PROFILE_MAX_VISITS_TO_SHOW") %}
<a href="#">{{ 'Live_LoadMoreVisits'|translate }}</a> <img class="loadingPiwik"
style="display:none;"
src="plugins/Morpheus/images/loading-blue.gif"/>
{% else %}
<span class="visitor-profile-no-visits">
{% if visitorData.hasMoreVisits %}
{{ 'Live_LimitedVisitsShown'|translate('<strong>' ~ visitorData.totalVisits ~ '</strong>')|raw }}
{% else %}
{{ 'Live_NoMoreVisits'|translate }}
{% endif %}
</span>
{% endif %}
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(function () {
require('piwik/UI').VisitorProfileControl.initElements();
});
</script>
{% endif %}

View File

@ -0,0 +1,56 @@
<script type="text/javascript" charset="utf-8">
$(document).ready(function () {
var segment = broadcast.getValueFromHash('segment');
if (!segment) {
segment = broadcast.getValueFromUrl('segment');
}
$('#visitsLive').liveWidget({
interval: {{ liveRefreshAfterMs }},
onUpdate: function () {
//updates the numbers of total visits in startbox
var ajaxRequest = new ajaxHelper();
ajaxRequest.setFormat('html');
ajaxRequest.addParams({
module: 'Live',
action: 'ajaxTotalVisitors',
segment: segment
}, 'GET');
ajaxRequest.setCallback(function (r) {
$("#visitsTotal").html(r);
});
ajaxRequest.send();
},
maxRows: 10,
fadeInSpeed: 600,
dataUrlParams: {
module: 'Live',
action: 'getLastVisitsStart',
segment: segment
}
});
});
</script>
{% if not isWidgetized %}<div piwik-content-block content-title="{{ 'Live_VisitorsInRealTime'|translate|e('html_attr') }}">{% endif %}
{% include "@Live/_totalVisitors.twig" %}
{{ visitors|raw }}
{% spaceless %}
<div class="visitsLiveFooter">
<a title="{{ 'Live_OnClickPause'|translate('Live_VisitorsInRealTime'|translate) }}" href="javascript:void(0);" onclick="onClickPause();">
<img id="pauseImage" border="0" src="plugins/Live/images/pause.png" />
</a>
<a title="{{ 'Live_OnClickStart'|translate('Live_VisitorsInRealTime'|translate) }}" href="javascript:void(0);" onclick="onClickPlay();">
<img id="playImage" style="display: none;" border="0" src="plugins/Live/images/play.png" />
</a>
{% if not disableLink %}
&nbsp;
<a class="rightLink" href="#" onclick="this.href=broadcast.buildReportingUrl('category=General_Visitors&subcategory=Live_VisitorLog')">{{ 'Live_LinkVisitorLog'|translate }}</a>
{% endif %}
</div>
{% endspaceless %}
{% if not isWidgetized %}</div>{% endif %}

View File

@ -0,0 +1,5 @@
<div piwik-content-intro>
<h2 piwik-enriched-headline>{{ 'Live_VisitorLog'|translate }}</h2>
</div>
{{ visitorLog|raw }}