Completed
Pull Request — master (#29)
by Eugene
03:29
created

AzineEmailOpenTrackingCodeBuilder   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 172
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 16%

Importance

Changes 0
Metric Value
wmc 15
lcom 1
cbo 2
dl 0
loc 172
ccs 8
cts 50
cp 0.16
rs 10
c 0
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
A getGoogleAnalyticsUrl() 0 12 1
A getPiwikUrl() 0 10 1
A getCampaignSource() 0 6 2
A getCampaignName() 0 6 2
A getTrackingImgCode() 0 17 3
B merge() 0 14 5
1
<?php
2
namespace Azine\EmailBundle\Services;
3
4
use Azine\EmailBundle\DependencyInjection\AzineEmailExtension;
5
use Ramsey\Uuid\Uuid;
6
7
/**
8
 * Implementation of the EmailOpenTrackingCodeBuilderInterface used to track email open events.
9
 *
10
 * This implementation will create a html snippet with the image tracker code for
11
 * either GoogleAnalytics or Piwik, depending on the configured tracking url
12
 * ( azine_email_email_open_tracking_url) in your config.yml
13
 *
14
 * Class AzineEmailOpenTrackingCodeBuilder
15
 * @package Azine\EmailBundle\Services
16
 */
17
class AzineEmailOpenTrackingCodeBuilder implements EmailOpenTrackingCodeBuilderInterface {
18
19
    /**
20
     * @var  string
21
     */
22
    protected $tracking_params_campaign_source;
23
24
    /**
25
     * @var  string
26
     */
27
    protected $tracking_params_campaign_medium;
28
29
    /**
30
     * @var  string
31
     */
32
    protected $tracking_params_campaign_content;
33
34
    /**
35
     * @var  string
36
     */
37
    protected $tracking_params_campaign_name;
38
39
    /**
40
     * @var  string
41
     */
42
    protected $tracking_params_campaign_term;
43
44
    /**
45
     * @var $string|null
46
     */
47
    private $trackingUrlTemplate;
48
49
    /**
50
     * @var string the html-code template
51
     */
52
    protected $imageHtmlCode = "<img src='%s' style='border:0' alt='' />";
53
54
    /**
55
     * @param string $trackingUrlTemplate the url configured in your config.yml or null if you didn't specify a tracking url.
56
     * @param array $parameters array with the parameter names for the campaign tracking
57
     */
58 8
    public function __construct($trackingUrlTemplate, $parameters){
59 8
        $this->trackingUrlTemplate = $trackingUrlTemplate;
60 8
        $this->tracking_params_campaign_content = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_CONTENT];
61 8
        $this->tracking_params_campaign_medium = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_MEDIUM];
62 8
        $this->tracking_params_campaign_name = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_NAME];
63 8
        $this->tracking_params_campaign_source = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_SOURCE];
64 8
        $this->tracking_params_campaign_term = $parameters[AzineEmailExtension::TRACKING_PARAM_CAMPAIGN_TERM];
65 8
    }
66
67
    /**
68
     * @param string $templateBaseId the template used for rendering the email (without the .html.twig or .txt.twig extension)
69
     * @param array $campaignParams the campaign-parameters used for this email
70
     * @param string $messageId the id of the message
71
     * @param string $to to-recipient-email(s) or null
72
     * @param string $cc cc-recipient-email(s) or null
73
     * @param string $bcc bcc-recipient-email(s) or null
74
     *
75
     * @return null|string Email open tracking code for google analytics or piwik or null
76
     */
77
    public function getTrackingImgCode($templateBaseId, array $campaignParams, array $emailTemplateParams, $messageId, $to, $cc, $bcc){
78
        if($this->trackingUrlTemplate === null){
79
            return null;
80
        }
81
82
        $recipients = md5($this->merge($to, $cc, $bcc));
83
84
        if(strpos($this->trackingUrlTemplate, 'www.google-analytics.com') !== false) {
85
            $trackingUrl = $this->getGoogleAnalyticsUrl($this->trackingUrlTemplate, $templateBaseId, $campaignParams, $emailTemplateParams, $messageId, $recipients);
86
        } else {
87
            $trackingUrl = $this->getPiwikUrl($this->trackingUrlTemplate, $templateBaseId, $campaignParams, $emailTemplateParams, $messageId, $recipients);
88
        }
89
90
        // return the html code for the tracking image
91
        $imgTrackingCode = sprintf($this->imageHtmlCode, $trackingUrl);
92
        return $imgTrackingCode;
93
    }
