1 | 1 |
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_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 |
+} |
0 | 218 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,10 @@ |
1 |
+<?xml version="1.0" encoding="ISO-8859-15"?> |
|
2 |
+<OX> |
|
3 |
+ <OXMENU id="NAVIGATION_ESHOPADMIN"> |
|
4 |
+ <MAINMENU id="mxmanageprod"> |
|
5 |
+ <SUBMENU id="mxarticles" cl="article" list="article_list"> |
|
6 |
+ <TAB id="tbcles_article_nutritionfacts" cl="es_article_nutritionfacts" /> |
|
7 |
+ </SUBMENU> |
|
8 |
+ </MAINMENU> |
|
9 |
+ </OXMENU> |
|
10 |
+</OX> |
0 | 11 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,66 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * This file is part of OXID eSales PayPal module. |
|
4 |
+ * |
|
5 |
+ * OXID eSales PayPal module is free software: you can redistribute it and/or modify |
|
6 |
+ * it under the terms of the GNU General Public License as published by |
|
7 |
+ * the Free Software Foundation, either version 3 of the License, or |
|
8 |
+ * (at your option) any later version. |
|
9 |
+ * |
|
10 |
+ * OXID eSales PayPal module is distributed in the hope that it will be useful, |
|
11 |
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
12 |
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
13 |
+ * GNU General Public License for more details. |
|
14 |
+ * |
|
15 |
+ * You should have received a copy of the GNU General Public License |
|
16 |
+ * along with OXID eSales PayPal module. If not, see <http://www.gnu.org/licenses/>. |
|
17 |
+ * |
|
18 |
+ * @link http://www.oxid-esales.com |
|
19 |
+ * @copyright (C) OXID eSales AG 2003-2015 |
|
20 |
+ */ |
|
21 |
+ |
|
22 |
+/** |
|
23 |
+ * Metadata version |
|
24 |
+ */ |
|
25 |
+$sMetadataVersion = '1.2'; |
|
26 |
+ |
|
27 |
+/** |
|
28 |
+ * Module information |
|
29 |
+ */ |
|
30 |
+$aModule = array( |
|
31 |
+ 'id' => 'es_analytics', |
|
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', |
|
35 |
+ ), |
|
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', |
|
39 |
+ ), |
|
40 |
+ 'thumbnail' => 'picture.png', |
|
41 |
+ 'version' => '1.0.0', |
|
42 |
+ 'author' => 'eSales Media', |
|
43 |
+ 'url' => 'http://www.esales-media.de', |
|
44 |
+ 'email' => 'info@esales-media.de', |
|
45 |
+ 'extend' => array( |
|
46 |
+// 'oxarticle' => 'esales/es_analytics/models/es_analytics_oxarticle', |
|
47 |
+ ), |
|
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', |
|
51 |
+ ), |
|
52 |
+ 'templates' => array( |
|
53 |
+// 'es_article_nutritionfacts.tpl' => 'esales/es_analytics/views/admin/tpl/es_article_nutritionfacts.tpl', |
|
54 |
+ ), |
|
55 |
+ 'blocks' => array( |
|
56 |
+ array('template' => 'layout/base.tpl', 'block' => 'head_css', 'file' => 'views/blocks/es_analytics_code_head_css.tpl'), |
|
57 |
+ ), |
|
58 |
+ 'events' => array( |
|
59 |
+ 'onActivate' => 'es_analytics_events::onActivate', |
|
60 |
+ 'onDeactivate' => 'es_analytics_events::onDeactivate' |
|
61 |
+ ), |
|
62 |
+ 'settings' => array( |
|
63 |
+ array('group' => 'main', 'name' => 'sOxEsAnalyticsId', 'type' => 'str', 'value' => ''), |
|
64 |
+ array('group' => 'esUninstall', 'name' => 'blOxEsAnalyticsSweep', 'type' => 'bool', 'value' => 'false'), |
|
65 |
+ ) |
|
66 |
+); |
2 | 69 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,17 @@ |
1 |
+<?php |
|
2 |
+/** |
|
3 |
+ * eSales Media Ingredients 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 |
+ 'NUTRITIONFACTS' => 'Nährwertangaben' |
|
16 |
+ |
|
17 |
+); |
0 | 18 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,19 @@ |
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_blOxEsAnalyticsSweep' => 'Alle zum Modul gehörenden Datenbankfelder löschen<p class="info">ACHTUNG: Bereits eingetragene Daten gehen verloren.</p>', |
|
18 |
+ |
|
19 |
+); |
0 | 20 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,61 @@ |
1 |
+[{$smarty.block.parent}] |
|
2 |
+ |
|
3 |
+[{assign var="oConfig" value=$oViewConf->getConfig()}] |
|
4 |
+[{assign var=googleTrackingId value=$oConfig->getConfigParam('sOxEsAnalyticsId')}] |
|
5 |
+[{if $googleTrackingId}] |
|
6 |
+<script> |
|
7 |
+ (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
|
8 |
+ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), |
|
9 |
+ m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
|
10 |
+ })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); |
|
11 |
+ |
|
12 |
+ ga('create', '[{$googleTrackingId}]', 'auto'); |
|
13 |
+ ga('set', 'anonymizeIp', true); |
|
14 |
+ ga('send', 'pageview'); |
|
15 |
+ |
|
16 |
+ |
|
17 |
+ [{if $oViewConf->getActiveClassName() == 'thankyou'}][{strip}] |
|
18 |
+ [{assign var="order" value=$oView->getOrder()}] |
|
19 |
+ |
|
20 |
+ ga('require', 'ecommerce'); |
|
21 |
+ |
|
22 |
+ [{assign var="currate" value=$order->oxorder__oxcurrate->value}] |
|
23 |
+ [{if $oConfig->getConfigParam('blEnterNetPrice')}] |
|
24 |
+ [{math equation="sum / rate" sum=$order->getOrderNetSum() rate=$currate format="%.2f" assign="sTotal"}] |
|
25 |
+ [{else}] |
|
26 |
+ [{math equation="sum / rate" sum=$order->getTotalOrderSum() rate=$currate format="%.2f" assign="sTotal"}] |
|
27 |
+ [{/if}] |
|
28 |
+ [{math equation="sum - net" sum=$order->getTotalOrderSum() net=$order->getOrderNetSum() format="%.2f" assign="sTax"}] |
|
29 |
+ [{math equation="sum / rate" sum=$order->oxorder__oxdelcost->value rate=$currate format="%.2f" assign="sShipping"}] |
|
30 |
+ |
|
31 |
+ ga('ecommerce:addTransaction', { |
|
32 |
+ 'id': '[{$order->oxorder__oxordernr->value}]', [{* Transaction ID *}] |
|
33 |
+ 'affiliation': '[{$oxcmp_shop->oxshops__oxname->value|escape:"quotes"}]', [{* Store name *}] |
|
34 |
+ 'revenue': '[{$sTotal}]', [{* Grand Total *}] |
|
35 |
+ 'shipping': '[{$sShipping}]', [{* Shipping *}] |
|
36 |
+ 'tax': '[{$sTax}]' [{* Tax *}] |
|
37 |
+ }); |
|
38 |
+ |
|
39 |
+ [{foreach from=$order->getOrderArticles() item=oOrderArticle}] |
|
40 |
+ |
|
41 |
+ [{if $oConfig->getConfigParam('blEnterNetPrice')}] |
|
42 |
+ [{assign var="oPrice" value=$oOrderArticle->getPrice()}] |
|
43 |
+ [{math equation="sum / rate" sum=$oPrice->getNettoPrice() rate=$currate format="%.2f" assign="sPrice"}] |
|
44 |
+ [{else}] |
|
45 |
+ [{assign var="sPrice" value=$oOrderArticle->oxorderarticles__oxprice->value}] |
|
46 |
+ [{/if}] |
|
47 |
+ |
|
48 |
+ |
|
49 |
+ ga('ecommerce:addItem', { |
|
50 |
+ 'id': '[{$order->oxorder__oxordernr->value}]', [{* Transaction ID *}] |
|
51 |
+ 'name': '[{$oOrderArticle->oxorderarticles__oxtitle->value|escape:"quotes"}][{if $oOrderArticle->oxorderarticles__oxselvariant->value}] [{$oOrderArticle->oxorderarticles__oxselvariant->value}][{/if}]', [{* Product name *}] |
|
52 |
+ 'sku': '[{$oOrderArticle->oxorderarticles__oxartnum->value|escape:"quotes"}]', [{* SKU *}] |
|
53 |
+ 'price': '[{$sPrice}]', [{* Preis pro Einheit *}] |
|
54 |
+ 'quantity': '[{$oOrderArticle->oxorderarticles__oxamount->value}]' [{* Menge *}] |
|
55 |
+ }); |
|
56 |
+ [{/foreach}] |
|
57 |
+ |
|
58 |
+ ga('ecommerce:send'); |
|
59 |
+ [{/strip}][{/if}] |
|
60 |
+</script> |
|
61 |
+[{/if}] |
|
0 | 62 |
\ No newline at end of file |