Version imprimable du sujet

Cliquez ici pour voir ce sujet dans son format original

Forum osCommerce-fr _ Echanges développeurs _ Boucle Checkout_shipping

Écrit par : DeathWarrior 15 Jun 2017, 14:06

Bonjour,

Je me creuse la tête depuis 1 semaine sans arriver a comprendre d’où le bug peut venir.

Si un client va dans son panier et clique sur commander, aucun problème. Par contre si il a le malheur de cliquer sur Recalculer, la page checkout_shipping s'affichera en boucle, impossible d'aller plus loin. Même si il n'a rien modifier dans le panier. Le problème se résout de lui même en se déconnectant/reconnectant.

De ce que j'ai pu comprendre, pour passer a la page suivante, il faut les bonnes variables POST (action=process) pour être rediriger les la page de paiement. Mais en mettant un var_dump($HTTP_POST_VARS) en haut de la page, $HTTP_POST_VARS est vide. Après cela peut venir aussi des variables sessions mais je n'arrive a determiner ce qui change avant et après le clique sur recalculer. En mettant un error_reporting(E_ALL), aucune erreur.

Je suis sous Oscommerce 2.2 (modifier par de nombreuses contribs et de modifs perso) et PHP 5.6.30.

J'ai testé également sur plusieurs navigateurs.

Merci a ceux qui ont prit la peine de me lire smile.gif.

Écrit par : Bonbec 15 Jun 2017, 16:41

Bonjour,

Logiquement quand on clique sur "recalculer", c'est la page shopping_cart.php qui se recharge après recalcul.
Si c'est le site indiqué dans le profil, le clic sur "recalculer" fonctionne normalement sur la page shopping_cart.php.
Je n'ai pas été plus loin car il faut créer un compte client.

Écrit par : DeathWarrior 16 Jun 2017, 08:09

Je me suis peut être mal exprimer. Le bouton Recalculer fonctionne très bien. Mais il provoque d'une certaine façon un bug.

Situation 1 : Je trouve un cable, je l'ajoute au panier, je clique sur commander et je vais jusqu'a la fin de la commande sans problème.
Situation 2 : Je trouve un cable, je l'ajoute au panier, je clique sur commander, mais je me rend compte qu'il m'en fallait 2. Je retourne dans mon panier, change la quantité avec recalculer. Puis je reclique sur commande. Et la, je ne pourrais pas aller plus loin que la page de choix d'expedition. A chaque fois que je clique sur continuer, je me retrouve sur la même page.

Écrit par : Havock 16 Jun 2017, 09:22

Bonjour,

Je n'ai plus les fichiers originaux de la 2.2 depuis longtemps, mais (si je n'ai pas touché cette partie là du code) quand tu clique pour recalculer le panier, tu valide un formulaire dirigé vers la page shopping_cart.php en faisant passer en Get le paramètre action avec la valeur 'update_product'

Code
echo tep_draw_form('cart_quantity', tep_href_link(FILENAME_SHOPPING_CART, 'action=update_product'));


Dans application_top.php regarde la partie de code correspondant à
Code
case 'update_product'


Tu as une partie correspondant à la mise à jour du panier puis une redirection.

La redirection est simple
Code
tep_redirect(tep_href_link($goto, tep_get_all_get_params($parameters)));


$goto étant lui même défini un peu avant.

Donc à première vue, dans shoppping_cart à proprement parler je ne vois rien de bloquant pour la suite, liée à une modification de quantité ???


Par contre j'ai effectivement constaté le problème que tu décris (j'ai créé un compte TEST).

Je pencherais pour un problème de sessions.

On reste sans doute bloqué sur checkout_shipping car on ne doit pas avoir de valeur de session définie pour shipping ou cartID

Déjà, sur checkout_shipping, quand je change l'adresse de livraison, ma modification n'est pas prise en compte.


Si je me déconnecte, puis me reconnecte sans modifier de quantité je peux effectivement passer au paiement, par contre les changements d'adresses ne sont toujours pas pris en compte.

C'est un peu le foutoir blink.gif

Je te conseillerais dans un premier temps de récupérer les variables de sessions pour savoir exactement ce qui peut manquer.







Écrit par : DeathWarrior 19 Jun 2017, 15:56

Merci de ta réponse. J'ai pu tester un peu plus.

Je n'arrive pas a comprendre ce qu'il se passe exactement mais j'ai tester le changement d'adresse. Peu importe ce que je faisais, le changement de la variable session sendto ne changeait pas. J'ai essayé de mettre tep_session_register('sendto'); juste avant la redirection et la miracle, le changement est prit en compte. Je me suis dis que j'avais dû supprimer une ligne a un moment mais j'ai comparé avec une version non modifié de OSC 2.3.4, le code est identique.

