PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zen Cart 1.5.5 Google Enhanced E-Commerce Analytics 1.2.0



mh254
15.08.2017, 17:54
In der Zeile 32 in der Datei includes/classes/observers/class.ec_analytics.php ist am Ende ein Punkt. Müsste das nicht ein Komma sein?

'NOTIFY_HEADER_START_LOGIN_TIMEOUT' .

webchills
15.08.2017, 19:41
Ja, ist ein Tippfehler, im aktuellen Download ab sofort behoben.

mh254
15.08.2017, 19:47
:)

Jetzt muss ich das nur noch zum Laufen bringen. Startseite und Kategorie funktioniert noch nach dem Installieren und seh auch den Kategorie-Zugriff im Analytics-Frontend. Login ins Kundenkonto geht auch, seh ich auch im Frontend. Aber sobald ich mir einen Artikel anzeigen lassen will, kommt ein 500'er Serverfehler :(

Leider schreibt mein Webserver keine Logfiles mehr seit dem letzten Ubuntu-Upgrade auf die 16.04 LTS, daher weiß ich im Moment überhaupt nicht, wo ich suchen soll.

bumerang24
15.08.2017, 20:56
Hallo Zusammen,

ich häng mich mal drann, ich dachte der Fehler sei evtl. durch das fehlende Komma.
Ist leider nicht so.
Mein Log Eintrag:


[15-Aug-2017 19:32:28 Europe/Berlin] PHP Fatal error: Uncaught Error: Call to undefined function split() in /XXX/XXX/ZC_SHOP/includes/classes/observers/class.ec_analytics.php:62
Stack trace:
#0 /XXX/XXX/ZC_SHOP/includes/classes/observers/class.ec_analytics.php(112): ec_analytics->getCatString(146)
#1 /XXX/XXX/ZC_SHOP/includes/classes/class.base.php(103): ec_analytics->update(Object(notifier), 'NOTIFY_HEADER_S...', Array, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)
#2 /XXX/XXX/ZC_SHOP/includes/modules/pages/product_info/header_php.php(13): base->notify('NOTIFY_HEADER_S...')
#3 /XXX/XXX/ZC_SHOP/index.php(36): require('/home/www/ZC_SH...')
#4 {main}
thrown in /XXX/XXX/ZC_SHOP/includes/classes/observers/class.ec_analytics.php on line 62

Ist ein ganz neuer ZC 155e Shop mit diversen Erweiterungen als Testshop
Wenn ich das Tool im normalen upgedateten Shop instaliere kommt der gleiche Log übrigens.
DB 5.7.16 und PHP 7.0.21

Grüße

Guido

mh254
15.08.2017, 21:29
Danke, das war der fehlende Hinweis, den ich dank fehlender Logs nicht bekommen habe :)

Ersetz in der Zeile 62 von includes/classes/observers/class.ec_analytics.php das split durch preg_split, die Zeile sollte dann so aussehen:

$p = preg_split("_",$cPath) ;

Damit funktioniert es bei mir. Die Funktion split wurde in PHP 7 entfernt.

Allerdings habe ich beim checkout den nächsten Fehler, den ich dank fehlender Logs nicht beheben kann :(

mh254
15.08.2017, 21:39
Insgesamt muss man in der Datei includes/classes/observers/class.ec_analytics.php vier mal split mit preg_split ersetzen, dann funktioniert es auch unter PHP 7 :)

webchills
15.08.2017, 21:41
Statt mit preg_split würde es besser mit explode ersetzt

bumerang24
15.08.2017, 21:44
Und der Code für nichtprogramierer?
Das Tool ist doch mit PHP 7.X getestet dachte ich.
Ich kenne leider PHP nicht wirklich, und bin deshalb fragend unwissend.

webchills
15.08.2017, 21:52
Es war nicht wirklich für PHP 7 geeignet, hier die korrekte includes/classes/observers/class.ec_analytics.php, mit der das auch unter PHP 7.0.x problemlos läuft (getestet mit PHP 7.0.20)
Wird im Download noch ausgetauscht

