1<?php
2/**
3 * Matomo - free/libre analytics platform
4 *
5 * @link https://matomo.org
6 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
7 *
8 */
9namespace Piwik\Plugins\DevicesDetection\Columns;
10
11use DeviceDetector\Parser\Client\Browser;
12use Piwik\Columns\DimensionSegmentFactory;
13use Piwik\Common;
14use Piwik\Metrics\Formatter;
15use Piwik\Plugin\Segment;
16use Piwik\Segment\SegmentsList;
17use Piwik\Tracker\Request;
18use Piwik\Tracker\Visitor;
19use Piwik\Tracker\Action;
20
21class BrowserName extends Base
22{
23    protected $columnName = 'config_browser_name';
24    protected $columnType = 'VARCHAR(40) NULL';
25    protected $segmentName = 'browserCode';
26    protected $nameSingular = 'DevicesDetection_ColumnBrowser';
27    protected $namePlural = 'DevicesDetection_Browsers';
28    protected $acceptValues = 'FF, IE, CH, SF, OP etc.';
29    protected $type = self::TYPE_TEXT;
30
31    public function configureSegments(SegmentsList $segmentsList, DimensionSegmentFactory $dimensionSegmentFactory)
32    {
33        $segment = new Segment();
34        $segment->setName('DevicesDetection_BrowserCode');
35        $segmentsList->addSegment($dimensionSegmentFactory->createSegment($segment));
36
37        $segment = new Segment();
38        $segment->setSegment('browserName');
39        $segment->setName('DevicesDetection_ColumnBrowser');
40        $segment->setAcceptedValues('FireFox, Internet Explorer, Chrome, Safari, Opera etc.');
41        $segment->setSqlFilterValue(function ($val) {
42            $browsers = Browser::getAvailableBrowsers();
43            $browsers = array_map(function($val) {
44                return mb_strtolower($val);
45            }, $browsers);
46            $result   = array_search(mb_strtolower($val), $browsers);
47
48            if ($result === false) {
49                $result = 'UNK';
50            }
51
52            return $result;
53        });
54        $segment->setSuggestedValuesCallback(function ($idSite, $maxValuesToReturn) {
55            return array_values(Browser::getAvailableBrowsers() + ['Unknown']);
56        });
57        $segmentsList->addSegment($dimensionSegmentFactory->createSegment($segment));
58    }
59
60    public function formatValue($value, $idSite, Formatter $formatter)
61    {
62        return \Piwik\Plugins\DevicesDetection\getBrowserName($value);
63    }
64
65    public function onAnyGoalConversion(Request $request, Visitor $visitor, $action)
66    {
67        return $visitor->getVisitorColumn($this->columnName);
68    }
69
70    /**
71     * @param Request $request
72     * @param Visitor $visitor
73     * @param Action|null $action
74     * @return mixed
75     */
76    public function onNewVisit(Request $request, Visitor $visitor, $action)
77    {
78        $userAgent = $request->getUserAgent();
79        $parser    = $this->getUAParser($userAgent);
80
81        $aBrowserInfo = $parser->getClient();
82
83        if (!empty($aBrowserInfo['short_name'])) {
84
85            return $aBrowserInfo['short_name'];
86        } else if (!empty($aBrowserInfo['name'])) {
87
88            return $aBrowserInfo['name'];
89        }
90
91        return 'UNK';
92    }
93}
94