94
95
    /**
96
     * concatenate all recipients into an array and implode with ';' to a string
97
     * @param string|array $to
98
     * @param string|array $cc
99
     * @param string|array $bcc
100
     * @return string
101
     */
102
    protected function merge($to, $cc, $bcc){
103
        if($to && !is_array($to)){
104
            $to = array($to);
105
        }
106
        if(!is_array($cc)){
107
            $cc = array($cc);
108
        }
109
        if(!is_array($bcc)){
110
            $bcc = array($bcc);
111
        }
112
        $all = array_merge($to, $cc, $bcc);
113
114
        return implode(";", $all);
115
    }
116
117
    /**
118
     * Build tracking image code with an URL according to these sources:
119
     * http://dyn.com/blog/tracking-email-opens-via-google-analytics/
120
     * https://developers.google.com/analytics/devguides/collection/protocol/v1/email#protocol
121
     *
122
     * @param string $baseUrl string something like: https://www.google-analytics.com/collect?v=1&cm=email&t=event&ec=email&ea=open&tid=TRACKING_ID replace the TRACKING_ID with your google analytics tracking ID.
123
     * @param string $templateBaseId
124
     * @param array $campaignParams
125
     * @param array $emailTemplateParams
126
     * @param string $messageId
127
     * @param string|array $recipients
128
     * @return string
129
     */
130
    protected function getGoogleAnalyticsUrl($baseUrl, $templateBaseId, array $campaignParams, array $emailTemplateParams, $messageId, $recipients){
131
        $url = $baseUrl.
132
            "&uid=".$recipients.                              // anonymized id generated from the concatenated string of all recipients email addresses
133
            "&cid=".Uuid::uuid4()->toString().                // random UUID
134
            "&el=".$recipients.                               // anonymized id generated from the concatenated string of all recipients email addresses
135
            "&dp=/email/".$templateBaseId.                    // the email-template used for this email
136
            "&cs=".$this->getCampaignSource($campaignParams, $templateBaseId). // campaing source for this email
137
            "&cn=".$this->getCampaignName($campaignParams).   // campaign name for this email
138
            "&z=".microtime();                                // cache buster
139
140
        return $url;
141
    }
142
143
    /**
144
     * Build tracking image code with an URL according to these sources:
145
     *
146
     *
147
     * @param string $baseUrl string something like: https://your.host.com/piwik-directory/piwik.php?&rec=1&bots=1&e_c=email&e_a=open&e_v=1&idsite=SITE_ID replace the path to your piwik.php and the SITE_ID according to your needs.
148
     * @param string $templateBaseId string
149
     * @param array $campaignParams
150
     * @param array $emailTemplateParams
151
     * @param string $messageId
152
     * @param string $recipients
153
     * @return string
154
     */
155
    protected function getPiwikUrl($baseUrl, $templateBaseId, array $campaignParams, array $emailTemplateParams, $messageId, $recipients){
0 ignored issues
show
Unused Code introduced by
The parameter $emailTemplateParams is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $messageId is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
156
        $url = $baseUrl.
157
            "&_id=".substr($recipients, 0, 16).                     // user: 16 characters hexadecimal string
158
            "&url=/email/".$templateBaseId.                         // document path
159
            "&rand=".microtime().                                   // cache buster
160
            "&e_n=".$this->getCampaignSource($campaignParams, $templateBaseId).      // event name => will be categorized with the / => e.g. email / newsletter
161
            "&action_name=".$this->getCampaignName($campaignParams);// action name
162
163
        return $url;
164
    }
165
166
    /**
167
     * @param array $campaignParams
168
     * @param string $templateId
169
     * @return string if no source-value is defined in the $campaignParams, $templateId will be used.
170
     */
171
    protected function getCampaignSource($campaignParams, $templateId){
172
        if(array_key_exists($this->tracking_params_campaign_source, $campaignParams)){
173
            return $campaignParams[$this->tracking_params_campaign_source];
174
        }
175
        return $templateId;
176
    }
177
178
    /**
179
     * @param array $campaignParams
180
     * @return string if no name-value is defined in the $campaignParams, date("y-m-d") will be used.
181
     */
182
    protected function getCampaignName($campaignParams){
183
        if(array_key_exists($this->tracking_params_campaign_name, $campaignParams)){
184
            return $campaignParams[$this->tracking_params_campaign_name];
185
        }
186
        return date("y-m-d");
187
    }
188
}
189