<?php
/**
* @package Google Enhanced E-Commerce Analytics
* @copyright (c) 2015 RodG
* @copyright Copyright 2003-2017 Zen Cart Development Team
* @copyright Portions Copyright 2003 osCommerce
* @license http://www.zen-cart-pro.at/license/2_0.txt GNU Public License V2.0
* @version $Id: class.ec_analytics.php 2017-08-15 20:49:36Z webchills $
*/
class ec_analytics extends base {

function ec_analytics() {
global $zco_notifier;
$zco_notifier->attach($this, array('NOTIFY_HEADER_TIMEOUT'));

$this->attach($this, array(
// actionable events //
'NOTIFY_HEADER_START_PRODUCT_INFO',
'NOTIFIER_CART_ADD_CART_END',
'NOTIFIER_CART_REMOVE_END',
'NOTIFY_HEADER_START_LOGIN',
'NOTIFY_LOGIN_SUCCESS',
'NOTIFY_LOGIN_SUCCESS_VIA_CREATE_ACCOUNT',
'NOTIFY_LOGIN_SUCCESS_VIA_NO_ACCOUNT',
'NOTIFY_CHECKOUT_PROCESS_BEGIN',
'NOTIFY_HEADER_START_CHECKOUT_SHIPPING',
'NOTIFY_HEADER_START_CHECKOUT_PAYMENT',
'NOTIFY_HEADER_START_CHECKOUT_CONFIRMATION',
'NOTIFY_HEADER_START_CHECKOUT_SUCCESS',
// Generic events //
'NOTIFY_LOGIN_FAILURE',
'NOTIFY_HEADER_START_LOGIN_TIMEOUT',
'NOTIFY_FAILURE_DURING_CREATE_ACCOUNT',
'NOTIFY_FAILURE_DURING_NO_ACCOUNT',
'NOTIFY_PAYMENT_PAYPAL_RETURN_TO_STORE',
'NOTIFY_PAYMENT_PAYPAL_CANCELLED_DURING_CHECKOUT'
));
}

function getID() {
$id = '';
if (isset($_REQUEST['products_id'])) {
if (is_array($_REQUEST['products_id'])) { $id = explode(":", $_REQUEST['products_id'][0]);
} else { $id = explode(":", $_REQUEST['products_id']); }
} else {
if (isset($_REQUEST['product_id'])) {
if (is_array($_REQUEST['product_id'])) { $id = explode(":", $_REQUEST['product_id'][0]);
} else { $id = explode(":", $_REQUEST['product_id']); }
}
}
$id = intval($id[0]);
if ($id == 0) $id = "";
return $id;
}


function getCatString($id) {
global $db, $cPath ;
$masterCat = zen_get_categories_name_from_product($id) ;
$i = 0 ; $flag = 0 ;
if(isset($cPath)) {
$p = explode("_",$cPath) ;
while ($i < sizeof($p)) {
$the_categories_name= $db->Execute("select categories_name from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id= '" . $p[$i] . "' and language_id= '" . $_SESSION['languages_id'] . "'");
if ($masterCat == $the_categories_name->fields['categories_name']) {$flag = 1 ;}

$i++ ;
}
$catTxt = substr($catTxt, 1);
}
return ($flag != 1 ) ? $masterCat:$catTxt;
// return $catTxt ;
}

function addProductItemsStr() {
$itemsStr = "" ; $i=0 ;
$products = $_SESSION['cart']->get_products();
if(is_array($products)) {
foreach ($products as $item) {
if(is_array($item['attributes'])) $varTxt = zen_values_name($item['attributes'][1]);
if(!$varTxt) $varTxt = "n/a";

$itemID = explode(":", $item['id'] ) ;

$brand = zen_get_products_manufacturers_name($itemID[0]) ;
$brandTxt = ($brand != "") ? $brand:"n/a";
$itemsStr .= "ga('ec:addProduct',"
. " {'id': '{$itemID[0]}',"
. " 'name': '".addslashes($item['name'])."',"
. " 'brand': '{$brandTxt}',"
. " 'category': '". zen_get_categories_name_from_product($itemID[0])."' ,"
. " 'variant': '{$varTxt}',"
. " 'price': '".number_format((float)($item['price'] + ($item['price'] * $item['tax_class_id'] / 100 )) ,2,'.','')."',"
. " 'quantity': '{$item['quantity']}',"
. " 'position': '{$i}' } );\n";
$i++ ;
}
}
return $itemsStr ;
}
/////////////////////////////
function update(&$callingClass, $notifier, $paramsArray) {
global $db, $analytics;

switch ($notifier) {
case 'NOTIFY_HEADER_START_PRODUCT_INFO' :
$id = $this->getID();
if ($id) {
$brand = zen_get_products_manufacturers_name($id) ;
$brandTxt = ($brand != "") ? $brand:"n/a";
$res = $db->Execute("SELECT products_name FROM " . TABLE_PRODUCTS_DESCRIPTION . " WHERE products_id = $id");
$analytics['item'] = array('productID' => $id, 'productName' => addslashes($res->fields['products_name']), 'category' => $this->getCatString($id), 'brand' => $brandTxt);
$analytics['action'] = "View Product";
}
break;


case 'NOTIFIER_CART_ADD_CART_END' :
case 'NOTIFIER_CART_REMOVE_END' :
$analytics['action'] = "Delete from Cart";
$varTxt = "n/a"; $qty = '';
if ($notifier == 'NOTIFIER_CART_ADD_CART_END') {
$analytics['action'] = "Add to Cart";
if (isset($_REQUEST['cart_quantity'])) $qty = intval($_REQUEST['cart_quantity']);
if (!$qty) $qty = 1;
$products = $_SESSION['cart']->get_products();
if(is_array($products)) {
foreach ($products as $item) {
if(is_array($item['attributes'])) {
$itemID = explode(":", $item['id'] ) ;
$requestID = explode(":", (string)$_REQUEST['products_id'] ) ;
if ($requestID[0] === $itemID[0]) {
$varTxt = zen_values_name($item['attributes'][1]);
}
}
}
}
}
$id = $this->getID();
if ($id) {
$brand = zen_get_products_manufacturers_name($id) ;
$brandTxt = ($brand != "") ? $brand:"n/a";

$res = $db->Execute("SELECT products_name FROM " . TABLE_PRODUCTS_DESCRIPTION . " WHERE products_id = $id");
$analytics['item'] = array('productID' => $id, 'productName' => $res->fields['products_name'], 'category' => $this->getCatString($id), 'brand' => $brandTxt, 'productQTY' => $qty, 'variant' => $varTxt);
}
break;

///////////// Chckout steps ////////////////////////////
case 'NOTIFY_HEADER_START_LOGIN': // Checkout Step 1
$analytics['action'] = "Start Login";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_LOGIN_SUCCESS':// Checkout Step 2
$analytics['action'] = "Login Success";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_LOGIN_SUCCESS_VIA_CREATE_ACCOUNT':// Could also be Checkout step 2
$analytics['action'] = "Login Success via Create Account";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_LOGIN_SUCCESS_VIA_NO_ACCOUNT':// Could also be Checkout Step 2
$analytics['action'] = "Login Success via No account";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_CHECKOUT_PROCESS_BEGIN': // Checkout Step 3
$analytics['action'] = "Checkout Process begin";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_HEADER_START_CHECKOUT_SHIPPING':// Checkout Step 4
$analytics['action'] = "Checkout Shipping";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_HEADER_START_CHECKOUT_PAYMENT':// Checkout Step 5
$analytics['action'] = "Checkout Payment";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;

case 'NOTIFY_HEADER_START_CHECKOUT_CONFIRMATION':// Checkout Step 6
$analytics['action'] = "Checkout Confirmation";
$analytics['addProductItemsStr'] = $this->addProductItemsStr() ;
break;
/////////////////////////////////////////////////////////

case 'NOTIFY_HEADER_START_CHECKOUT_SUCCESS':// All Checkout complete/successful
$order_summary = $_SESSION['order_summary'];
if ($order_summary['order_number']) {

// add other cases as you wish for your other payment modules
switch ((string) $order_summary['payment_module_code']) {
case "paypalwpp": $affiliation = "PayPal Express" ; break ;

default : $affiliation = (string) $order_summary['payment_module_code'] ;
}



$coupon = (isset($order_summary['coupon_code'])) ? $order_summary['coupon_code'] : "n/a";
$analytics['transaction'] = array('id' => (string) $order_summary['order_number'], 'affiliation' => $affiliation,
'revenue' => number_format($order_summary['order_total'],2,'.',''), 'shipping' => number_format($order_summary['shipping'],2,'.',''), 'tax' => number_format($order_summary['tax'],2,'.',''), 'coupon' => $coupon);

$items_query = "SELECT DISTINCT orders_products_id, products_id, products_name, products_model, final_price, products_tax, products_quantity
FROM " . TABLE_ORDERS_PRODUCTS . " WHERE orders_id = :ordersID ORDER BY products_name";

$items_query = $db->bindVars($items_query, ':ordersID', $order_summary['order_number'], 'integer');
$items_in_cart = $db->Execute($items_query);
$i = 0 ; $analytics['addProductItemsStr']= "" ;
while (!$items_in_cart->EOF) {
$variant = $db->Execute("SELECT products_options_values FROM " . TABLE_ORDERS_PRODUCTS_ATTRIBUTES . " WHERE orders_products_id = " . (string)$items_in_cart->fields['orders_products_id']);
$varTxt = ($variant->fields['products_options_values'] != "") ? $variant->fields['products_options_values']:"n/a";
$brand = zen_get_products_manufacturers_name($items_in_cart->fields['orders_products_id']);
$brandTxt = ($brand != "") ? $brand:"n/a";

$analytics['addProductItemsStr'] .= "ga('ec:addProduct',"
. " { 'id': '{$items_in_cart->fields['products_id']}',"
. " 'name': '".addslashes($items_in_cart->fields['products_name'])."',"
. " 'brand': '{$brandTxt}',"
. " 'category': '".zen_get_categories_name_from_product($items_in_ca rt->fields['products_id'])."',"
. " 'variant': '{$varTxt}',"
. " 'price': '".number_format($items_in_cart->fields['final_price'] + ($items_in_cart->fields['final_price'] * $items_in_cart->fields['products_tax'] / 100 ),2,'.','')."',"
. " 'quantity': '{$items_in_cart->fields['products_quantity']}',"
. " 'coupon': '{$coupon}',"
. " 'position': '{$i}' } );\n";
$i++ ;
$items_in_cart->MoveNext();
}
$analytics['action'] = "Checkout Success";
}
break;


default:
$notifyArr = explode("_", $notifier, 2);
$analytics['action'] = ucwords(strtolower(str_replace("_", " ", $notifyArr[1])));
}
$_SESSION['analytics'] = $analytics;
}
}

