Jump to content

Changer de groupe un visiteur en fonction de son referer


Recommended Posts

Bonjour,

 

ma boutique tourne sur une version 1.6.0.14 et j'aurais souhaité ajouter une condition pour qu'un visiteur provenant d'un certain site ne soit plus rattaché au groupe visiteur par défaut de prestashop afin qu'il voit immédiatement la remise de 30% que je prévois à ce type de visiteur.

 

Je sais que le groupe visiteur est fixé par la directive PS_UNIDENTIFIED_GROUP.

 

J'ai donc fait un grep -R "PS_UNIDENTIFIED_GROUP" à la racine et cette directive est utilisée dans pas mal de fichiers.

 

Du coup, je ne sais pas trop ou mettre ma condition (s'appuyant sur un $_SERVER['HTTP_REFERER'] pour fixer le bon id de groupe) pour que ça marche.

 

Peut-être que je ne vais pas dans la bonne direction.

 

Espérant avoir été clair.

 

Merci d'avance pour vos suggestions

 

Excellente journée !

Edited by lemrao (see edit history)
Link to comment
Share on other sites

  • 4 weeks later...

salut, peut etre en faisant un override du front controller et mettre tout ca dans la fonction init

(code specifique a un de mes projets)

<?php

class FrontController extends FrontControllerCore
{
    public function init()
    {
        parent::init();

        $context = Context::getContext();

        if ($context->cookie->isLogged()){
            $customer = $context->customer;
            $id_customer = $customer->id;
            $id_group = $customer->id_default_group;
            $id_customer_profile = Product::getCustomerIdProfile($id_customer);
            $id_avatar = Product::getCoverId($id_customer_profile);
            $url_avatar = Image::getImgFolderStatic($id_avatar);
            self::$smarty->assign('customerID', $id_customer);
            self::$smarty->assign('customerIDprofile', $id_customer_profile);
            self::$smarty->assign('customerGroup', $id_group);
            self::$smarty->assign('customerAvatarID', $id_avatar);
            self::$smarty->assign('customerAvatarChemin', $url_avatar);
        }
    }
}
Link to comment
Share on other sites

Bonjour et excellente nouvelle année !

 

J'avais trouvé une solution peut-être pas la plus harmonieuse pour les puristes et j'ai oublié d'en faire part ici. J'utilise volontairement les sessions php plutôt que les cookies pour mon besoin car si le salarié a les cookies désactivés, il ne voit pas sa remise.

 

Je bascule le visiteur sur mon nouveau groupe avec tarif préférentiel (id=5 dans la table ps_group) et lorsqu'il crée un compte client il est également rattaché à ce même groupe plutôt que le groupe client par défaut

 

'urlpart' est le bout de chaîne correspondant à un bout de l'url que j'analyse. Ainsi je vérifie que urlpart existe dans www.urlpart.com (vous pourrez remplacer urlpart par ce que vous voulez pour votre besoin.

 

classes/Customer.php

 public function __construct($id = null)
        {
                 if(session_id() == '' || !isset($_SESSION)) {
                        session_start();
                        }

                if ($_SESSION['urlpart'] == 'urlpart')
                $this->id_default_group = 5;
                else
                $this->id_default_group = (int)Configuration::get('PS_CUSTOMER_GROUP');
                parent::__construct($id);
        }

classes/Group.php

 public static function getCurrent()
        {
                static $groups = array();

                $customer = Context::getContext()->customer;
                if (Validate::isLoadedObject($customer))
                        $id_group = (int)$customer->id_default_group;
                else {
                        if(session_id() == '' || !isset($_SESSION)) {
                        session_start();
                        }
                        if ($_SESSION["urlpart"] == 'urlpart')
                         $id_group = 5;

                         else if (strpos($_SERVER['HTTP_REFERER'],'urlpart')){
                         $id_group = 5;
                         $_SESSION["urlpart"] = 'urlpart';
                        }
                        else
                        $id_group = (int)Configuration::get('PS_UNIDENTIFIED_GROUP');
                }
                if (!isset($groups[$id_group]))
                        $groups[$id_group] = new Group($id_group);

                if (!$groups[$id_group]->isAssociatedToShop(Context::getContext()->shop->id))
                {
                        $id_group = (int)Configuration::get('PS_CUSTOMER_GROUP');
                        if (!isset($groups[$id_group]))
                                $groups[$id_group] = new Group($id_group);
                }

                return $groups[$id_group];
        }

Enfin dans le fichier header.tpl du thème de ma boutique, j'affiche une fancybox (l'image popup.jpg à la racine de mon serveur web) au visiteur pour lui indiquer sa remise s'il provient du site en question. Je redirige le visiteur sur http://monsite.fr à la fermeture de la fancybox car la site référent ouvre mon site dans une iframe occasionnant des dysfonctionnements du panier.

 

header.tpl

{if $smarty.server.HTTP_REFERER|strstr:"urlpart"}

{literal}
<script type="text/javascript">
$(document).ready(function () {
        $.fancybox({
            'width': '40%',
            'height': '40%',
            'autoScale': true,
            'transitionIn': 'fade',
            'transitionOut': 'fade',
            'type': 'iframe',
            'href': 'popup.jpg', type: "image",
            afterClose  : function() {
       top.location.href = 'http://monsite.fr';
    }
        });
});



</script>
{/literal}

{/if}

Un override des classes serait certainement plus propre.

 

Bonne journée !

Link to comment
Share on other sites

Bonsoir Peggy,

 

Que veux-tu faire exactement et quelle est ta version de Prestashop?

 

Mon 2e code (fonction getCurrent() du script classes/Group.php) analyse si le visiteur provient d'un site dont l'adresse contient "urlpart". Si c'est le cas il est automatiquement basculé au groupe id=5 plutôt que id=1 (groupe visiteur par défaut)

 

Mon 1er code (fonction __Construct() du script classes/Customer.php) assure que le visiteur, lorsqu'il crée un compte client pour régler sa commande (je ne fais pas de commande invité sur ma boutique) est basculé également sur le groupe 5 pour continuer à bénéficier de sa remise une fois enregistré ou connecté car le groupe par défaut d'un client est id=3.

 

Ta boutique offre-t'elle la possibilité de régler une commande sans s'enregistrer (compte invité)?

 

Si ce que tu recherches correspond au fonctionnement qui est le mien et que ta version de PS est 1.6.x.x, tu peux remplacer les fonctions __Construct() et getCurrent() comme je l'ai fait avec 10 au lieu de 5 pour chaque affectation d'id de groupe et évidemment ce que tu veux à la place de urlpart.

 

Le 3e script dans le header.tpl est purement informatif en affichant juste une popup pour afficher un message de bienvenue en indiquant le taux de remise. 

 

 

Bonne soirée

Link to comment
Share on other sites

Bonjour Lemrao,

 

Merci d'avoir pris du temps pour répondre.

c'est ton deuxième code qui m'intéresse mais sans la partie qui fait référence à l'url. Je veux simplement assigner tout mes visiteurs peut importe d'où ils viennent, automatiquement à un autre groupe car j'ai des tarifs dégressifs auquels sinon ils n'ont pas accès. Mais je n'y comprends pas grand chose et je ne sais pas ce qu'il faut faire. Si tu peux m'orienter un peu ce serait vraiment génial.

Je te souhaite une excellente journée.

Link to comment
Share on other sites

Bonjour Peggy,

 

peut-être que dans ton cas il suffirait juste d'appliquer une remise sur le groupe invité dans le Backoffice (clients->groupe) puisque que tu veux une remise pour tous les visiteurs sans condition? 

 

Bonne journée

Link to comment
Share on other sites

Non malheureusement ce n'est pas la solution mes tarifs dégressifs par quantité sont crée dans un groupe particuliers (id=10) il faut que les visiteurs glissent automatiquement dedans. Il faudrait que je puisse inclure correctement et au bon endroit cette notion PS_UNIDENTIFIED_GROUP=id 10 ou quelquechose de correct en code qui reprend l'idée!! rires!! Bon je vais continuer à regarder je vais bien finir par trouver :D 

Merci en tout cas de ton aide et de ton temps.

 

Passe une bonne journée.

Link to comment
Share on other sites

Très bien, dans ce cas voici la fonction d'origine dans laquelle j'ai commenté l'instruction qui vous concerne et rajouté le bon id de groupe sous le commentaire

public static function getCurrent()
	{
		static $groups = array();

		$customer = Context::getContext()->customer;
		if (Validate::isLoadedObject($customer))
			$id_group = (int)$customer->id_default_group;
		else
			// $id_group = (int)Configuration::get('PS_UNIDENTIFIED_GROUP');
                        $id_group = 10;

		if (!isset($groups[$id_group]))
			$groups[$id_group] = new Group($id_group);
			
		if (!$groups[$id_group]->isAssociatedToShop(Context::getContext()->shop->id))
		{
			$id_group = (int)Configuration::get('PS_CUSTOMER_GROUP');
			if (!isset($groups[$id_group]))
				$groups[$id_group] = new Group($id_group);
		}

		return $groups[$id_group];
	}
Edited by Arlulo (see edit history)
Link to comment
Share on other sites

  • 2 months later...

Thank you very much for your ideas, just some additions if "Guest checkout" is enabled you also need to modify 

add function in customer.php

       if ($this->id_default_group == Configuration::get('PS_CUSTOMER_GROUP')) {
            if ($this->is_guest) {
                if ($_SESSION["urlpart"] == "urlpart")
                {
                    $this->id_default_group = 5;
                }
                else
                {
                    $this->id_default_group = (int)Configuration::get('PS_GUEST_GROUP');
                }
            } else {
                $this->id_default_group = (int)Configuration::get('PS_CUSTOMER_GROUP');
            }
        }

  • Like 1
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...