Jump to content

Michel Poulain

Members
  • Posts

    50
  • Joined

  • Last visited

About Michel Poulain

  • Birthday 12/24/1971

Profile Information

  • Location
    Paris, France
  • Activity
    Freelancer

Michel Poulain's Achievements

Newbie

Newbie (1/14)

2

Reputation

  1. Je cherchais une astuce pour lutter contre les paniers abandonnés. J'ai remarqué qu'après chaque mailing auprès de mes clients ayant un compte sur mon site, les paniers abandonnés augmentaient. J'ai un module de relance de paniers abandonnés, mais celui-ci ne fonctionne que si les visiteurs sont identifiés AVANT de quitter ma boutique. J'ai donc eu l'idée de fournir dans mon mailing, au lieu des traditionnels liens vers les pages produits mis en avant, des liens personnalisés qui provoquent l'identification automatique des clients. Les deux variables dans le lien sont sid et uid L'adresse email sid est codée en base64. J'ai rajouté un jeton de vérification le uid de Prestashop our éviter qu'un petit malin se fasse passer pour un autre client. Les liens vers les pages de ma boutique sont donc sur le modèle : http://www.maboutique.com/categorie/mon_produit.html?sid=XXXXXXXXXX&uid=XX Les variables sid et uid sont produites à partir de l'adresse email du client et de son ID Prestashop : $sid = base64_en​code(trim(strtolower($email))); $uid = [ID Prestashop]; J'ai modifié le fichier «/index.php» à la racine gérant l'ensemble des pages : require(dirname(__FILE__).'/config/config.inc.php'); Dispatcher::getInstance()->dispatch(); En rajoutant des procédures de vérification, de redirection et d'identification : require(dirname(__FILE__).'/config/config.inc.php'); // Les variables d'identification uid et sid sont présentes ? if(isset($customer) && !$customer->id && isset($_REQUEST['uid']) && isset($_REQUEST['sid'])) { // Récupérer le client $customer = new Customer(); $customer->getByEmail(trim(base64_decode($_REQUEST['sid']))); // Le jeton de vérification est-il valide ? if(isset($customer->id) && $customer->id==$_REQUEST['uid']) { $ctx = Context::getContext(); $ctx->cookie->id_customer = (int)($customer->id); $ctx->cookie->customer_lastname = $customer->lastname; $ctx->cookie->customer_firstname = $customer->firstname; $ctx->cookie->logged = 1; $customer->logged = 1; // Récupération de l'ID guest // Guest::setNewGuest($ctx->cookie); $guest = new Guest(Guest::getFromCustomer($customer->id)); $guest->userAgent(); $guest->save(); $customer->id_guest = $guest->id; $ctx->cookie->id_guest = $guest->id; // Mise à jour de la dernière visite //$connection = new Connection();// Methode 1 //$connection->setPageConnection($ctx->cookie); //Connection::setPageConnection($ctx->cookie); // Methode 2 /* Db::getInstance()->insert('connections', array( 'id_guest' => (int)$customer->id_guest, 'id_page' => Page::getCurrentId(), 'ip_address' => (Tools::getRemoteAddr() ? (int)ip2long(Tools::getRemoteAddr()) : ''), 'id_shop' = Context::getContext()->shop->id, 'id_shop_group' = Context::getContext()->shop->id_shop_group, 'date_add' = date('Y-m-d H:i:s'), 'http_referer' => 'http://example.com/' ), false, true, Db::INSERT_IGNORE); */ $ctx->cookie->is_guest = $customer->isGuest(); $ctx->cookie->passwd = $customer->passwd; $ctx->cookie->email = $customer->email; $ctx->customer = $customer; $ctx->cookie->write(); header('Location: '.str_replace('uid=','nid=',$_SERVER['REQUEST_URI'])); exit; } } Dispatcher::getInstance()->dispatch(); Chaque client recevant mon mailing et cliquant sur un lien de sa lettre personnalisée est désormais automatiquement identifié sur ma boutique. Ses paniers abandonnés peuvent être relancés. J'espère que cette astuce aidera certains vendeurs. [Limitations : je n'arrive pas à faire fonctionner la mise à jour de la dernière visite. J'ai essayé (et désactivé) trois méthodes.]
  2. J'ai mis à jour le code pour qu'il ne pas s'active pas en cas de multi-pages et d'arrivée sur la dernière page qui n'aurait qu'un seul produit (bref c'est mieux).
  3. Merci «webbax» pour cette réponse ultra-rapide. Point le pont n°2 c'est assez simple : c'est juste un paramètre à rajouter à la fin de toutes les URL des pages produits. Il permet à Google Analytics de tracer les ventes comparateurs par comparateur ainsi que les clics (mon point n°3). Il suffirait juste de rajouter un unique champ de texte "Tracabilité" dans les fenêtre des options de chaque comparateur. Libre aux utilisateurs de Salesbooster de l'utiliser ou pas. Exemple : www.monsite.com/page/produit.html devient www.monsite.com/page/produit.html?utm_source=kelkoo&utm_medium=comparateur Pour le point n°1, les déclinaisons, je ne souhaite pas exporter les déclinaisons (2118 au total), mais je demandais si mes produits (115) auraient leurs prix à zéro ou bien le prix de la déclinaison par défaut comme lorsqu'un visiteur est sur une page produit de Prestashop.
  4. Je suis très intéressé de changer notre solution actuelle contre votre module. J'ai quelques questions à propos de votre module : # supporte-t-il les déclinaisons ? (tous nos produits à 0€ + le prix des déclinaisons) # supporte-t-il les codes de tracking Google Analytics comparateur par comparateur ? (utm_source, utm_medium, ...) # trace-t-il la provenance des ventes et des clics ? Dernière question (par curiosité) : pourquoi votre module ne figure-t-il pas sur le site officiel des addons Prestashop ? Merci pour vos réponses.
  5. C'est génial. Merci 干将ooo. C'est b2comm qui attendait cela depuis un moment. 干将ooo : est-ce qu'il serait possible d'avoir la totalité du script avec la modification pour l'Ajax dedans ?
  6. Bonjour, comme je disais dans mon message, le forum Prestashop n'est pas du tout fait pour échanger du code. Le forum a supprimé pas mal de mon code. Si le code s'affiche en bas de ton site, c'est qu'il manque des balises. Remplacer "(" par "<" et ")" par ">" dans le code suivant : (script type="text/javascript") après la ligne {litteral} et (/script) avant la ligne {/literal} Et dans le code même du script de mon précédent message, bien remplacer comme indiqué [removed] par window . location (sans espace) Le pus simple est encore de faire appel à un développeur pour insérer cela proprement dans ton thème. Car je n'ai pas testé avec la version 1.4 Tu peux voir le résultat sur www.estrada.fr/search.php?search_query=Jobel La page de recherche s'affiche un bref instant avant de rediriger automatiquement vers le produit "Jobel".
  7. Pas évident de mettre le nez dans le code Prestashop. Venant de Drupal, où la documentation est très bien ficelée et claire, là je tombe dans la nuit noire. Toucher au code n'est jamais bon. À chaque mise à jour, tout est à refaire, avec en prime la possibilité que les noms des fonctions changent. Je pensais mon code de personnalisation de panier "universel" JavaScript, je vois qu'il ne l'est pas. Si de bonnes âmes (codeurs) pouvaient prendre le relais, ils ont une bonne base pour commencer. C'est vrai que mon code n'est pas du tout fait pour le chargement de fichiers. Désolé. Pour le panier Ajax, ça semble plus facile de modifier, mais il faudrait que j'aie une installation propre avec Panier Ajax pour pouvoir jouer avec le code.
  8. Bon, là ça commence à faire beaucoup d'inconnues. Le mieux serait encore que l'équipe de Prestashop implémente ça directement à la base. Mais on peut rêver... :-(
  9. Désolé, je n'ai pas eu le temps de travailler dessus. Il faut que j'installe une boutique de test avec un panier Ajax. Ma boutique n'a pas de panier Ajax. Puis que je travaille sur le script.
  10. Bonjour b2comm. Merci pour ce retour. Effectivement cette rustine Ajax n'a pas été testée avec le module Block Cart activé. Pour tout dire, je ne connaissais pas ce module. J'ai vraiment du mal à comprendre le pourquoi du comment de ce fonctionnement bizarroïde. D'où cette rustine "commande et personnalisation en un clic". Par contre, contrairement à Drupal, d'où je viens, Prestashop n'est pas conçu pour être détourné facilement. Surtout en JavaScript. Je vais voir ce que je peux faire, mais rien n'est sûr, car les deux comportements Ajax risquent de se télescoper.
  11. Merci, ça fait plaisir. C'est comme cela, je trouve, que le panier personnalisé de Prestashop devrait nativement fonctionner.
  12. En fait, le problème n'est pas le même, car c'est le fonctionnement natif de Prestashop : quand un champ est manquant, un message d'erreur apparait. Mais si tous les champs sont remplis, l'étape de retour sur la page est supprimé (ce qui est le but du script). Voici une nouvelle version du script qui vérifie les champs obligatoires. $(document).ready(function() { var ids = new Array(); $("#customizationForm input.customization_block_input").each(function(){ ids.push($(this).attr("id")); }); if($("#customizationForm").length) { //$('#center_column').html("" + $('#center_column').html().replace("cliquez sur Enregistrer puis", "") + ""); $('#customizationForm input:last').css({'display':'none'}); $('#customizationForm').submit(function() { return false; }); jQuery.data(document.body, 'personnalisation', false); $("#buy_block").submit(function() { if (jQuery.data(document.body, 'personnalisation')) return true; var temp = 'quantityBackup=0&submitCustomizedDatas=1'; for(var w=0; w temp += '&'+$('#'+ids[w]).attr('name')+'='+encodeURIComponent($('#'+ids[w]).val()); if($('#'+ids[w]).parent().hasClass('required') && $('#'+ids[w]).val()=='') { alert('Attention, vous devez personnaliser ce produit avant de le commander.'); $('#'+ids[w]).focus(); return false; } } $.ajax({ url: $('#customizationForm').attr('action'), global: false, type: "POST", data: temp, dataType: "html", async:false, success: function(msg){ jQuery.data(document.body, 'personnalisation', true); $("#buy_block").submit(); } }) return false; }); } });
  13. Justement, j'ai fait une mise à jour pas plus tard qu'hier soir, suite à un même problème. Le souci venait du fait que mon script ne prenait en compte qu'un seul attribut de personnalisation. Voici le nouveau script qui prend en compte autant d'attributs de personnalisation qu'en comporte la page produit. Attention Le nouveau script mis en place, l'erreur persistera tant que les Cookies ne sont pas vidés. Nous l'avons testé. Les cookies restent pendant plusieurs semaines chez les visiteurs. L'astuce est donc de vider les cookies des visiteurs, et donc l'ancienne valeur de personnalisation, en changeant la valeur du "_COOKIE_KEY_" dans /config/settings.inc.php Il suffit de changer une lettre par un chiffre, ça fera l'affaire. $(document).ready(function() { if($("#customizationForm").length) { //$('#center_column').html("" + $('#center_column').html().replace("cliquez sur Enregistrer puis", "") + ""); $('#customizationForm input:last').css({'display':'none'}); $('#customizationForm').submit(function() { return false; }); jQuery.data(document.body, 'personnalisation', ($("#customizationForm input:eq(0)").val()=='' ) ? false : true); $("#buy_block").submit(function() { if($('#customizationForm input:eq(0)').val()=='') { alert('Attention, vous devez personnaliser ce produit avant de le commander.'); $('#customizationForm input:eq(0)').focus(); return false; } if (jQuery.data(document.body, 'personnalisation')) return true; var temp = 'quantityBackup=0&submitCustomizedDatas=1'; $("#customizationForm input.customization_block_input").each(function(){ temp += '&'+$(this).attr('name')+'='+encodeURIComponent($(this).val()); }); $.ajax({ url: $('#customizationForm').attr('action'), global: false, type: "POST", data: temp, dataType: "html", async: false, success: function(msg){ jQuery.data(document.body, 'personnalisation', true); $("#buy_block").submit(); } }) return false; }); } });
×
×
  • Create New...