Si je suis le cheminement du code après avoir changer l'adresse et valider.

checkoup_shipping_address.php

CODE
// process the selected shipping destination
} elseif (isset($HTTP_POST_VARS['address'])) { //1 - TRUE
$reset_shipping = false;
if (tep_session_is_registered('sendto')) {//2 - TRUE
if ($sendto != $HTTP_POST_VARS['address']) {//3 - TRUE
if (tep_session_is_registered('shipping')) {//4 - FALSE
$reset_shipping = true;
}
}
} else {
tep_session_register('sendto');
}

$sendto = $HTTP_POST_VARS['address'];
$check_address_query = tep_db_query("select count(*) as total from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' and address_book_id = '" . (int)$sendto . "'");
$check_address = tep_db_fetch_array($check_address_query);

if ($check_address['total'] == '1') {//5 - TRUE
if ($reset_shipping == true) tep_session_unregister('shipping');//6 - FALSE

tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));//7 - Redirection
} else {
tep_session_unregister('sendto');
}
} else {
if (!tep_session_is_registered('sendto')) tep_session_register('sendto');
$sendto = $customer_default_address_id;
tep_redirect(tep_href_link(FILENAME_CHECKOUT_SHIPPING, '', 'SSL'));

}
}


Tout semble normal mais la variable session sendto se met a jour comment et a quel moment?

Écrit par : Bonbec 19 Jun 2017, 16:07

Bonjour,

C'est dans catalog/checkout_shipping.php vers la ligne 30 (mon fichier perso est modifié, donc çà peut varier un peu), il y a :

Code
  // if no shipping destination address was selected, use the customers own address as default
  if (!tep_session_is_registered('sendto')) {
    tep_session_register('sendto');
    $sendto = $customer_default_address_id;
  } else {
// verify the selected shipping address
    $check_address_query = tep_db_query("select count(*) as total from " . TABLE_ADDRESS_BOOK . " where customers_id = '" . (int)$customer_id . "' and address_book_id = '" . (int)$sendto . "'");
    $check_address = tep_db_fetch_array($check_address_query);

    if ($check_address['total'] != '1') {
      $sendto = $customer_default_address_id;
      if (tep_session_is_registered('shipping')) tep_session_unregister('shipping');
    }
  }

Écrit par : DeathWarrior 20 Jun 2017, 16:00

J'ai réussi a comprendre. Cela vient d'un ajout que j'avais fait a l’époque pour les register_globals. Il y avait extract($_SESSION, EXTR_SKIP); dans application_top. J'ai remplacer cette partie par celle contenu dans la version 2.3.4 tout frais. A savoir : extract($_SESSION, EXTR_OVERWRITE+EXTR_REFS);

Mais ça c'est pour le problème de changement d'adresse uniquement. J'ai toujours la boucle sur checkout_shipping lorsque je veux continuer. Mais c'est possible que le problème soit identique mais avec les variables POST plutôt.

Écrit par : Havock 21 Jun 2017, 07:40

Tu as des valeur de session définies pour shipping ou cartID ?

Écrit par : DeathWarrior 21 Jun 2017, 08:11

shipping oui mais $_SESSION['cartid'] est null. Par contre j'ai $_SESSION['cart']['cartid']

Maintenant j'ai aussi les variables $_POST qui sont bonnes ce qui n'était pas le cas dans mon premier message.

Edit: J'ai rien dit. Après deconnexion/reconnexion j'ai plus rien dans $_POST. Même en prenant la valeur tout au début du fichier PHP. J'ai vérifier la source, le code HTML est bien présent.
Edit2 : Bah les variables sont revenues. J'ai mis un commentaire dans la commande pour voir, et il était bien enregistré d'une façon ou d'une autre.

Edit3: J'ai comparé les deux dump de $_SESSION (quand la commande fonctionne et quand j'ai la boucle après avoir cliquer sur recalculer). La seule chose qui change c'est $_SESSION['cart']['cartid']. La valeur est null quand ça fonctionne et j'ai un ID quand ça fonctionne plus. J'aurais imaginé l'inverse...

Edit4: ET BAH ENFIN! J'ai trouvé. C'était bien cartID. J'ai copier le bout de code de la version 2.3.4 et ça a l'air de fonctionner.

CODE
if (!tep_session_is_registered('cartID')) {
tep_session_register('cartID');
} elseif (($cartID != $cart->cartID) && tep_session_is_registered('shipping')) {
tep_session_unregister('shipping');
}

$cartID = $cart->cartID = $cart->generate_cart_id();


Moi j'avais juste :
CODE
if (!tep_session_is_registered('cartID')) tep_session_register('cartID');


Je ne sais pas si j'ai supprimé ça par erreur a un moment mais là ça a l'air de fonctionner. Merci pour votre aide en tout cas.

Propulsé par Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)