bumerang24
16.08.2017, 16:19
So, ich noch mal.
Im Admin klappt jetzt alles, aber beim Aufruf des Shops kommt folgende Fehlemeldung:

The Google Analytics trackingID is not yet defined in
/includes/extra_datafiles/ec_analytics.php

Erst nach klicken von OK kommt mann im Shop.

Mein Eintrag in der Datei:
define('GOOGLE_UA', 'UA-12345678-1');

Steht drinn mit der richigen ID...
Wo hackt es jetzt wieder?

webchills
16.08.2017, 17:03
Wo hackt es jetzt wieder?
daran, dass die includes/extra_datafiles/ec_analytics.php ganz eindeutig eben nicht geändert wurde

bumerang24
16.08.2017, 17:19
dann erklär mir doch bitte wie ich es machen soll.
Ich habe meinen Code den ich von Google habe hanau so wie du sehen kannst eingetragen.
Nur habe ich halt wie vom Admin vorgeschrieben keine Original Daten gepostet.

webchills
16.08.2017, 17:26
Überprüfe den Inhalt der Datei am Server, ihr Inhalt wurde nicht geändert, sonst würde diese Meldung nicht kommen.
Es ist wirklich eindeutig.

Verwende ein FTP Programm, das zuverlässig bestehende Dateien überschreibt.
Eine sehr große Zahl Deiner Postings bezieht sich auf Probleme mit dem Hochladen/Überschreiben von Dateien.
Wenn es damit immer wieder Probleme gibt, dann ändere mal was und verwende ein anderes Programm dafür.

