Skip to content

Commit 7d17663

Browse files
committed
init
0 parents  commit 7d17663

File tree

9 files changed

+914
-0
lines changed

9 files changed

+914
-0
lines changed

LICENSE.md

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
Open Software License ("OSL") v. 3.0
2+
3+
This Open Software License (the "License") applies to any original work of
4+
authorship (the "Original Work") whose owner (the "Licensor") has placed the
5+
following licensing notice adjacent to the copyright notice for the Original
6+
Work:
7+
8+
Licensed under the Open Software License version 3.0
9+
10+
1) Grant of Copyright License. Licensor grants You a worldwide, royalty-free,
11+
non-exclusive, sublicensable license, for the duration of the copyright, to do
12+
the following:
13+
14+
a) to reproduce the Original Work in copies, either alone or as part of a
15+
collective work;
16+
17+
b) to translate, adapt, alter, transform, modify, or arrange the Original
18+
Work, thereby creating derivative works ("Derivative Works") based upon the
19+
Original Work;
20+
21+
c) to distribute or communicate copies of the Original Work and Derivative
22+
Works to the public, with the proviso that copies of Original Work or
23+
Derivative Works that You distribute or communicate shall be licensed under
24+
this Open Software License;
25+
26+
d) to perform the Original Work publicly; and
27+
28+
e) to display the Original Work publicly.
29+
30+
2) Grant of Patent License. Licensor grants You a worldwide, royalty-free,
31+
non-exclusive, sublicensable license, under patent claims owned or controlled
32+
by the Licensor that are embodied in the Original Work as furnished by the
33+
Licensor, for the duration of the patents, to make, use, sell, offer for sale,
34+
have made, and import the Original Work and Derivative Works.
35+
36+
3) Grant of Source Code License. The term "Source Code" means the preferred
37+
form of the Original Work for making modifications to it and all available
38+
documentation describing how to modify the Original Work. Licensor agrees to
39+
provide a machine-readable copy of the Source Code of the Original Work along
40+
with each copy of the Original Work that Licensor distributes. Licensor
41+
reserves the right to satisfy this obligation by placing a machine-readable
42+
copy of the Source Code in an information repository reasonably calculated to
43+
permit inexpensive and convenient access by You for as long as Licensor
44+
continues to distribute the Original Work.
45+
46+
4) Exclusions From License Grant. Neither the names of Licensor, nor the names
47+
of any contributors to the Original Work, nor any of their trademarks or
48+
service marks, may be used to endorse or promote products derived from this
49+
Original Work without express prior permission of the Licensor. Except as
50+
expressly stated herein, nothing in this License grants any license to
51+
Licensor's trademarks, copyrights, patents, trade secrets or any other
52+
intellectual property. No patent license is granted to make, use, sell, offer
53+
for sale, have made, or import embodiments of any patent claims other than the
54+
licensed claims defined in Section 2. No license is granted to the trademarks
55+
of Licensor even if such marks are included in the Original Work. Nothing in
56+
this License shall be interpreted to prohibit Licensor from licensing under
57+
terms different from this License any Original Work that Licensor otherwise
58+
would have a right to license.
59+
60+
5) External Deployment. The term "External Deployment" means the use,
61+
distribution, or communication of the Original Work or Derivative Works in any
62+
way such that the Original Work or Derivative Works may be used by anyone
63+
other than You, whether those works are distributed or communicated to those
64+
persons or made available as an application intended for use over a network.
65+
As an express condition for the grants of license hereunder, You must treat
66+
any External Deployment by You of the Original Work or a Derivative Work as a
67+
distribution under section 1(c).
68+
69+
6) Attribution Rights. You must retain, in the Source Code of any Derivative
70+
Works that You create, all copyright, patent, or trademark notices from the
71+
Source Code of the Original Work, as well as any notices of licensing and any
72+
descriptive text identified therein as an "Attribution Notice." You must cause
73+
the Source Code for any Derivative Works that You create to carry a prominent
74+
Attribution Notice reasonably calculated to inform recipients that You have
75+
modified the Original Work.
76+
77+
7) Warranty of Provenance and Disclaimer of Warranty. Licensor warrants that
78+
the copyright in and to the Original Work and the patent rights granted herein
79+
by Licensor are owned by the Licensor or are sublicensed to You under the
80+
terms of this License with the permission of the contributor(s) of those
81+
copyrights and patent rights. Except as expressly stated in the immediately
82+
preceding sentence, the Original Work is provided under this License on an "AS
83+
IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without
84+
limitation, the warranties of non-infringement, merchantability or fitness for
85+
a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK
86+
IS WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this
87+
License. No license to the Original Work is granted by this License except
88+
under this disclaimer.
89+
90+
8) Limitation of Liability. Under no circumstances and under no legal theory,
91+
whether in tort (including negligence), contract, or otherwise, shall the
92+
Licensor be liable to anyone for any indirect, special, incidental, or
93+
consequential damages of any character arising as a result of this License or
94+
the use of the Original Work including, without limitation, damages for loss
95+
of goodwill, work stoppage, computer failure or malfunction, or any and all
96+
other commercial damages or losses. This limitation of liability shall not
97+
apply to the extent applicable law prohibits such limitation.
98+
99+
9) Acceptance and Termination. If, at any time, You expressly assented to this
100+
License, that assent indicates your clear and irrevocable acceptance of this
101+
License and all of its terms and conditions. If You distribute or communicate
102+
copies of the Original Work or a Derivative Work, You must make a reasonable
103+
effort under the circumstances to obtain the express assent of recipients to
104+
the terms of this License. This License conditions your rights to undertake
105+
the activities listed in Section 1, including your right to create Derivative
106+
Works based upon the Original Work, and doing so without honoring these terms
107+
and conditions is prohibited by copyright law and international treaty.
108+
Nothing in this License is intended to affect copyright exceptions and
109+
limitations (including "fair use" or "fair dealing"). This License shall
110+
terminate immediately and You may no longer exercise any of the rights granted
111+
to You by this License upon your failure to honor the conditions in Section
112+
1(c).
113+
114+
10) Termination for Patent Action. This License shall terminate automatically
115+
and You may no longer exercise any of the rights granted to You by this
116+
License as of the date You commence an action, including a cross-claim or
117+
counterclaim, against Licensor or any licensee alleging that the Original Work
118+
infringes a patent. This termination provision shall not apply for an action
119+
alleging patent infringement by combinations of the Original Work with other
120+
software or hardware.
121+
122+
11) Jurisdiction, Venue and Governing Law. Any action or suit relating to this
123+
License may be brought only in the courts of a jurisdiction wherein the
124+
Licensor resides or in which Licensor conducts its primary business, and under
125+
the laws of that jurisdiction excluding its conflict-of-law provisions. The
126+
application of the United Nations Convention on Contracts for the
127+
International Sale of Goods is expressly excluded. Any use of the Original
128+
Work outside the scope of this License or after its termination shall be
129+
subject to the requirements and penalties of copyright or patent law in the
130+
appropriate jurisdiction. This section shall survive the termination of this
131+
License.
132+
133+
12) Attorneys' Fees. In any action to enforce the terms of this License or
134+
seeking damages relating thereto, the prevailing party shall be entitled to
135+
recover its costs and expenses, including, without limitation, reasonable
136+
attorneys' fees and costs incurred in connection with such action, including
137+
any appeal of such action. This section shall survive the termination of this
138+
License.
139+
140+
13) Miscellaneous. If any provision of this License is held to be
141+
unenforceable, such provision shall be reformed only to the extent necessary
142+
to make it enforceable.
143+
144+
14) Definition of "You" in This License. "You" throughout this License,
145+
whether in upper or lower case, means an individual or a legal entity
146+
exercising rights under, and complying with all of the terms of, this License.
147+
For legal entities, "You" includes any entity that controls, is controlled by,
148+
or is under common control with you. For purposes of this definition,
149+
"control" means (i) the power, direct or indirect, to cause the direction or
150+
management of such entity, whether by contract or otherwise, or (ii) ownership
151+
of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial
152+
ownership of such entity.
153+
154+
15) Right to Use. You may use the Original Work in all ways not otherwise
155+
restricted or conditioned by this License or by law, and Licensor promises not
156+
to interfere with or be responsible for such uses by You.
157+
158+
16) Modification of This License. This License is Copyright © 2005 Lawrence
159+
Rosen. Permission is granted to copy, distribute, or communicate this License
160+
without modification. Nothing in this License permits You to modify this
161+
License as applied to the Original Work or to Derivative Works. However, You
162+
may modify the text of this License and copy, distribute or communicate your
163+
modified version (the "Modified License") and apply it to other original works
164+
of authorship subject to the following conditions: (i) You may not indicate in
165+
any way that your Modified License is the "Open Software License" or "OSL" and
166+
you may not use those names in the name of your Modified License; (ii) You
167+
must replace the notice specified in the first paragraph above with the notice
168+
"Licensed under hirale" or with a notice of your own
169+
that is not confusingly similar to the notice in this License; and (iii) You
170+
may not claim that your original works are open source software unless your
171+
Modified License has been approved by Open Source Initiative (OSI) and You
172+
comply with its license review and certification process.

