File: //home/retile.ru/public_html/catalog/controller/extension/advertise/google.php
<?php
use \googleshopping\traits\StoreLoader;
use \googleshopping\traits\LibraryLoader;
class ControllerExtensionAdvertiseGoogle extends Controller {
use StoreLoader;
use LibraryLoader;
private $store_id = 0;
public function __construct($registry) {
parent::__construct($registry);
if (getenv("ADVERTISE_GOOGLE_STORE_ID")) {
$this->store_id = (int)getenv("ADVERTISE_GOOGLE_STORE_ID");
} else {
$this->store_id = (int)$this->config->get('config_store_id');
}
$this->loadStore($this->store_id);
}
public function google_global_site_tag(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If there is no tracker, do nothing
if (!$this->setting->has('advertise_google_conversion_tracker')) {
return;
}
$tracker = $this->setting->get('advertise_google_conversion_tracker');
// Insert the tags before the closing <head> tag
$output = str_replace('</head>', $tracker['google_global_site_tag'] . '</head>', $output);
}
public function before_checkout_success(&$route, &$data) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If there is no tracker, do nothing
if (!$this->setting->has('advertise_google_conversion_tracker')) {
return;
}
// In case there is no order, do nothing
if (!isset($this->session->data['order_id'])) {
return;
}
if (!$this->registry->has('googleshopping')) {
$this->loadLibrary($this->store_id);
}
$this->load->model('checkout/order');
$this->load->model('extension/advertise/google');
$order_info = $this->model_checkout_order->getOrder($this->session->data['order_id']);
$tracker = $this->setting->get('advertise_google_conversion_tracker');
$currency = $order_info['currency_code'];
$total = $this->googleshopping->convertAndFormat($order_info['total'], $currency);
$search = array(
'{VALUE}',
'{CURRENCY}'
);
$replace = array(
$total,
$currency
);
$snippet = str_replace($search, $replace, $tracker['google_event_snippet']);
// Store the snippet to display it in the order success view
$tax = 0;
$shipping = 0;
$coupon = $this->model_extension_advertise_google->getCoupon($order_info['order_id']);
foreach ($this->model_checkout_order->getOrderTotals($order_info['order_id']) as $order_total) {
if ($order_total['code'] == 'shipping') {
$shipping += $this->googleshopping->convertAndFormat($order_total['value'], $currency);
}
if ($order_total['code'] == 'tax') {
$tax += $this->googleshopping->convertAndFormat($order_total['value'], $currency);
}
}
$order_products = $this->model_checkout_order->getOrderProducts($order_info['order_id']);
foreach ($order_products as &$order_product) {
$order_product['option'] = $this->model_checkout_order->getOrderOptions($order_info['order_id'], $order_product['order_product_id']);
}
$purchase_data = array(
'transaction_id' => $order_info['order_id'],
'value' => $total,
'currency' => $currency,
'tax' => $tax,
'shipping' => $shipping,
'items' => $this->model_extension_advertise_google->getRemarketingItems($order_products, $order_info['store_id']),
'ecomm_prodid' => $this->model_extension_advertise_google->getRemarketingProductIds($order_products, $order_info['store_id'])
);
if ($coupon !== null) {
$purchase_data['coupon'] = $coupon;
}
$this->googleshopping->setEventSnippet($snippet);
$this->googleshopping->setPurchaseData($purchase_data);
}
public function google_dynamic_remarketing_purchase(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If the library has not been loaded, or if there is no snippet, do nothing
if (!$this->registry->has('googleshopping') || $this->googleshopping->getEventSnippet() === null || $this->googleshopping->getPurchaseData() === null) {
return;
}
$data['send_to'] = $this->googleshopping->getEventSnippetSendTo();
$purchase_data = $this->googleshopping->getPurchaseData();
$data['transaction_id'] = $purchase_data['transaction_id'];
$data['value'] = $purchase_data['value'];
$data['currency'] = $purchase_data['currency'];
$data['tax'] = $purchase_data['tax'];
$data['shipping'] = $purchase_data['shipping'];
$data['items'] = json_encode($purchase_data['items']);
$data['ecomm_prodid'] = json_encode($purchase_data['ecomm_prodid']);
$data['ecomm_totalvalue'] = $purchase_data['value'];
$purchase_snippet = $this->load->view('extension/advertise/google_dynamic_remarketing_purchase', $data);
// Insert the snippet after the output
$output = str_replace('</body>', $this->googleshopping->getEventSnippet() . $purchase_snippet . '</body>', $output);
}
public function google_dynamic_remarketing_home(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If we are not on the home page, do nothing
if (isset($this->request->get['route']) && $this->request->get['route'] != $this->config->get('action_default')) {
return;
}
if (!$this->registry->has('googleshopping')) {
$this->loadLibrary($this->store_id);
}
if (null === $this->googleshopping->getEventSnippetSendTo()) {
return;
}
$data = array();
$data['send_to'] = $this->googleshopping->getEventSnippetSendTo();
$snippet = $this->load->view('extension/advertise/google_dynamic_remarketing_home', $data);
// Insert the snippet after the output
$output = str_replace('</body>', $snippet . '</body>', $output);
}
public function google_dynamic_remarketing_searchresults(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If we are not on the search page, do nothing
if (!isset($this->request->get['route']) || $this->request->get['route'] != 'product/search' || !isset($this->request->get['search'])) {
return;
}
if (!$this->registry->has('googleshopping')) {
$this->loadLibrary($this->store_id);
}
if (null === $this->googleshopping->getEventSnippetSendTo()) {
return;
}
$data = array();
$data['send_to'] = $this->googleshopping->getEventSnippetSendTo();
$data['search_term'] = $this->request->get['search'];
$snippet = $this->load->view('extension/advertise/google_dynamic_remarketing_searchresults', $data);
// Insert the snippet after the output
$output = str_replace('</body>', $snippet . '</body>', $output);
}
public function google_dynamic_remarketing_category(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If we are not on the search page, do nothing
if (!isset($this->request->get['route']) || $this->request->get['route'] != 'product/category') {
return;
}
if (!$this->registry->has('googleshopping')) {
$this->loadLibrary($this->store_id);
}
if (null === $this->googleshopping->getEventSnippetSendTo()) {
return;
}
if (isset($this->request->get['path'])) {
$parts = explode('_', $this->request->get['path']);
$category_id = (int)end($parts);
} else if (isset($this->request->get['category_id'])) {
$category_id = (int)$this->request->get['category_id'];
} else {
$category_id = 0;
}
$this->load->model('extension/advertise/google');
$data = array();
$data['send_to'] = $this->googleshopping->getEventSnippetSendTo();
$data['description'] = str_replace('"', '\\"', $this->model_extension_advertise_google->getHumanReadableOpenCartCategory($category_id));
$snippet = $this->load->view('extension/advertise/google_dynamic_remarketing_category', $data);
// Insert the snippet after the output
$output = str_replace('</body>', $snippet . '</body>', $output);
}
public function google_dynamic_remarketing_product(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If we do not know the viewed product, do nothing
if (!isset($this->request->get['product_id']) || !isset($this->request->get['route']) || $this->request->get['route'] != 'product/product') {
return;
}
$this->load->model('catalog/product');
$product_info = $this->model_catalog_product->getProduct((int)$this->request->get['product_id']);
// If product does not exist, do nothing
if (!$product_info) {
return;
}
if (!$this->registry->has('googleshopping')) {
$this->loadLibrary($this->store_id);
}
if (null === $this->googleshopping->getEventSnippetSendTo()) {
return;
}
$this->load->model('extension/advertise/google');
$category_name = $this->model_extension_advertise_google->getHumanReadableCategory($product_info['product_id'], $this->store_id);
$option_map = $this->model_extension_advertise_google->getSizeAndColorOptionMap($product_info['product_id'], $this->store_id);
$data = array();
$data['send_to'] = $this->googleshopping->getEventSnippetSendTo();
$data['option_map'] = json_encode($option_map);
$data['brand'] = $product_info['manufacturer'];
$data['name'] = $product_info['name'];
$data['category'] = str_replace('"', '\\"', $category_name);
$snippet = $this->load->view('extension/advertise/google_dynamic_remarketing_product', $data);
// Insert the snippet after the output
$output = str_replace('</body>', $snippet . '</body>', $output);
}
public function google_dynamic_remarketing_cart(&$route, &$data, &$output) {
// In case the extension is disabled, do nothing
if (!$this->setting->get('advertise_google_status')) {
return;
}
// If we are not on the cart page, do nothing
if (!isset($this->request->get['route']) || $this->request->get['route'] != 'checkout/cart') {
return;
}
if (!$this->registry->has('googleshopping')) {
$this->loadLibrary($this->store_id);
}
if (null === $this->googleshopping->getEventSnippetSendTo()) {
return;
}
$this->load->model('catalog/product');
$this->load->model('extension/advertise/google');
$data = array();
$data['send_to'] = $this->googleshopping->getEventSnippetSendTo();
$data['ecomm_totalvalue'] = $this->cart->getTotal();
$data['ecomm_prodid'] = json_encode($this->model_extension_advertise_google->getRemarketingProductIds($this->cart->getProducts(), $this->store_id));
$data['items'] = json_encode($this->model_extension_advertise_google->getRemarketingItems($this->cart->getProducts(), $this->store_id));
$snippet = $this->load->view('extension/advertise/google_dynamic_remarketing_cart', $data);
// Insert the snippet after the output
$output = str_replace('</body>', $snippet . '</body>', $output);
}
public function cron($cron_id = null, $code = null, $cycle = null, $date_added = null, $date_modified = null) {
$this->loadLibrary($this->store_id);
if (!$this->validateCRON()) {
// In case this is not a CRON task
return;
}
$this->load->language('extension/advertise/google');
// Reset taxes to use the store address and zone
$this->tax->setShippingAddress($this->config->get('config_country_id'), $this->config->get('config_zone_id'));
$this->tax->setPaymentAddress($this->config->get('config_country_id'), $this->config->get('config_zone_id'));
$this->tax->setStoreAddress($this->config->get('config_country_id'), $this->config->get('config_zone_id'));
$this->googleshopping->cron();
}
protected function validateCRON() {
if (!$this->setting->get('advertise_google_status')) {
// In case the extension is disabled, do nothing
return false;
}
if (!$this->setting->get('advertise_google_gmc_account_selected')) {
return false;
}
if (!$this->setting->get('advertise_google_gmc_shipping_taxes_configured')) {
return false;
}
try {
if (count($this->googleshopping->getTargets($this->store_id)) === 0) {
return false;
}
} catch (\RuntimeException $e) {
return false;
}
if (isset($this->request->get['cron_token']) && $this->request->get['cron_token'] == $this->config->get('advertise_google_cron_token')) {
return true;
}
if (defined('ADVERTISE_GOOGLE_ROUTE')) {
return true;
}
return false;
}
}