Ceubex Posted November 17, 2014 Share Posted November 17, 2014 Bonjour, Je suis en galère depuis 2 semaines sur un problème de panier qui se vide de manière aléatoire sur certains ordis mes pas d'autres (après clic sur Ajouter au panier, le visiteur a un récapitulatif panier vide). Après toutes ces galères je pense avoir fait le tour du problème. Il y a 3 cas : 1) Vous êtes sous mutualisé OVH : désactiver le Géocache 2) Vous avez une version Prestashop < 1.5.5 : voir ce bugtracker http://forge.prestashop.com/browse/PSCFV-5698 3) Aucun problème apparent... La plus chiante c'est la dernière. Le problème n'est pas reproduit par tous les ordis, est totalement aléatoire. Parfois on peut s'identifier mais pas faire de panier et parfois c'est l'inverse. La cause est la suivante : soit parce que vous avez ajouter après les www., soit parce que vous utilisez plusieurs sous-domaines ou parce qu'un jour pour une raison bizarre, un visiteur est arrivé à utilisé votre site pendant un bref instant sans les www., un cookie s'est créé sur votre domaine sans les www. Concrètement sur le navigateur de celui-ci, il y a deux cookies, un sur www.mondomaine.com qui est le bon et un sur mondomaine.com qui est obsolète et le navigateur s'amuse à prendre celui-là des fois. Maintenant allez dire à tous vos anciens visiteurs d'aller dans les configurations de leur navigateur et de vider les cookies. Il faut forcer la suppression des cookies obsolètes. Par cela allez dans classes/shop/Shop.php, trouvez la fonction public static function initialize() et mettre ce code à la fin du premier if (juste avant } if ((!$id_shop && defined('_PS_ADMIN_DIR_')) || Tools::isPHPCLI()) ) foreach($_COOKIE as $nomCookie => $valeurCookie) { setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),false); setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),true); //unset($_COOKIE[$nomCookie]); } Cela va supprimer les cookies des domaines sans www. Le code final de la classe devrait ressembler à ça : // Find current shop from URL if (!($id_shop = Tools::getValue('id_shop')) || defined('_PS_ADMIN_DIR_')) { $host = pSQL(Tools::getHttpHost()); $sql = 'SELECT s.id_shop, CONCAT(su.physical_uri, su.virtual_uri) AS uri, su.domain, su.main FROM '._DB_PREFIX_.'shop_url su LEFT JOIN '._DB_PREFIX_.'shop s ON (s.id_shop = su.id_shop) WHERE (su.domain = \''.$host.'\' OR su.domain_ssl = \''.$host.'\') AND s.active = 1 AND s.deleted = 0 ORDER BY LENGTH(CONCAT(su.physical_uri, su.virtual_uri)) DESC'; $id_shop = ''; $found_uri = ''; $request_uri = rawurldecode($_SERVER['REQUEST_URI']); $is_main_uri = false; if ($results = Db::getInstance()->executeS($sql)) { foreach ($results as $row) { // An URL matching current shop was found if (preg_match('#^'.preg_quote($row['uri'], '#').'#i', $request_uri)) { $id_shop = $row['id_shop']; $found_uri = $row['uri']; if ($row['main']) $is_main_uri = true; break; } } } // If an URL was found but is not the main URL, redirect to main URL if ($id_shop && !$is_main_uri) { foreach ($results as $row) { if ($row['id_shop'] == $id_shop && $row['main']) { // extract url parameters $request_uri = substr($request_uri, strlen($found_uri)); $url = str_replace('//', '/', $row['domain'].$row['uri'].$request_uri); header('HTTP/1.1 301 Moved Permanently'); header('Cache-Control: no-cache'); header('location: http://'.$url); exit; } } } foreach($_COOKIE as $nomCookie => $valeurCookie) { setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),false); setcookie($nomCookie, false, time() - 3600,'/',str_replace('www.','',$host),true); //unset($_COOKIE[$nomCookie]); } } if ((!$id_shop && defined('_PS_ADMIN_DIR_')) || Tools::isPHPCLI()) { // If in admin, we can access to the shop without right URL if ((!$id_shop && Tools::isPHPCLI()) || defined('_PS_ADMIN_DIR_')) $id_shop = (int)Configuration::get('PS_SHOP_DEFAULT'); $shop = new Shop((int)$id_shop); if (!Validate::isLoadedObject($shop)) $shop = new Shop((int)Configuration::get('PS_SHOP_DEFAULT')); $shop->physical_uri = preg_replace('#/+#', '/', str_replace('\\', '/', dirname(dirname($_SERVER['SCRIPT_NAME']))).'/'); $shop->virtual_uri = ''; 1 Link to comment Share on other sites More sharing options...
OSV Posted April 15, 2015 Share Posted April 15, 2015 Dans /tools/geoip j'ai installé le fichier GeoLiteCity.dat et depuis tout fonctionne Dans le back-office de Prestashop (1.6.0.14) -> Localisation ce fichier est proposé au téléchargement et la procédure d'installation est indiquée. Bonne continuation à tous Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now