... | ... |
@@ -1,4 +1,4 @@ |
1 |
-OXID module: Google Analytics |
|
1 |
+OXID module: Google Analytics GA4 |
|
2 | 2 |
==== |
3 | 3 |
|
4 | 4 |
Adds google analytics incl. eCommerce tracking to Oxid |
... | ... |
@@ -17,7 +17,7 @@ PHP > 5.3 |
17 | 17 |
Installation |
18 | 18 |
---- |
19 | 19 |
Install files in your oxid modules/ folder. Alternatively you can install them in your modules/esales/ vendor folder. |
20 |
-Add [{block name="es_analytics_code"}][{/block}] to html head in base.tpl. |
|
20 |
+Add [{block name="es_analytics_ga4_code"}][{/block}] to html head in base.tpl. |
|
21 | 21 |
|
22 | 22 |
|
23 | 23 |
License |
24 | 24 |
deleted file mode 100644 |
... | ... |
@@ -1,217 +0,0 @@ |
1 |
-<?php |
|
2 |
-/** |
|
3 |
- * eSales Media Analytics extension for OXID |
|
4 |
- * |
|
5 |
- * @author Benjamin Roth [benjamin@esales-media.de] |
|
6 |
- * @copyright 2015 eSales Media [http://www.esales-media.de] |
|
7 |
- */ |
|
8 |
- |
|
9 |
-/** |
|
10 |
- * Class es_analytics defines activation events |
|
11 |
- */ |
|
12 |
-class es_analytics_events |
|
13 |
-{ |
|
14 |
- // Module fields |
|
15 |
- protected static $arrFields = array |
|
16 |
- ( |
|
17 |
-// array('OXFIELD','VARCHAR(4) NOT NULL default \'\'','oxarticles',false), |
|
18 |
- ); |
|
19 |
- |
|
20 |
- // Theme config options |
|
21 |
- protected static $arrConfig = array |
|
22 |
- ( |
|
23 |
-// array('sManufacturerThumbnailsize','str','200*200','theme:azure','images'), |
|
24 |
- ); |
|
25 |
- |
|
26 |
- // Float theme config fields |
|
27 |
- protected static $_aParseFloat = array(); |
|
28 |
- |
|
29 |
- /** |
|
30 |
- * Is called on module activation. Checks for database fields and adds them |
|
31 |
- */ |
|
32 |
- public static function onActivate() |
|
33 |
- { |
|
34 |
- |
|
35 |
- $iShopId = oxRegistry::getConfig()->getShopId(); |
|
36 |
- $oConfig = oxRegistry::getConfig(); |
|
37 |
- |
|
38 |
- $sDb_name = $oConfig->getConfigParam('dbName'); |
|
39 |
- |
|
40 |
- // SQL patterns |
|
41 |
- $sCheckSQL = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = '%s' AND COLUMN_NAME = '%s'"; |
|
42 |
- $sAddSQL = "ALTER TABLE `%s` ADD `%s` %s"; |
|
43 |
- |
|
44 |
- |
|
45 |
- // Check and create fields |
|
46 |
- $blnDbAltered = false; |
|
47 |
- foreach (self::$arrFields as $field) |
|
48 |
- { |
|
49 |
- if ($field[3]) |
|
50 |
- { |
|
51 |
- $arrFieldVariants = array('','_1','_2','_3'); |
|
52 |
- } else { |
|
53 |
- $arrFieldVariants = array(''); |
|
54 |
- } |
|
55 |
- |
|
56 |
- foreach ($arrFieldVariants as $fieldVariant) |
|
57 |
- { |
|
58 |
- $rCheck = oxDb::getDb()->getArray(sprintf($sCheckSQL,$field[2],$field[0].$fieldVariant),array($sDb_name)); |
|
59 |
- |
|
60 |
- if (!count($rCheck)) |
|
61 |
- { |
|
62 |
- $blnDbAltered = true; |
|
63 |
- oxDb::getDb()->Execute(sprintf($sAddSQL,$field[2],$field[0].$fieldVariant,$field[1])); |
|
64 |
- } |
|
65 |
- } |
|
66 |
- } |
|
67 |
- |
|
68 |
- // Check and create config fields |
|
69 |
- foreach (self::$arrConfig as $conf) |
|
70 |
- { |
|
71 |
- if (!$oConfig->getConfigParam($conf[0])) |
|
72 |
- { |
|
73 |
- $oConfig->saveShopConfVar($conf[1],$conf[0],self::_serializeConfVar($conf[1],$conf[0],$conf[2]),$iShopId,$conf[3]); |
|
74 |
- |
|
75 |
- $sOxId = oxUtilsObject::getInstance()->generateUId(); |
|
76 |
- $iPosition = oxDb::getDb()->getOne("SELECT MAX(`OXPOS`)+1 FROM oxconfigdisplay WHERE `OXCFGMODULE` = " . oxDb::getDb()->quote($conf[3]) . " AND `OXGROUPING` = " . oxDb::getDb()->quote($conf[4])); |
|
77 |
- $sInsertSql = "INSERT INTO `oxconfigdisplay` (`OXID`, `OXCFGMODULE`, `OXCFGVARNAME`, `OXGROUPING`, `OXPOS`) " . |
|
78 |
- "VALUES ('{$sOxId}', " . oxDb::getDb()->quote($conf[3]) . ", " . oxDb::getDb()->quote($conf[0]) . ", " . oxDb::getDb()->quote($conf[4]) . ", " . oxDb::getDb()->quote($iPosition) . ")"; |
|
79 |
- oxDb::getDb()->execute($sInsertSql); |
|
80 |
- } |
|
81 |
- } |
|
82 |
- |
|
83 |
- if ($blnDbAltered) |
|
84 |
- { |
|
85 |
- $oMetaData = oxNew('oxDbMetaDataHandler'); |
|
86 |
- $oMetaData->updateViews(); |
|
87 |
- } |
|
88 |
- |
|
89 |
- } |
|
90 |
- |
|
91 |
- public static function onDeactivate() |
|
92 |
- { |
|
93 |
- $iShopId = oxRegistry::getConfig()->getShopId(); |
|
94 |
- $oConfig = oxRegistry::getConfig(); |
|
95 |
- |
|
96 |
- if ($oConfig->getConfigParam('blOxEsAnalyticsSweep')) |
|
97 |
- { |
|
98 |
- $sDb_name = $oConfig->getConfigParam('dbName'); |
|
99 |
- |
|
100 |
- // SQL patterns |
|
101 |
- $sCheckSQL = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = '%s' AND COLUMN_NAME = '%s'"; |
|
102 |
- $sDelSQL = "ALTER TABLE `%s` DROP COLUMN `%s`"; |
|
103 |
- |
|
104 |
- |
|
105 |
- // Check and delete fields |
|
106 |
- $blnDbAltered = false; |
|
107 |
- foreach (self::$arrFields as $field) |
|
108 |
- { |
|
109 |
- if ($field[3]) |
|
110 |
- { |
|
111 |
- $arrFieldVariants = array('', '_1', '_2', '_3'); |
|
112 |
- } else |
|
113 |
- { |
|
114 |
- $arrFieldVariants = array(''); |
|
115 |
- } |
|
116 |
- |
|
117 |
- foreach ($arrFieldVariants as $fieldVariant) |
|
118 |
- { |
|
119 |
- $rCheck = oxDb::getDb()->getArray(sprintf($sCheckSQL, $field[2], $field[0] . $fieldVariant), array($sDb_name)); |
|
120 |
- |
|
121 |
- if (count($rCheck)) |
|
122 |
- { |
|
123 |
- $blnDbAltered = true; |
|
124 |
- oxDb::getDb()->Execute(sprintf($sDelSQL, $field[2], $field[0] . $fieldVariant)); |
|
125 |
- } |
|
126 |
- } |
|
127 |
- } |
|
128 |
- |
|
129 |
- |
|
130 |
- |
|
131 |
- if ($blnDbAltered) |
|
132 |
- { |
|
133 |
- $oMetaData = oxNew('oxDbMetaDataHandler'); |
|
134 |
- $oMetaData->updateViews(); |
|
135 |
- } |
|
136 |
- |
|
137 |
- $oConfig->saveShopConfVar('bool','blOxEsAnalyticsSweep','false',$iShopId,'module:es:analytics'); |
|
138 |
- |
|
139 |
- } |
|
140 |
- // Check and delete config fields |
|
141 |
- foreach (self::$arrConfig as $conf) |
|
142 |
- { |
|
143 |
- if ($oConfig->getConfigParam($conf[0])) |
|
144 |
- { |
|
145 |
- // SQL patterns |
|
146 |
- $sDelConfSql = "DELETE FROM `oxconfigdisplay` WHERE OXCFGMODULE=" . oxDb::getDb()->quote($conf[3]) . " AND OXCFGVARNAME=" . oxDb::getDb()->quote($conf[0]); |
|
147 |
- oxDb::getDb()->Execute($sDelConfSql); |
|
148 |
- $sDelConfSql = "DELETE FROM `oxconfig` WHERE OXMODULE=" . oxDb::getDb()->quote($conf[3]) . " AND OXVARNAME=" . oxDb::getDb()->quote($conf[0]); |
|
149 |
- oxDb::getDb()->Execute($sDelConfSql); |
|
150 |
- } |
|
151 |
- } |
|
152 |
- } |
|
153 |
- |
|
154 |
- protected static function _serializeConfVar($sType, $sName, $mValue) |
|
155 |
- { |
|
156 |
- $sData = $mValue; |
|
157 |
- |
|
158 |
- switch ($sType) { |
|
159 |
- case "bool": |
|
160 |
- break; |
|
161 |
- |
|
162 |
- case "str": |
|
163 |
- case "select": |
|
164 |
- case "int": |
|
165 |
- if (in_array($sName, self::$_aParseFloat)) { |
|
166 |
- $sData = str_replace(',', '.', $sData); |
|
167 |
- } |
|
168 |
- break; |
|
169 |
- |
|
170 |
- case "arr": |
|
171 |
- if (!is_array($mValue)) { |
|
172 |
- $sData = self::_multilineToArray($mValue); |
|
173 |
- } |
|
174 |
- break; |
|
175 |
- |
|
176 |
- case "aarr": |
|
177 |
- $sData = self::_multilineToAarray($mValue); |
|
178 |
- break; |
|
179 |
- } |
|
180 |
- |
|
181 |
- return $sData; |
|
182 |
- } |
|
183 |
- |
|
184 |
- protected static function _multilineToArray($sMultiline) |
|
185 |
- { |
|
186 |
- $aArr = explode("\n", $sMultiline); |
|
187 |
- if (is_array($aArr)) { |
|
188 |
- foreach ($aArr as $sKey => $sVal) { |
|
189 |
- $aArr[$sKey] = trim($sVal); |
|
190 |
- if ($aArr[$sKey] == "") { |
|
191 |
- unset($aArr[$sKey]); |
|
192 |
- } |
|
193 |
- } |
|
194 |
- |
|
195 |
- return $aArr; |
|
196 |
- } |
|
197 |
- } |
|
198 |
- |
|
199 |
- protected static function _multilineToAarray($sMultiline) |
|
200 |
- { |
|
201 |
- $oStr = getStr(); |
|
202 |
- $aArr = array(); |
|
203 |
- $aLines = explode("\n", $sMultiline); |
|
204 |
- foreach ($aLines as $sLine) { |
|
205 |
- $sLine = trim($sLine); |
|
206 |
- if ($sLine != "" && $oStr->preg_match("/(.+)=>(.+)/", $sLine, $aRegs)) { |
|
207 |
- $sKey = trim($aRegs[1]); |
|
208 |
- $sVal = trim($aRegs[2]); |
|
209 |
- if ($sKey != "" && $sVal != "") { |
|
210 |
- $aArr[$sKey] = $sVal; |
|
211 |
- } |
|
212 |
- } |
|
213 |
- } |
|
214 |
- |
|
215 |
- return $aArr; |
|
216 |
- } |
|
217 |
-} |
218 | 0 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,217 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * eSales Media Analytics extension for OXID |
|
4 |
+ * |
|
5 |
+ * @author Benjamin Roth [benjamin@esales-media.de] |
|
6 |
+ * @copyright 2015 eSales Media [http://www.esales-media.de] |
|
7 |
+ */ |
|
8 |
+ |
|
9 |
+/** |
|
10 |
+ * Class es_analytics defines activation events |
|
11 |
+ */ |
|
12 |
+class es_analytics_ga4_events |
|
13 |
+{ |
|
14 |
+ // Module fields |
|
15 |
+ protected static $arrFields = array |
|
16 |
+ ( |
|
17 |
+// array('OXFIELD','VARCHAR(4) NOT NULL default \'\'','oxarticles',false), |
|
18 |
+ ); |
|
19 |
+ |
|
20 |
+ // Theme config options |
|
21 |
+ protected static $arrConfig = array |
|
22 |
+ ( |
|
23 |
+// array('sManufacturerThumbnailsize','str','200*200','theme:azure','images'), |
|
24 |
+ ); |
|
25 |
+ |
|
26 |
+ // Float theme config fields |
|
27 |
+ protected static $_aParseFloat = array(); |
|
28 |
+ |
|
29 |
+ /** |
|
30 |
+ * Is called on module activation. Checks for database fields and adds them |
|
31 |
+ */ |
|
32 |
+ public static function onActivate() |
|
33 |
+ { |
|
34 |
+ |
|
35 |
+ $iShopId = oxRegistry::getConfig()->getShopId(); |
|
36 |
+ $oConfig = oxRegistry::getConfig(); |
|
37 |
+ |
|
38 |
+ $sDb_name = $oConfig->getConfigParam('dbName'); |
|
39 |
+ |
|
40 |
+ // SQL patterns |
|
41 |
+ $sCheckSQL = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = '%s' AND COLUMN_NAME = '%s'"; |
|
42 |
+ $sAddSQL = "ALTER TABLE `%s` ADD `%s` %s"; |
|
43 |
+ |
|
44 |
+ |
|
45 |
+ // Check and create fields |
|
46 |
+ $blnDbAltered = false; |
|
47 |
+ foreach (self::$arrFields as $field) |
|
48 |
+ { |
|
49 |
+ if ($field[3]) |
|
50 |
+ { |
|
51 |
+ $arrFieldVariants = array('','_1','_2','_3'); |
|
52 |
+ } else { |
|
53 |
+ $arrFieldVariants = array(''); |
|
54 |
+ } |
|
55 |
+ |
|
56 |
+ foreach ($arrFieldVariants as $fieldVariant) |
|
57 |
+ { |
|
58 |
+ $rCheck = oxDb::getDb()->getArray(sprintf($sCheckSQL,$field[2],$field[0].$fieldVariant),array($sDb_name)); |
|
59 |
+ |
|
60 |
+ if (!count($rCheck)) |
|
61 |
+ { |
|
62 |
+ $blnDbAltered = true; |
|
63 |
+ oxDb::getDb()->Execute(sprintf($sAddSQL,$field[2],$field[0].$fieldVariant,$field[1])); |
|
64 |
+ } |
|
65 |
+ } |
|
66 |
+ } |
|
67 |
+ |
|
68 |
+ // Check and create config fields |
|
69 |
+ foreach (self::$arrConfig as $conf) |
|
70 |
+ { |
|
71 |
+ if (!$oConfig->getConfigParam($conf[0])) |
|
72 |
+ { |
|
73 |
+ $oConfig->saveShopConfVar($conf[1],$conf[0],self::_serializeConfVar($conf[1],$conf[0],$conf[2]),$iShopId,$conf[3]); |
|
74 |
+ |
|
75 |
+ $sOxId = oxUtilsObject::getInstance()->generateUId(); |
|
76 |
+ $iPosition = oxDb::getDb()->getOne("SELECT MAX(`OXPOS`)+1 FROM oxconfigdisplay WHERE `OXCFGMODULE` = " . oxDb::getDb()->quote($conf[3]) . " AND `OXGROUPING` = " . oxDb::getDb()->quote($conf[4])); |
|
77 |
+ $sInsertSql = "INSERT INTO `oxconfigdisplay` (`OXID`, `OXCFGMODULE`, `OXCFGVARNAME`, `OXGROUPING`, `OXPOS`) " . |
|
78 |
+ "VALUES ('{$sOxId}', " . oxDb::getDb()->quote($conf[3]) . ", " . oxDb::getDb()->quote($conf[0]) . ", " . oxDb::getDb()->quote($conf[4]) . ", " . oxDb::getDb()->quote($iPosition) . ")"; |
|
79 |
+ oxDb::getDb()->execute($sInsertSql); |
|
80 |
+ } |
|
81 |
+ } |
|
82 |
+ |
|
83 |
+ if ($blnDbAltered) |
|
84 |
+ { |
|
85 |
+ $oMetaData = oxNew('oxDbMetaDataHandler'); |
|
86 |
+ $oMetaData->updateViews(); |
|
87 |
+ } |
|
88 |
+ |
|
89 |
+ } |
|
90 |
+ |
|
91 |
+ public static function onDeactivate() |
|
92 |
+ { |
|
93 |
+ $iShopId = oxRegistry::getConfig()->getShopId(); |
|
94 |
+ $oConfig = oxRegistry::getConfig(); |
|
95 |
+ |
|
96 |
+ if ($oConfig->getConfigParam('blOxEsAnalyticsGA4Sweep')) |
|
97 |
+ { |
|
98 |
+ $sDb_name = $oConfig->getConfigParam('dbName'); |
|
99 |
+ |
|
100 |
+ // SQL patterns |
|
101 |
+ $sCheckSQL = "SELECT * FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = '%s' AND COLUMN_NAME = '%s'"; |
|
102 |
+ $sDelSQL = "ALTER TABLE `%s` DROP COLUMN `%s`"; |
|
103 |
+ |
|
104 |
+ |
|
105 |
+ // Check and delete fields |
|
106 |
+ $blnDbAltered = false; |
|
107 |
+ foreach (self::$arrFields as $field) |
|
108 |
+ { |
|
109 |
+ if ($field[3]) |
|
110 |
+ { |
|
111 |
+ $arrFieldVariants = array('', '_1', '_2', '_3'); |
|
112 |
+ } else |
|
113 |
+ { |
|
114 |
+ $arrFieldVariants = array(''); |
|
115 |
+ } |
|
116 |
+ |
|
117 |
+ foreach ($arrFieldVariants as $fieldVariant) |
|
118 |
+ { |
|
119 |
+ $rCheck = oxDb::getDb()->getArray(sprintf($sCheckSQL, $field[2], $field[0] . $fieldVariant), array($sDb_name)); |
|
120 |
+ |
|
121 |
+ if (count($rCheck)) |
|
122 |
+ { |
|
123 |
+ $blnDbAltered = true; |
|
124 |
+ oxDb::getDb()->Execute(sprintf($sDelSQL, $field[2], $field[0] . $fieldVariant)); |
|
125 |
+ } |
|
126 |
+ } |
|
127 |
+ } |
|
128 |
+ |
|
129 |
+ |
|
130 |
+ |
|
131 |
+ if ($blnDbAltered) |
|
132 |
+ { |
|
133 |
+ $oMetaData = oxNew('oxDbMetaDataHandler'); |
|
134 |
+ $oMetaData->updateViews(); |
|
135 |
+ } |
|
136 |
+ |
|
137 |
+ $oConfig->saveShopConfVar('bool','blOxEsAnalyticsGA4Sweep','false',$iShopId,'module:es:analytics:ga4'); |
|
138 |
+ |
|
139 |
+ } |
|
140 |
+ // Check and delete config fields |
|
141 |
+ foreach (self::$arrConfig as $conf) |
|
142 |
+ { |
|
143 |
+ if ($oConfig->getConfigParam($conf[0])) |
|
144 |
+ { |
|
145 |
+ // SQL patterns |
|
146 |
+ $sDelConfSql = "DELETE FROM `oxconfigdisplay` WHERE OXCFGMODULE=" . oxDb::getDb()->quote($conf[3]) . " AND OXCFGVARNAME=" . oxDb::getDb()->quote($conf[0]); |
|
147 |
+ oxDb::getDb()->Execute($sDelConfSql); |
|
148 |
+ $sDelConfSql = "DELETE FROM `oxconfig` WHERE OXMODULE=" . oxDb::getDb()->quote($conf[3]) . " AND OXVARNAME=" . oxDb::getDb()->quote($conf[0]); |
|
149 |
+ oxDb::getDb()->Execute($sDelConfSql); |
|
150 |
+ } |
|
151 |
+ } |
|
152 |
+ } |
|
153 |
+ |
|
154 |
+ protected static function _serializeConfVar($sType, $sName, $mValue) |
|
155 |
+ { |
|
156 |
+ $sData = $mValue; |
|
157 |
+ |
|
158 |
+ switch ($sType) { |
|
159 |
+ case "bool": |
|
160 |
+ break; |
|
161 |
+ |
|
162 |
+ case "str": |
|
163 |
+ case "select": |
|
164 |
+ case "int": |
|
165 |
+ if (in_array($sName, self::$_aParseFloat)) { |
|
166 |
+ $sData = str_replace(',', '.', $sData); |
|
167 |
+ } |
|
168 |
+ break; |
|
169 |
+ |
|
170 |
+ case "arr": |
|
171 |
+ if (!is_array($mValue)) { |
|
172 |
+ $sData = self::_multilineToArray($mValue); |
|
173 |
+ } |
|
174 |
+ break; |
|
175 |
+ |
|
176 |
+ case "aarr": |
|
177 |
+ $sData = self::_multilineToAarray($mValue); |
|
178 |
+ break; |
|
179 |
+ } |
|
180 |
+ |
|
181 |
+ return $sData; |
|
182 |
+ } |
|
183 |
+ |
|
184 |
+ protected static function _multilineToArray($sMultiline) |
|
185 |
+ { |
|
186 |
+ $aArr = explode("\n", $sMultiline); |
|
187 |
+ if (is_array($aArr)) { |
|
188 |
+ foreach ($aArr as $sKey => $sVal) { |
|
189 |
+ $aArr[$sKey] = trim($sVal); |
|
190 |
+ if ($aArr[$sKey] == "") { |
|
191 |
+ unset($aArr[$sKey]); |
|
192 |
+ } |
|
193 |
+ } |
|
194 |
+ |
|
195 |
+ return $aArr; |
|
196 |
+ } |
|
197 |
+ } |
|
198 |
+ |
|
199 |
+ protected static function _multilineToAarray($sMultiline) |
|
200 |
+ { |
|
201 |
+ $oStr = getStr(); |
|
202 |
+ $aArr = array(); |
|
203 |
+ $aLines = explode("\n", $sMultiline); |
|
204 |
+ foreach ($aLines as $sLine) { |
|
205 |
+ $sLine = trim($sLine); |
|
206 |
+ if ($sLine != "" && $oStr->preg_match("/(.+)=>(.+)/", $sLine, $aRegs)) { |
|
207 |
+ $sKey = trim($aRegs[1]); |
|
208 |
+ $sVal = trim($aRegs[2]); |
|
209 |
+ if ($sKey != "" && $sVal != "") { |
|
210 |
+ $aArr[$sKey] = $sVal; |
|
211 |
+ } |
|
212 |
+ } |
|
213 |
+ } |
|
214 |
+ |
|
215 |
+ return $aArr; |
|
216 |
+ } |
|
217 |
+} |
... | ... |
@@ -28,14 +28,14 @@ $sMetadataVersion = '1.2'; |
28 | 28 |
* Module information |
29 | 29 |
*/ |
30 | 30 |
$aModule = array( |
31 |
- 'id' => 'es_analytics', |
|
31 |
+ 'id' => 'es_analytics_ga4', |
|
32 | 32 |
'title' => array( |
33 |
- 'de' => '<span style="color: #495058; display:inline-block; font-weight: 700;"><span style="-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%; background-color: #52aa00; display: inline-block; line-height: 1.2; width: 1.1em; height: 1.2em; padding-right: 0.1em; text-align: right; color: #fff; margin-right: 0.1em;">e</span>Sales <span style="color: #52aa00;">Media</span></span> Google Analytics', |
|
34 |
- 'en' => '<span style="color: #495058; display:inline-block; font-weight: 700;"><span style="-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%; background-color: #52aa00; display: inline-block; line-height: 1.2; width: 1.1em; height: 1.2em; padding-right: 0.1em; text-align: right; color: #fff; margin-right: 0.1em;">e</span>Sales <span style="color: #52aa00;">Media</span></span> Google Analytics', |
|
33 |
+ 'de' => '<span style="color: #495058; display:inline-block; font-weight: 700;"><span style="-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%; background-color: #52aa00; display: inline-block; line-height: 1.2; width: 1.1em; height: 1.2em; padding-right: 0.1em; text-align: right; color: #fff; margin-right: 0.1em;">e</span>Sales <span style="color: #52aa00;">Media</span></span> Google Analytics GA4', |
|
34 |
+ 'en' => '<span style="color: #495058; display:inline-block; font-weight: 700;"><span style="-webkit-border-radius: 50%;-moz-border-radius: 50%;border-radius: 50%; background-color: #52aa00; display: inline-block; line-height: 1.2; width: 1.1em; height: 1.2em; padding-right: 0.1em; text-align: right; color: #fff; margin-right: 0.1em;">e</span>Sales <span style="color: #52aa00;">Media</span></span> Google Analytics GA4', |
|
35 | 35 |
), |
36 | 36 |
'description' => array( |
37 |
- 'de' => 'Fügt Google Analytics zum Shop hinzu, inkl. E-Commerce Tracking', |
|
38 |
- 'en' => 'Adds Google Analytics to the shop incl. eCommerce Tracking', |
|
37 |
+ 'de' => 'Fügt Google Analytics GA4 zum Shop hinzu, inkl. E-Commerce Tracking', |
|
38 |
+ 'en' => 'Adds Google Analytics GA4 to the shop incl. eCommerce Tracking', |
|
39 | 39 |
), |
40 | 40 |
'thumbnail' => 'picture.png', |
41 | 41 |
'version' => '1.0.0', |
... | ... |
@@ -43,26 +43,26 @@ $aModule = array( |
43 | 43 |
'url' => 'http://www.esales-media.de', |
44 | 44 |
'email' => 'info@esales-media.de', |
45 | 45 |
'extend' => array( |
46 |
-// 'oxarticle' => 'esales/es_analytics/models/es_analytics_oxarticle', |
|
46 |
+// 'oxarticle' => 'esales/es_analytics_ga4/models/es_analytics_ga4_oxarticle', |
|
47 | 47 |
), |
48 | 48 |
'files' => array( |
49 |
-// 'es_article_nutritionfacts' => 'esales/es_analytics/controllers/admin/es_article_nutritionfacts.php', |
|
50 |
- 'es_analytics_events' => 'esales/es_analytics/core/es_analytics_events.php', |
|
49 |
+// 'es_article_nutritionfacts' => 'esales/es_analytics_ga4/controllers/admin/es_article_nutritionfacts.php', |
|
50 |
+ 'es_analytics_ga4_events' => 'esales/es_analytics_ga4/core/es_analytics_ga4_events.php', |
|
51 | 51 |
), |
52 | 52 |
'templates' => array( |
53 |
-// 'es_article_nutritionfacts.tpl' => 'esales/es_analytics/views/admin/tpl/es_article_nutritionfacts.tpl', |
|
53 |
+// 'es_article_nutritionfacts.tpl' => 'esales/es_analytics_ga4/views/admin/tpl/es_article_nutritionfacts.tpl', |
|
54 | 54 |
), |
55 | 55 |
'blocks' => array( |
56 |
- array('template' => 'layout/base.tpl', 'block' => 'es_analytics_code', 'file' => 'views/blocks/es_analytics_code_head_css.tpl'), |
|
56 |
+ array('template' => 'layout/base.tpl', 'block' => 'es_analytics_ga4_code', 'file' => 'views/blocks/es_analytics_ga4_code_head_css.tpl'), |
|
57 | 57 |
), |
58 | 58 |
'events' => array( |
59 |
- 'onActivate' => 'es_analytics_events::onActivate', |
|
60 |
- 'onDeactivate' => 'es_analytics_events::onDeactivate' |
|
59 |
+ 'onActivate' => 'es_analytics_ga4_events::onActivate', |
|
60 |
+ 'onDeactivate' => 'es_analytics_ga4_events::onDeactivate' |
|
61 | 61 |
), |
62 | 62 |
'settings' => array( |
63 |
- array('group' => 'main', 'name' => 'sOxEsAnalyticsId', 'type' => 'str', 'value' => ''), |
|
64 |
- array('group' => 'main', 'name' => 'sOxEsAdsId', 'type' => 'str', 'value' => ''), |
|
65 |
- array('group' => 'main', 'name' => 'sOxEsAdsConvLabel', 'type' => 'str', 'value' => ''), |
|
66 |
- array('group' => 'esUninstall', 'name' => 'blOxEsAnalyticsSweep', 'type' => 'bool', 'value' => 'false'), |
|
63 |
+ array('group' => 'main', 'name' => 'sOxEsGA4AnalyticsId', 'type' => 'str', 'value' => ''), |
|
64 |
+ array('group' => 'main', 'name' => 'sOxEsGA4AdsId', 'type' => 'str', 'value' => ''), |
|
65 |
+ array('group' => 'main', 'name' => 'sOxEsGA4AdsConvLabel', 'type' => 'str', 'value' => ''), |
|
66 |
+ array('group' => 'esUninstall', 'name' => 'blOxEsAnalyticsGA4Sweep', 'type' => 'bool', 'value' => 'false'), |
|
67 | 67 |
) |
68 | 68 |
); |
69 | 69 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,21 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * eSales Media Nutrition Facts extension for OXID |
|
4 |
+ * |
|
5 |
+ * @author Benjamin Roth [benjamin@esales-media.de] |
|
6 |
+ * @copyright 2015 eSales Media [http://www.esales-media.de] |
|
7 |
+ */ |
|
8 |
+ |
|
9 |
+// ------------------------------- |
|
10 |
+// RESOURCE IDENTIFIER = STRING |
|
11 |
+// ------------------------------- |
|
12 |
+$sLangName = 'Deutsch'; |
|
13 |
+$aLang = array( |
|
14 |
+ 'charset' => 'UTF-8', |
|
15 |
+ 'SHOP_MODULE_GROUP_esUninstall' => 'Deinstallieren', |
|
16 |
+ 'SHOP_MODULE_sOxEsGA4AnalyticsId' => 'Google Analytics ID (UA-XXXXX-X)', |
|
17 |
+ 'SHOP_MODULE_sOxEsGA4AdsId' => 'Google Ads ID (AW-XXXXX)', |
|
18 |
+ 'SHOP_MODULE_sOxEsGA4AdsConvLabel' => 'Google Ads Conversion Label', |
|
19 |
+ 'SHOP_MODULE_blOxEsAnalyticsGA4Sweep' => 'Alle zum Modul gehörenden Datenbankfelder löschen<p class="info">ACHTUNG: Bereits eingetragene Daten gehen verloren.</p>', |
|
20 |
+ |
|
21 |
+); |
0 | 22 |
deleted file mode 100644 |
... | ... |
@@ -1,21 +0,0 @@ |
1 |
-<?php |
|
2 |
-/** |
|
3 |
- * eSales Media Nutrition Facts extension for OXID |
|
4 |
- * |
|
5 |
- * @author Benjamin Roth [benjamin@esales-media.de] |
|
6 |
- * @copyright 2015 eSales Media [http://www.esales-media.de] |
|
7 |
- */ |
|
8 |
- |
|
9 |
-// ------------------------------- |
|
10 |
-// RESOURCE IDENTIFIER = STRING |
|
11 |
-// ------------------------------- |
|
12 |
-$sLangName = 'Deutsch'; |
|
13 |
-$aLang = array( |
|
14 |
- 'charset' => 'UTF-8', |
|
15 |
- 'SHOP_MODULE_GROUP_esUninstall' => 'Deinstallieren', |
|
16 |
- 'SHOP_MODULE_sOxEsAnalyticsId' => 'Google Analytics ID (UA-XXXXX-X)', |
|
17 |
- 'SHOP_MODULE_sOxEsAdsId' => 'Google Ads ID (AW-XXXXX)', |
|
18 |
- 'SHOP_MODULE_sOxEsAdsConvLabel' => 'Google Ads Conversion Label', |
|
19 |
- 'SHOP_MODULE_blOxEsAnalyticsSweep' => 'Alle zum Modul gehörenden Datenbankfelder löschen<p class="info">ACHTUNG: Bereits eingetragene Daten gehen verloren.</p>', |
|
20 |
- |
|
21 |
-); |
22 | 0 |
deleted file mode 100644 |
... | ... |
@@ -1,93 +0,0 @@ |
1 |
-[{$smarty.block.parent}] |
|
2 |
- |
|
3 |
-[{assign var="oConfig" value=$oViewConf->getConfig()}] |
|
4 |
-[{assign var=googleTrackingId value=$oConfig->getConfigParam('sOxEsAnalyticsId')}] |
|
5 |
-[{assign var=googleAdsId value=$oConfig->getConfigParam('sOxEsAdsId')}] |
|
6 |
-[{assign var=googleAdsConvLabel value=$oConfig->getConfigParam('sOxEsAdsConvLabel')}] |
|
7 |
-[{if $googleTrackingId}] |
|
8 |
- <!-- Global site tag (gtag.js) - Google Analytics --> |
|
9 |
- <script async src="https://www.googletagmanager.com/gtag/js?id=[{$googleTrackingId}]"></script> |
|
10 |
- <script> |
|
11 |
- window.dataLayer = window.dataLayer || []; |
|
12 |
- function gtag(){dataLayer.push(arguments);} |
|
13 |
- gtag('js', new Date()); |
|
14 |
- |
|
15 |
- gtag('config', '[{$googleTrackingId}]', { 'anonymize_ip': true }); |
|
16 |
-[{/if}] |
|
17 |
- |
|
18 |
-[{if $googleAdsId}] |
|
19 |
- [{if !$googleTrackingId}] |
|
20 |
- <!-- Global site tag (gtag.js) - Google Ads --> |
|
21 |
- <script async src="https://www.googletagmanager.com/gtag/js?id=[{$googleAdsId}]"></script> |
|
22 |
- <script> |
|
23 |
- window.dataLayer = window.dataLayer || []; |
|
24 |
- function gtag(){dataLayer.push(arguments);} |
|
25 |
- gtag('js', new Date()); |
|
26 |
- |
|
27 |
- gtag('config', '[{$googleAdsId}]', { 'anonymize_ip': true }); |
|
28 |
- </script> |
|
29 |
- [{else}] |
|
30 |
- gtag('config', '[{$googleAdsId}]', { 'anonymize_ip': true }); |
|
31 |
- </script> |
|
32 |
- [{/if}] |
|
33 |
-[{else}] |
|
34 |
- [{if $googleTrackingId}] |
|
35 |
- </script> |
|
36 |
- [{/if}] |
|
37 |
-[{/if}] |
|
38 |
- |
|
39 |
-[{if $oViewConf->getActiveClassName() == 'thankyou'}] |
|
40 |
-<script> |
|
41 |
- // Order infos |
|
42 |
- [{assign var="order" value=$oView->getOrder()}] |
|
43 |
- |
|
44 |
- [{assign var="currate" value=$order->oxorder__oxcurrate->value}] |
|
45 |
- [{if $oConfig->getConfigParam('blEnterNetPrice')}] |
|
46 |
- [{math equation="sum / rate" sum=$order->getOrderNetSum() rate=$currate format="%.2f" assign="sTotal"}] |
|
47 |
- [{else}] |
|
48 |
- [{math equation="sum / rate" sum=$order->getTotalOrderSum() rate=$currate format="%.2f" assign="sTotal"}] |
|
49 |
- [{/if}] |
|
50 |
- [{math equation="sum - net" sum=$order->getTotalOrderSum() net=$order->getOrderNetSum() format="%.2f" assign="sTax"}] |
|
51 |
- [{math equation="sum / rate" sum=$order->oxorder__oxdelcost->value rate=$currate format="%.2f" assign="sShipping"}] |
|
52 |
- |
|
53 |
- // Items |
|
54 |
- var orderitems = []; |
|
55 |
- [{foreach from=$order->getOrderArticles() item=oOrderArticle}] |
|
56 |
- [{if $oConfig->getConfigParam('blEnterNetPrice')}] |
|
57 |
- [{assign var="oPrice" value=$oOrderArticle->getPrice()}] |
|
58 |
- [{math equation="sum / rate" sum=$oPrice->getNettoPrice() rate=$currate format="%.2f" assign="sPrice"}] |
|
59 |
- [{else}] |
|
60 |
- [{assign var="sPrice" value=$oOrderArticle->oxorderarticles__oxprice->value}] |
|
61 |
- [{/if}] |
|
62 |
- |
|
63 |
- orderitems.push({ |
|
64 |
- 'id': '[{$order->oxorder__oxordernr->value}]', [{* Transaction ID *}] |
|
65 |
- 'name': '[{$oOrderArticle->oxorderarticles__oxtitle->value|escape:"quotes"}][{if $oOrderArticle->oxorderarticles__oxselvariant->value}] [{$oOrderArticle->oxorderarticles__oxselvariant->value}][{/if}]', [{* Product name *}] |
|
66 |
- 'sku': '[{$oOrderArticle->oxorderarticles__oxartnum->value|escape:"quotes"}]', [{* SKU *}] |
|
67 |
- 'price': '[{$sPrice}]', [{* Preis pro Einheit *}] |
|
68 |
- 'quantity': '[{$oOrderArticle->oxorderarticles__oxamount->value}]' [{* Menge *}] |
|
69 |
- }); |
|
70 |
- |
|
71 |
- [{/foreach}] |
|
72 |
- |
|
73 |
- [{if $googleTrackingId}] |
|
74 |
- gtag('event', 'purchase', { |
|
75 |
- 'transaction_id': '[{$order->oxorder__oxordernr->value}]', [{* Transaction ID *}] |
|
76 |
- 'affiliation': '[{$oxcmp_shop->oxshops__oxname->value|escape:"quotes"}]', [{* Store name *}] |
|
77 |
- 'value': '[{$sTotal}]', [{* Grand Total *}] |
|
78 |
- 'shipping': '[{$sShipping}]', [{* Shipping *}] |
|
79 |
- 'tax': '[{$sTax}]', [{* Tax *}] |
|
80 |
- 'items': orderitems |
|
81 |
- }); |
|
82 |
- [{/if}] |
|
83 |
- |
|
84 |
- [{if $googleAdsId}] |
|
85 |
- gtag('event', 'conversion', { |
|
86 |
- 'send_to': '[{$googleAdsId}]/[{$googleAdsConvLabel}]', |
|
87 |
- 'transaction_id': '[{$order->oxorder__oxordernr->value}]', |
|
88 |
- 'value': '[{$sTotal}]' |
|
89 |
- }); |
|
90 |
- [{/if}] |
|
91 |
- |
|
92 |
-</script> |
|
93 |
-[{/if}] |
|
94 | 0 |
\ No newline at end of file |
95 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,93 @@ |
1 |
+[{$smarty.block.parent}] |
|
2 |
+ |
|
3 |
+[{assign var="oConfig" value=$oViewConf->getConfig()}] |
|
4 |
+[{assign var=googleTrackingId value=$oConfig->getConfigParam('sOxEsAnalyticsId')}] |
|
5 |
+[{assign var=googleAdsId value=$oConfig->getConfigParam('sOxEsAdsId')}] |
|
6 |
+[{assign var=googleAdsConvLabel value=$oConfig->getConfigParam('sOxEsAdsConvLabel')}] |
|
7 |
+[{if $googleTrackingId}] |
|
8 |
+ <!-- Global site tag (gtag.js) - Google Analytics --> |
|
9 |
+ <script async src="https://www.googletagmanager.com/gtag/js?id=[{$googleTrackingId}]"></script> |
|
10 |
+ <script> |
|
11 |
+ window.dataLayer = window.dataLayer || []; |
|
12 |
+ function gtag(){dataLayer.push(arguments);} |
|
13 |
+ gtag('js', new Date()); |
|
14 |
+ |
|
15 |
+ gtag('config', '[{$googleTrackingId}]', { 'anonymize_ip': true }); |
|
16 |
+[{/if}] |
|
17 |
+ |
|
18 |
+[{if $googleAdsId}] |
|
19 |
+ [{if !$googleTrackingId}] |
|
20 |
+ <!-- Global site tag (gtag.js) - Google Ads --> |
|
21 |
+ <script async src="https://www.googletagmanager.com/gtag/js?id=[{$googleAdsId}]"></script> |
|
22 |
+ <script> |
|
23 |
+ window.dataLayer = window.dataLayer || []; |
|
24 |
+ function gtag(){dataLayer.push(arguments);} |
|
25 |
+ gtag('js', new Date()); |
|
26 |
+ |
|
27 |
+ gtag('config', '[{$googleAdsId}]', { 'anonymize_ip': true }); |
|
28 |
+ </script> |
|
29 |
+ [{else}] |
|
30 |
+ gtag('config', '[{$googleAdsId}]', { 'anonymize_ip': true }); |
|
31 |
+ </script> |
|
32 |
+ [{/if}] |
|
33 |
+[{else}] |
|
34 |
+ [{if $googleTrackingId}] |
|
35 |
+ </script> |
|
36 |
+ [{/if}] |
|
37 |
+[{/if}] |
|
38 |
+ |
|
39 |
+[{if $oViewConf->getActiveClassName() == 'thankyou'}] |
|
40 |
+<script> |
|
41 |
+ // Order infos |
|
42 |
+ [{assign var="order" value=$oView->getOrder()}] |
|
43 |
+ |
|
44 |
+ [{assign var="currate" value=$order->oxorder__oxcurrate->value}] |
|
45 |
+ [{if $oConfig->getConfigParam('blEnterNetPrice')}] |
|
46 |
+ [{math equation="sum / rate" sum=$order->getOrderNetSum() rate=$currate format="%.2f" assign="sTotal"}] |
|
47 |
+ [{else}] |
|
48 |
+ [{math equation="sum / rate" sum=$order->getTotalOrderSum() rate=$currate format="%.2f" assign="sTotal"}] |
|
49 |
+ [{/if}] |
|
50 |
+ [{math equation="sum - net" sum=$order->getTotalOrderSum() net=$order->getOrderNetSum() format="%.2f" assign="sTax"}] |
|
51 |
+ [{math equation="sum / rate" sum=$order->oxorder__oxdelcost->value rate=$currate format="%.2f" assign="sShipping"}] |
|
52 |
+ |
|
53 |
+ // Items |
|
54 |
+ var orderitems = []; |
|
55 |
+ [{foreach from=$order->getOrderArticles() item=oOrderArticle}] |
|
56 |
+ [{if $oConfig->getConfigParam('blEnterNetPrice')}] |
|
57 |
+ [{assign var="oPrice" value=$oOrderArticle->getPrice()}] |
|
58 |
+ [{math equation="sum / rate" sum=$oPrice->getNettoPrice() rate=$currate format="%.2f" assign="sPrice"}] |
|
59 |
+ [{else}] |
|
60 |
+ [{assign var="sPrice" value=$oOrderArticle->oxorderarticles__oxprice->value}] |
|
61 |
+ [{/if}] |
|
62 |
+ |
|
63 |
+ orderitems.push({ |
|
64 |
+ 'id': '[{$order->oxorder__oxordernr->value}]', [{* Transaction ID *}] |
|
65 |
+ 'name': '[{$oOrderArticle->oxorderarticles__oxtitle->value|escape:"quotes"}][{if $oOrderArticle->oxorderarticles__oxselvariant->value}] [{$oOrderArticle->oxorderarticles__oxselvariant->value}][{/if}]', [{* Product name *}] |
|
66 |
+ 'sku': '[{$oOrderArticle->oxorderarticles__oxartnum->value|escape:"quotes"}]', [{* SKU *}] |
|
67 |
+ 'price': '[{$sPrice}]', [{* Preis pro Einheit *}] |
|
68 |
+ 'quantity': '[{$oOrderArticle->oxorderarticles__oxamount->value}]' [{* Menge *}] |
|
69 |
+ }); |
|
70 |
+ |
|
71 |
+ [{/foreach}] |
|
72 |
+ |
|
73 |
+ [{if $googleTrackingId}] |
|
74 |
+ gtag('event', 'purchase', { |
|
75 |
+ 'transaction_id': '[{$order->oxorder__oxordernr->value}]', [{* Transaction ID *}] |
|
76 |
+ 'affiliation': '[{$oxcmp_shop->oxshops__oxname->value|escape:"quotes"}]', [{* Store name *}] |
|
77 |
+ 'value': '[{$sTotal}]', [{* Grand Total *}] |
|
78 |
+ 'shipping': '[{$sShipping}]', [{* Shipping *}] |
|
79 |
+ 'tax': '[{$sTax}]', [{* Tax *}] |
|
80 |
+ 'items': orderitems |
|
81 |
+ }); |
|
82 |
+ [{/if}] |
|
83 |
+ |
|
84 |
+ [{if $googleAdsId}] |
|
85 |
+ gtag('event', 'conversion', { |
|
86 |
+ 'send_to': '[{$googleAdsId}]/[{$googleAdsConvLabel}]', |
|
87 |
+ 'transaction_id': '[{$order->oxorder__oxordernr->value}]', |
|
88 |
+ 'value': '[{$sTotal}]' |
|
89 |
+ }); |
|
90 |
+ [{/if}] |
|
91 |
+ |
|
92 |
+</script> |
|
93 |
+[{/if}] |
|
0 | 94 |
\ No newline at end of file |