1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
namespace Sunnysideup\EcommerceGoogleAnalytics; |
4
|
|
|
|
5
|
|
|
use SilverStripe\Control\Director; |
6
|
|
|
use SilverStripe\Core\Config\Config; |
7
|
|
|
use SilverStripe\Core\Extension; |
8
|
|
|
use SilverStripe\View\Requirements; |
9
|
|
|
use Sunnysideup\Ecommerce\Config\EcommerceConfig; |
10
|
|
|
use Sunnysideup\Ecommerce\Model\Money\EcommerceCurrency; |
11
|
|
|
use Sunnysideup\Ecommerce\Pages\Product; |
12
|
|
|
|
13
|
|
|
/** |
14
|
|
|
* Class \Sunnysideup\EcommerceGoogleAnalytics\CheckoutPageExtensionController |
15
|
|
|
* |
16
|
|
|
* @property \Sunnysideup\Ecommerce\Pages\CheckoutPageController|\Sunnysideup\EcommerceGoogleAnalytics\CheckoutPageExtensionController $owner |
17
|
|
|
*/ |
18
|
|
|
class CheckoutPageExtensionController extends Extension |
19
|
|
|
{ |
20
|
|
|
/** |
21
|
|
|
* Standard SS method. |
22
|
|
|
* Runs after the Page::init method is called. |
23
|
|
|
*/ |
24
|
|
|
public function onAfterInit() |
25
|
|
|
{ |
26
|
|
|
$owner = $this->owner; |
27
|
|
|
if ($owner->EnableGoogleAnalytics && $owner->currentOrder && (Director::isLive() || isset($_GET['testanalytics']))) { |
|
|
|
|
28
|
|
|
$var = EcommerceConfig::get(CheckoutPageDataExtension::class, 'google_analytics_variable'); |
29
|
|
|
if ($var) { |
30
|
|
|
$currencyUsedObject = $owner->currentOrder->CurrencyUsed(); |
31
|
|
|
if ($currencyUsedObject) { |
32
|
|
|
$currencyUsedString = $currencyUsedObject->Code; |
33
|
|
|
} |
34
|
|
|
if (empty($currencyUsedString)) { |
35
|
|
|
$currencyUsedString = EcommerceCurrency::default_currency_code(); |
36
|
|
|
} |
37
|
|
|
$orderItems = $owner->currentOrder->OrderItems(); |
38
|
|
|
$items = ''; |
39
|
|
|
if (Config::inst()->get(CheckoutPageExtensionController::class, 'include_product_items')) { |
40
|
|
|
foreach ($orderItems as $orderItem) { |
41
|
|
|
/** @var Product $product */ |
42
|
|
|
$product = Product::get_by_id($orderItem->BuyableID); |
43
|
|
|
$sku = $product->InternalItemID ?: $product->ID; |
44
|
|
|
$category = 'Unknown'; |
45
|
|
|
$topParent = $product->TopParentGroup(); |
46
|
|
|
if ($topParent) { |
47
|
|
|
$category = $topParent->Title; |
48
|
|
|
} |
49
|
|
|
$orderItemName = preg_replace("#\r|\n#", '', (string) $orderItem->TableTitle()); |
50
|
|
|
$category = preg_replace("#\r|\n#", '', (string) $category); |
51
|
|
|
$items .= |
52
|
|
|
'ga( |
53
|
|
|
\'ecommerce:addItem\', |
54
|
|
|
{ |
55
|
|
|
\'id\': \'' . $owner->currentOrder->ID . '\', |
56
|
|
|
\'name\': \'' . $orderItemName . '\', |
57
|
|
|
\'sku\': \'' . $sku . '\', |
58
|
|
|
\'category\': \'' . $category . '\', |
59
|
|
|
\'price\': \'' . $orderItem->CalculatedTotal . '\', |
60
|
|
|
\'quantity\': \'' . $orderItem->Quantity . '\', |
61
|
|
|
} |
62
|
|
|
);'; |
63
|
|
|
} |
64
|
|
|
} |
65
|
|
|
$js = ' |
66
|
|
|
const ecommerceFormForGA = document.getElementById("OrderForm_OrderForm"); |
67
|
|
|
ecommerceFormForGA.addEventListener( |
68
|
|
|
"submit", |
69
|
|
|
function(e){ |
70
|
|
|
console.log(e); |
71
|
|
|
' . $var . '(\'require\', \'ecommerce\'); |
72
|
|
|
' . $var . '( |
73
|
|
|
\'ecommerce:addTransaction\', |
74
|
|
|
{ |
75
|
|
|
\'id\': \'' . $owner->currentOrder->ID . '\', |
76
|
|
|
\'revenue\': \'' . $owner->currentOrder->getSubTotal() . '\', |
77
|
|
|
\'currency\': \'' . $currencyUsedString . '\' |
78
|
|
|
} |
79
|
|
|
); |
80
|
|
|
' . $items . ' |
81
|
|
|
' . $var . '(\'ecommerce:send\'); |
82
|
|
|
} |
83
|
|
|
);'; |
84
|
|
|
Requirements::customScript($js, 'GoogleAnalyticsEcommerce'); |
85
|
|
|
} |
86
|
|
|
} |
87
|
|
|
} |
88
|
|
|
} |
89
|
|
|
|