<?php
namespace App\Twig;
use App\DTO\AppDTO;
use App\Entity\Prod;
use App\Env;
use Symfony\Component\HttpFoundation\RequestStack;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class GoogleAnalyticsEvents extends AbstractExtension
{
public function __construct(
private RequestStack $requestStack,
private AppDTO $app,
)
{
}
public function getFunctions(): array
{
return [
new TwigFunction('ga_events_init', [$this, 'init']),
new TwigFunction('ga_events_search', [$this, 'searchResults']),
new TwigFunction('ga_events_prodlist', [$this, 'prodList']),
new TwigFunction('ga_events_prodcont', [$this, 'prodCont']),
new TwigFunction('ga_events_addtocart', [$this, 'addToCart']),
new TwigFunction('ga_events_checkout_begin', [$this, 'checkoutBegin']),
new TwigFunction('ga_events_checkout_finish', [$this, 'checkoutFinish']),
new TwigFunction('ga_events_checkout_client_email', [$this, 'clientEmail']),
];
}
public function getName(): string
{
return 'app_google_analytics_extension';
}
public function init(): string
{
$url = $this->requestStack->getCurrentRequest()->getPathInfo();
if (strstr($url, 'checkout/completed') || strstr($url, 'checkout/finish')) {
return '<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag("consent", "default", { "ad_storage": "granted",
"ad_user_data": "granted",
"ad_personalization": "granted",
"analytics_storage": "granted"
});
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id='.Env::code_gtm().'"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "'.Env::code_gtm().'", {allow_enhanced_conversions: true});
</script>';
} else {
return '<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag("consent", "default", {
"ad_storage": "granted",
"ad_user_data": "granted",
"ad_personalization": "granted",
"analytics_storage": "granted"
});
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id='.Env::code_gtm().'"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag("js", new Date());
gtag("config", "'.Env::code_gtm().'");
</script>';
}
}
/**
*
* @param string $q
* @param \App\Entity\Prod[] $prods
* @return void
*/
public function searchResults(string $q, array $prods)
{
$sum = 0;
$i = 0;
$i = 0;
foreach ($prods as $prod) {
$i++;
if ($i > 10) {
break;
}
$sum += $prod->getPrice() * (100 - $prod->getSkidka()) / 100;
}
$result = '<script>
gtag("event", "view_search_results", {
search_term: "'.$q.'",
currency: "'.Env::currency_code().'",
value: '.round($sum, Env::price_precission()).',
items: [';
$i = 0;
foreach ($prods as $prod) {
$i++;
if ($i > 10) {
break;
}
$result .= '
{
id: "'.$prod->getId().'-'.$this->requestStack->getCurrentRequest()->getLocale().'",
name: "'.$prod->getName().'",
price: '.round(($prod->getPrice() * (100 - $prod->getSkidka()) / 100), Env::price_precission()).',
google_business_vertical: "retail"
}';
if ($i < 9) {
$result .= ',';
}
}
$result .= '
]
});</script>';
return $result;
}
/**
*
* @param \App\Entity\Prod[] $prods
* @return void
*/
public function prodList(array $prods)
{
$sum = 0;
$i = 0;
foreach ($prods as $prod) {
$i++;
if ($i > 10) {
break;
}
$sum += $prod->getPrice() * (100 - $prod->getSkidka()) / 100;
}
$result = '<script>gtag("event", "view_item_list", {
currency: "'.Env::currency_code().'",
value: '.round($sum, Env::price_precission()).',
items: [';
$i = 0;
foreach ($prods as $prod) {
$i++;
if ($i > 10) {
break;
}
$result .= '
{
id: "'.$prod->getId().'-'.$this->requestStack->getCurrentRequest()->getLocale().'",
name: "'.$prod->getName().'",
price: '.round(($prod->getPrice() * (100 - $prod->getSkidka()) / 100), Env::price_precission()).',
google_business_vertical: "retail"
}';
if ($i < 9) {
$result .= ',';
}
}
$result .= '
]
});</script>';
return $result;
}
/**
*
* @param \App\Entity\Prod $prod
* @return void
*/
public function prodCont(Prod $prod)
{
$result = '<script>gtag("event", "view_item", {
currency: "'.Env::currency_code().'",
value: '.round(($prod->getPrice() * (100 - $prod->getSkidka()) / 100), Env::price_precission()).',
items: [{
id: "'.$prod->getId().'-'.$this->requestStack->getCurrentRequest()->getLocale().'",
name: "'.$prod->getName().'",
price: '.round(($prod->getPrice() * (100 - $prod->getSkidka()) / 100), Env::price_precission()).',
google_business_vertical: "retail"
}]
});</script>';
return $result;
}
/**
*
* @param \App\Entity\Prod $prod
* @return void
*/
public function addToCart(Prod $prod)
{
$result = 'gtag("event", "add_to_cart", {
currency: "'.Env::currency_code().'",
value: '.($prod->getPrice() * (100 - $prod->getSkidka()) / 100).',
items: [{
id: "'.$prod->getId().'-'.$this->requestStack->getCurrentRequest()->getLocale().'",
name: "'.$prod->getName().'",
price: '.round(($prod->getPrice() * (100 - $prod->getSkidka()) / 100), Env::price_precission()).',
google_business_vertical: "retail"
}]
});';
return $result;
}
/**
*
* @param array $prods
* @return void
*/
public function checkoutBegin(array $cart_items)
{
$sum = 0;
$total = count($cart_items);
$i = 0;
foreach ($cart_items as $v) {
/** @var \App\Entity\Prod $prod */
$prod = $v['prod'];
//TODO. Какую цену тут показывать?!
$sum += $v['price'] * $v['num'];
}
$result = '<script>gtag("event", "begin_checkout", {
currency: "'.Env::currency_code().'",
value: '.round($sum, Env::price_precission()).',
items: [';
foreach ($cart_items as $v) {
/** @var \App\Entity\Prod $prod */
$prod = $v['prod'];
$i++;
$result .= '
{
id: "'.$prod->getId().'-'.$this->requestStack->getCurrentRequest()->getLocale().'",
name: "'.$prod->getName().'",
price: '.round($v['price'], Env::price_precission()).',
quantity: '.$v['num'].',
discount: '.intval($v['skidka']).',
google_business_vertical: "retail"
}';
if ($i < $total) {
$result .= ',';
}
}
$result .= '
]
});</script>';
return $result;
}
public function checkoutFinish(int $order_id, float $amount, array $cart_items)
{
$result = '<script>gtag("event", "purchase", {
send_to: [
"'.Env::code_gtm().'"
],
transaction_id: "'.$order_id.'",
currency: "'.Env::currency_code().'",
value: '.round($amount, Env::price_precission()).',
aw_merchant_id: '.Env::merchant_id().',
aw_feed_country: "'.Env::country_code().'",
aw_feed_language: "'.$this->requestStack->getCurrentRequest()->getLocale().'",
items: [';
$total = count($cart_items);
$i = 0;
foreach ($cart_items as $v) {
/** @var \App\Entity\Prod $prod */
$prod = $v['prod'];
$i++;
$result .= '
{
id: "'.$prod->getId().'-'.$this->requestStack->getCurrentRequest()->getLocale().'",
name: "'.$prod->getName().'",
price: '.round($v['price'], Env::price_precission()).',
quantity: '.$v['num'].',
discount: '.intval($v['skidka']).',
google_business_vertical: "retail"
}';
if ($i < $total) {
$result .= ',';
}
}
$result .= '
]
});</script>';
return $result;
}
public function clientEmail(string $email) {
return '<script>gtag("set", "user_data", {
email: "'.$email.'"
});</script>';
}
}