Modification des quantités ds un panier

Eléphant du PHP | 150 Messages

23 sept. 2005, 10:20

(Pardon, je reposte le message: autre sujet un peu différent)

Merci encore pour ton tuto Cyrano , ça m'a permis de résoudre bien des problèmes

Mais je bloque sur la fonction de modification des quantités dans le panier. Je pense qu'il y a un problème avec la fonction de vérification des produits présents, qui permet d'éviter les embrouilles avec la navigation par flèches et les rechargements impromtus...: je demande l'affichage de la qt dans une zone input et lorsque j'envoie le formulaire, la quantité redevient la quantité initiale... Ben oui.

J'y ai passé toute la journée hier, sans succès. A court d'aspirine, je vous envoie mon script pour que vous me le critiquiez: tout fonctionne sauf la partie if(isset($_POST("Modifier"))... Suit la méthode d'affichage, peut-être fautive aussi?
if(!isset($_SESSION['caddie'])) 
{ 
$_SESSION['caddie'] = array( 
"session"=> session_id(), 
"aujourdhui" => date("d-m-Y"), 
"produit" => array( 
"reference" => array(), 
"quantite" => array(), 
"prixunitaire" => array(), 
"prixactuel" => array(), 
"totalproduit" => array(), 
"acompteproduit" => array(), 
"soldeproduit" => array(), 
), 
"facture"=> array ( 
"total" => array( 
"total" => array(), 
"acompte" => array(), 
"solde" => array(), 
), 
"clients" => array( 
"nom" => array(), 
"prenom" => array(), 
"adresse" => array(), 
"codepostal" => array(), 
"batiment" => array(), 
"etage" => array(), 
"ville" => array(), 
"pays" => array(), 
"telephone" => array(), 
"email" => array(), 
) 
) 
); 
} 

require_once ('ref.php'); 
require_once ('refprod.php'); 

require_once ('deja.php'); 
// vérification de la présence du produit dans le panier//

if (isset($_POST["Commander"])){ 

if(!verif_panier($refprod)) 

{ 

array_push($_SESSION['caddie']['produit']['reference'], $refprod); 


$qt = $_POST["quantite"]; 

array_push($_SESSION ['caddie']['produit']['quantite'], $qt); 

require_once ('ac_px.php'); 

array_push($_SESSION['caddie']['produit']['prixunitaire'], $pu); 
array_push($_SESSION['caddie']['produit']['prixactuel'], $pa); 

require_once('montantprod.php'); 

$total_prod = total_prod(); 

array_push($_SESSION['caddie']['produit']['totalproduit'], $total_prod); 


require_once('acompteprod.php'); 

$acompte_prod = acompte_prod(); 

array_push($_SESSION['caddie']['produit']['acompteproduit'], $acompte_prod); 


require_once('soldeprod.php'); 

$solde_prod = solde_prod(); 

array_push($_SESSION['caddie']['produit']['soldeproduit'], $solde_prod); 

} 

} 


if (isset($_POST["Modifier"])) { 
require_once('verif_qt.php'); 

$refprod = $_SESSION['caddie']['produit']['reference']; 
$qt = $_POST["quantite"]; 

function modif_qte($refprod, $qt) 
{ 
$modifie = false; 
// verif_qt_art = vérification des quantités d'un produit appelée depuis verif_qt.php // 
if(verif_qt_art($refprod) != false && $qt != verif_qt_art($refprod)) 
{ 

/* Comptage des articles du panier */ 
$nb_articles = count($_SESSION['caddie']['produit']['reference']); 
/* Transfert du panier dans le panier temporaire */ 
for($i = 0; $i < $nb_articles; $i++) 
{ 

if($refprod == $_SESSION['caddie']['produit']['reference']) 
{ 
$_SESSION['caddie']['produit']['reference'] = $qt; 
$modifie = true; 
} 
} 
} 

} 

if (modif_qte($refprod, $qt) == true) 
{ 
array_push($_SESSION ['caddie']['produit']['quantite'], $_POST["quantite"]); 
} 
} 

require_once('coordclient.php'); 

require_once('Effacerpanier.php'); 

require_once('Effacerproduit2.php'); 
Et maintenant une partie de l'affichage du panier (ds le code html):
function recup_panier() 
{ 

$articles = 0; 

$articles = count($_SESSION['caddie']['produit']['reference']); 

for ($i = 0; $articles > $i; $i++) { 

$panier = '<form method="post" action="Panier.php"> 
<td align="center" colspan="6" style="text-align: left; vertical-align: middle; height: 40px;"> 

<span style="color: rgb(255, 255, 255); font-weight: bold;font-family: Optima;"> 

<b>'.$_SESSION['caddie']['produit']['reference'][$i].'</b> 
</span> 
</td>'; 
$panier .= '<td align="center" colspan="6" style="text-align: left; vertical-align: middle; height: 40px;"> 

<span style="color: rgb(255, 255, 255); font-weight: bold;font-family: Optima;"> 

<input value="'.$_SESSION['caddie']['produit']['quantite'][$i].'"maxlength="3" size="3" name="quantite"> 
.... 
} 

return $panier 

}


Alors???

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 sept. 2005, 09:53

Le problème est que ta fonction :
function modif_qte($refprod, $qt) 
{ 
.....
ne retourne pas de résultat. t'as oublié un
return $modifie;
à la fin de la fonction

Remarque: ça sert à rien d'envoyer ton message par deux fois. Une seule fois suffit. Si t'as pas de réponse tout de suite soit patient.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

26 sept. 2005, 10:13

Non, même en retournant cette variable ça ne fonctionne pas.
Est-il possible que le code confonde les 2 $qt = $_POST("quantite"): celui venant du formulaire de la page produit et celui du formulaire du panier lui-même?

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

26 sept. 2005, 11:04

Vérifie plutôt si l'exécution entre dans le test
if (isset($_POST["Modifier"])
avant de juger. Effectue pour cela un débogage en mettant une echo à l'intérieur du traitement de modification.
Si l'exécuteur n'entre pas dans le vrai du if, tu dois vérifier si il y a bien un bouton nommé "Modifier" dans le formulaire en respectant la casse.

Si tout est ok et que rien ne se passe, l'erreur peut se situer au niveau du test
// verif_qt_art = vérification des quantités d'un produit appelée depuis verif_qt.php // 
if(verif_qt_art($refprod) != false && $qt != verif_qt_art($refprod)) 
{..
 
Car à ce niveau il y'a 2 choses qui vont pas logiquement d'autant plus que je ne peux me prononcer sur le fonctionnement de la dite fonction vu qu'on voit pas son code.
De 1 : elle parrait retourner un true ou false et en même temps elle est comparée à la quantité, ceci est absurde
Et de 2: la fonction est appelée par deux fois dans la condition du if ce qui est déconseillé (double exécution = perte de temps)

Ce qui serait logique est de lui passer l'article et la quantité à vérifier et qu'elle retourne true ou false. Et dans ce cas un test de cette forme serait plutôt juste :
// verif_qt_art = vérification des quantités d'un produit appelée depuis verif_qt.php // 
if(verif_qt_art($refprod, $qt) != false) 
{ 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 150 Messages

26 sept. 2005, 11:54

Bon, après vérification, il y a bien un "Modifier", sans problème de casse.

Le test de bébogage me retourne la quantité envoyée depuis la page produit, soit $_POST("quantite"), et cette même quantité lorsque je tente la modification.

Voici le code de la fonction :
function verif_qt_art($refprod)
{ 
    /* On initialise la variable de retour */ 
    $nombre = false;
    /* Comptage du panier */ 
    $nb_art = count($_SESSION['caddie']['produit']['reference']);
   
    for($i = 0; $i < $nb_art; $i++)
    {
        if($_SESSION['caddie']['produit']['reference'][$i] == $refprod)
        {
        $nombre = $_SESSION['caddie']['produit']['quantite'][$i];
        }
    }
    return $nombre;
}