bumerang24
16.08.2017, 17:36
Den gesammten Inhalt der Datei habe ich ja schon gepostet, mehr ist da nicht drin.
Für den Upload verwende ichwie die meisten Wohl FileZilla in der neusten Version.
Ich bin aber gerne für bessere Programme offen, ich hab nur noch keins gefunden.
Hir noch mal der ges. Inhalt der Datei auf dem Server ( ist gleich mit dem Download ) nur mit meiner Goggle UA-

<?php
// Tragen Sie hier Ihre Google Analytics Tracking ID ein
define('GOOGLE_UA', 'UA-12345678-1');

Zum Vergleich der Org Code aus dem Download


<?php
// Tragen Sie hier Ihre Google Analytics Tracking ID ein
define('GOOGLE_UA', 'UA-XXXXXXXX-X');;

Bin gespannt, was da noch rauskommt....
Ich weis du hast deine Zeit auch nicht gestohlen, und hilfst immer und gerne wo du kannst

webchills
16.08.2017, 17:40
Es gibt da nicht mehr dazu zu sagen.
Das ist mit Sicherheit nicht der Inhalt der Datei auf dem Server des Shops, der diese Meldung bringt.

Empfehlenswerte Software ist im Linkbereich zusammengestellt:
https://www.zen-cart-pro.at/forum/vblinklist.php?do=showcat&catid=4

bumerang24
16.08.2017, 17:44
Danke, das du mich für Dumm erklärst, das hätte ich nicht erwartet.
Ich kann nicht mehr als die Datei runterladen, den Code einfügen und posten.
FileZilla ist übrigens vorgeschlagen an vierter Stelle vor Cutte FTP