README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Hirale GAMeasurementProtocol
2+
3+
A module for integrating with the [Google Analytics 4 Measurement Protocol API](https://developers.google.com/analytics/devguides/collection/protocol/ga4/reference?client_type=gtag#overview), sending events from server side.
4+
5+
This module can work with Mage_GoogleAnalytics module.
6+
For duplicate key events, you can consult this page [https://support.google.com/analytics/answer/12313109?hl=en](https://support.google.com/analytics/answer/12313109?hl=en)
7+
8+
# Attention: this module reuses added and removed items of module Mage_GoogleAnalytics, it will apply a patch for core module. Check patch here [https://github.com/hirale/magento-lts/pull/1/files](https://github.com/hirale/magento-lts/pull/1/files)
9+
10+
11+
## Install
12+
13+
### Install with [Magento Composer Installer](https://github.com/Cotya/magento-composer-installer)
14+
15+
```bash
16+
composer require hirale/openmage-ga4-measurement:dev-master
17+
```
18+
19+
## Usage
20+
21+
### Setup
22+
23+
1. Generate an API SECRET in the Google Analytics UI. To create a new secret, navigate to `Admin > Data Streams > choose your stream > Measurement Protocol > Create`.
24+
2. Get measurement ID associated with a stream, found in the Google Analytics UI under `Admin > Data Streams > choose your stream > Measurement ID`.
25+
3. Go to openmage system config `System > Configuration > Sales > Google API > Measurement Protocol`. Insert the parameters from step 1 and 2, save.
26+
27+
28+
## License
29+
30+
The Open Software License v. 3.0 (OSL-3.0). Please see [License File](LICENSE.md) for more information.

composer.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"name": "hirale/openmage-ga4-measurement",
3+
"description": "A module for integrating with the Google Analytics 4 Measurement Protocol API",
4+
"type": "magento-module",
5+
"license": "OSL-3.0",
6+
"keywords": [
7+
"magento",
8+
"magento1",
9+
"openmage"
10+
],
11+
"require": {
12+
"php": "^8.0",
13+
"magento-hackathon/magento-composer-installer": "*",
14+
"hirale/openmage-redis-queue": "*"
15+
},
16+
"authors": [
17+
{
18+
"name": "Hirale"
19+
}
20+
],
21+
"config": {
22+
"allow-plugins": {
23+
"cweagans/composer-patches": true
24+
}
25+
},
26+
"extra": {
27+
"map": [
28+
[
29+
"src/app/etc/modules/Hirale_GAMeasurementProtocol.xml",
30+
"app/etc/modules/Hirale_GAMeasurementProtocol.xml"
31+
],
32+
[
33+
"src/app/code/community/Hirale/GAMeasurementProtocol",
34+
"app/code/community/Hirale/GAMeasurementProtocol"
35+
]
36+
]
37+
}
38+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
<?php
2+
class Hirale_GAMeasurementProtocol_Helper_Data extends Mage_Core_Helper_Abstract
3+
{
4+
const GA4_MEASUREMENT_PROTOCOL_URL = 'https://www.google-analytics.com/mp/collect';
5+
const GA4_MEASUREMENT_PROTOCOL_DEBUG_URL = 'https://www.google-analytics.com/debug/mp/collect';
6+
protected $_isMeasurementEnabled = null;
7+
protected $_measurementId = null;
8+
protected $_apiSecret = null;
9+
protected $_isDebugMode = null;
10+
11+
public function isMeasurementEnabled()
12+
{
13+
if (is_null($this->_isMeasurementEnabled)) {
14+
$this->_isMeasurementEnabled = Mage::getStoreConfig('google/measurement/enabled');
15+
}
16+
return $this->_isMeasurementEnabled;
17+
}
18+
19+
public function isDebugMode()
20+
{
21+
if (is_null($this->_isDebugMode)) {
22+
$this->_isDebugMode = Mage::getStoreConfig('google/measurement/debug_mode');
23+
}
24+
return $this->_isDebugMode;
25+
}
26+
27+
public function getMeasurementProtocolUrl()
28+
{
29+
return $this->isDebugMode() ? self::GA4_MEASUREMENT_PROTOCOL_DEBUG_URL : self::GA4_MEASUREMENT_PROTOCOL_URL;
30+
}
31+
32+
33+
public function getMeasurementId()
34+
{
35+
if (is_null($this->_measurementId)) {
36+
$this->_measurementId = Mage::getStoreConfig('google/measurement/measurement_id');
37+
}
38+
return $this->_measurementId;
39+
}
40+
41+
public function getApiSecret()
42+
{
43+
if (is_null($this->_apiSecret)) {
44+
$this->_apiSecret = Mage::getStoreConfig('google/measurement/api_secret');
45+
}
46+
return $this->_apiSecret;
47+
}
48+
49+
50+
public function getClientId()
51+
{
52+
53+
if (isset($_COOKIE['_ga'])) {
54+
$ga = explode('.', $_COOKIE['_ga']);
55+
$clientId = $ga[2] . '.' . $ga[3];
56+
} else {
57+
$randomNumber = mt_rand(1000000000, 9999999999);
58+
$timestamp = time();
59+
$clientId = $randomNumber . '.' . $timestamp;
60+
}
61+
62+
return $clientId;
63+
}
64+
65+
public function formatPrice($price)
66+
{
67+
return (float) number_format($price, 2, '.', '');
68+
}
69+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
class Hirale_GAMeasurementProtocol_Model_Api implements Hirale_Queue_Model_TaskHandlerInterface
3+
{
4+
protected $helper;
5+
6+
public function __construct()
7+
{
8+
$this->helper = Mage::helper('gameasurementprotocol');
9+
}
10+
11+
public function handle($data)
12+
{
13+
$event = $data['data']['event'];
14+
$url = $this->helper->getMeasurementProtocolUrl();
15+
$measurementId = $this->helper->getMeasurementId();
16+
$apiSecret = $this->helper->getApiSecret();
17+
18+
if (!$url || !$measurementId || !$apiSecret) {
19+
return;
20+
}
21+
22+
$url .= "?measurement_id=$measurementId&api_secret=$apiSecret";
23+
$ch = curl_init($url);
24+
$payload = json_encode($event, JSON_UNESCAPED_SLASHES);
25+
curl_setopt($ch, CURLOPT_POST, 1);
26+
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
27+
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
28+
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
29+
$response = curl_exec($ch);
30+
if ($this->helper->isDebugMode()) {
31+
Mage::log($payload);
32+
Mage::log($response);
33+
}
34+
if (curl_errno($ch)) {
35+
throw new Exception(curl_error($ch));
36+
}
37+
curl_close($ch);
38+
}
39+
}

0 commit comments

Comments
 (0)