Jump to content

Frais de livraison selon Pays pour un client non connecté ?


Recommended Posts

Bonjour,

Utilisateur d'un Prestashop en version 1.7.8 multi-langue

J'ai activé la détection automatique de la langue et du pays en fonction des langues acceptées par le navigateur.
Ce qui semble bien fonctionner, l'utilisateur est redirigé sur la bonne langue et au moment de créer son adresse le pays a été reconnu et il est pré rempli !

 

Mais j'aimerais aussi que les frais de livraison affichés, quand le client ajoute un produit au panier, correspondent au pays qui a été détecté !
Ce sont toujours les frais de livraison du pays par défaut qui sont indiqués tant que Prestashop ne connaît pas son adresse :(

Si je change le pays par défaut, j'ai bien le BEST_PRICE d'un transporteur pour ce pays.

Est-ce que c'est la même situation chez tout le monde par défaut ?
Une piste, à approfondir dans la configuration de la boutique ou des transporteurs, dans le code ?

 

J'essaye de bidouiller le code, mais le calcul du panier et de la livraison, c'est vraiment complexe...

Quelques essais un peu bourrin dans le FrontController* pour modifier la configuration du shop par défaut et du context tant qu'il n'y a pas d'adresse de livraison, ça fonctionne mais j'ai pas vérifié les effets de bords éventuels... Vous en pensez quoi ?
 

if (Configuration::get('PS_DETECT_COUNTRY') && isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])
            && preg_match('#(?<=-)\w\w|\w\w(?!-)#', $_SERVER['HTTP_ACCEPT_LANGUAGE'], $array)
            && Validate::isLanguageIsoCode($array[0])) {
        $idc = (int) Country::getByIso($array[0], true);
        Configuration::set('PS_COUNTRY_DEFAULT', $idc);
         if (!isset($cart->id_address_delivery) || $cart->id_address_delivery == 0) {
            $defaultCountry = new Country($idc, (int) $this->context->cookie->id_lang);
            $this->context->country = $defaultCountry;
        }
}


*ligne 383 à la cloture de l'accolade du ```elseif (Configuration::get('PS_DETECT_COUNTRY')) { [...] }```

 

Link to comment
Share on other sites

Se baser sur la langue du navigateur est un peu risqué (de nombreux pays ont la même langue)

Le code de la 1.6 qui est fonctionnel:

        if(Configuration::get('PS_GEOLOCATION_ENABLED')) {
            if(($new_default = $this->geolocationManagement($this->context->country)) && Validate::isLoadedObject($new_default)) {
                $this->context->country = $new_default;
            }
        }
        elseif(Configuration::get('PS_DETECT_COUNTRY')) {
            $has_currency = isset($this->context->cookie->id_currency) && (int)$this->context->cookie->id_currency;
            $has_country = isset($this->context->cookie->iso_code_country) && $this->context->cookie->iso_code_country;
            $has_address_type = false;

            if((int)$this->context->cookie->id_cart
                && ($cart = new Cart($this->context->cookie->id_cart))
                && Validate::isLoadedObject($cart)
            ) {
                $has_address_type = isset($cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')})
                    && $cart->{Configuration::get('PS_TAX_ADDRESS_TYPE')};
            }

            if((!$has_currency || $has_country) && !$has_address_type) {
                $id_country = $has_country && !Validate::isLanguageIsoCode($this->context->cookie->iso_code_country) ?
                    (int)Country::getByIso(strtoupper($this->context->cookie->iso_code_country)) : (int)Tools::getCountry();

                $country = new Country($id_country, (int)$this->context->cookie->id_lang);

                if(!$has_currency && validate::isLoadedObject($country)
                    && $this->context->country->id !== $country->id
                ) {
                    $this->context->country = $country;
                    $this->context->cookie->id_currency = (int)Currency::getCurrencyInstance($country->id_currency ?
                        (int)$country->id_currency :
                        (int)Configuration::get('PS_CURRENCY_DEFAULT'))->id;
                    $this->context->cookie->iso_code_country = strtoupper($country->iso_code);
                }
            }
        }

 

Link to comment
Share on other sites

Bonjour @Eolia,

Merci pour ta réponse, c'est à quelques lignes prêt la même chose qu'en 1.7, la détection du pays est juste déportée dans la fonction :

Tools::getCountry()

Avec la 1.6, est-ce ensuite le bon pays qui est utilisé pour le calcul des frais de livraison sans connaître l'adresse du client ?
Si oui, il doit y avoir d'autres changements un peu plus loin dans le code.

Concernant le risque d'erreur identification via accept-language, la regex cherche bien le pays si il est indiqué, par exemple avec "es_mx" elle retourne MX ;)
Je suis satisfait de la détection en l'état, le sujet c'est vraiment les frais de livraison affichés dans le panier tant que Prestashop ne connait pas l'adresse de livraison.

Bon... joueur je suis, j'ai passé le code en prod, jusqu'ici tout va bien...

 

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...