calcul transport

Eléphant du PHP | 297 Messages

09 sept. 2006, 00:47

Bonjour,
J'ai bien cherché partout, mais pas trouvé de soluce ou d'exemple...
Je souhaite calculer le cout du transport d'une commande.
J'ai le poids total de la commande, et les tarifs poids par intervale de 500grs en fonction de la destination (5 zones).
Je voudrais bien mettre ca en pratique sur ma page mais je vois pas trop comment faire.
J'ai commencé par faire un formulaire, avec une liste pays et un bouton calculer :) je suis comme on dirait bloqué !!
si quelqu'un peut m'aider
merci

Eléphant du PHP | 337 Messages

09 sept. 2006, 04:44

J'ai pour ma part utilisé un système de tableaux qui calcule le tarif en fonction de la destination et du poids du colis ou de la lettre à envoyer.

Le voici :

Code : Tout sélectionner

$POIDS_LETTRE = array(1 => '20' , '50' , '100' , '250' ); $TARIF_LETTRE = array( 'F' => array(1 => '00.53' , '00.82' , '01.22' , '01.98' ), 'X' => array(1 => '00.53' , '01.07' , '01.72' , '03.23' ), 'Y' => array(1 => '00.53' , '01.37' , '02.32' , '04.73' ), 'A' => array(1 => '00.55' , '01.20' , '01.75' , '05.40' ), 'B' => array(1 => '00.75' , '01.95' , '02.40' , '05.80' ), 'C' => array(1 => '00.90' , '02.40' , '03.20' , '07.20' ) ); $POIDS_COLIS = array(1 => '500' , '1000' , '2000' , '3000' , '5000' ); $TARIF_COLIS = array( 'F' => array(1 => '05.10' , '06.20' , '07.00' , '08.00' , '10.00' ), 'X' => array(1 => '08.00' , '11.90' , '16.20' , '20.50' , '29.10' ), 'Y' => array(1 => '09.20' , '14.20' , '25.60' , '37.00' , '59.80' ), 'A' => array(1 => '15.00' , '15.00' , '16.50' , '20.10' , '27.30' ), 'B' => array(1 => '18.20' , '18.20' , '20.00' , '24.00' , '33.00' ), 'C' => array(1 => '21.00' , '21.00' , '28.00' , '37.00' , '55.00' ), 'D' => array(1 => '24.00' , '24.00' , '36.00' , '48.00' , '72.00' ) );
Les variables $POIDS_LETTRE et $POIDS_COLIS délimitent les tranches de poids selon que c'est un colis ou une lettre (on s'en serait douté !), et les variables $TARIF_COLIS et $TARIF_LETTRE donnent les prix correspondant selon les zones d'envoi. En l'occurrence :

- F : France
- X : DOM
- Y : TOM
- A,B,C,D : les diverses zones tarifaires

Ces informations ont été extraites des tarifs actuels pratiqués par la Poste.

En marge de ces infos, j'ai une table sql contenant les pays du monde, avec les zones qui leur correspondent selon qu'il s'agit d'une lettre ou d'un colis : au moment du calcul, je n'ai qu'à interroger la base de donnée pour récupérer la zone correspondant au pays, et ensuite trouver le prix selon qu'il s'agit d'une lettre, d'un colis, et du poids de l'envoi.

Si ça intéresse quelqu'un, je peux mettre à disposition une sauvegarde de cette table...

Exemple concret :

Un client passe une commande sur mon site : il en a pour 240 grammes de produits, avec un encombrement qui nécessite un colis. Il vit en Algérie.

1 - Je récupère dans ma base de donnée la zone correspondant aux colis envoyés en Algérie : c'est la zone B

2 - Je détermine dans quelle tranche de poids se situe mon colis avec la variable $POIDS_COLIS. En l'occurrence, c'est la tranche 1

3 - Je trouve le tarif correspondant en récupérant la valeur de $TARIF_COLIS[B][1], soit 18.20 €

Eeeuh voilà, j'espère avoir été clair : )

Eléphant du PHP | 297 Messages

09 sept. 2006, 15:57

salut Finipe,
merci ! c'est exactement ce que je cherche.
J'ai intégré ton tableau à ma page avec les tarfis de mon transporteur.
Par contre vu que je ne manipule pas le php suffisament, j'ai un peu de mal pour ecrire les lignes de code.
En ce qui concerne les pays je compte utliser un menu deroulant en attribuant un code dans valeur en fonction de leurs zones.
Et j'imagine que pour le poids il faut que j'ecrive des lignes code pour faire une comparaison entre le poids déterminé de mon colis et determiner dans tranche il se trouve !?
Voila si tu peux encore m'aider sur ça...
merci

Eléphant du PHP | 297 Messages

09 sept. 2006, 23:51

:) eh bien après une qlqs heures de recherche, j'ai réussi à écrire un code qui me sort une variable avec la tranche de poids ou je me trouve !!

En ce qui concerne la zone géographique suivant le pays...je coince !!

J'ai rangé tout ça dans un menu deroulant qui se trouve dans un champ formulaire :

Code : Tout sélectionner

<form action="panier.php" method="get" name="transport" id="transport"> <div align="center"> <table width="100%" border="0" align="center" cellspacing="0"> <tr> <td width="25%"><div align="center"> <select name="zone" id="zone"> <option value="AMS">Argentine</option> <option value="AMN">Canada</option> <option value="ASI">Chine</option> <option value="EUR">Espagne</option> <option value="AMN">Etats Unis</option> <option value="EUR" selected>France</option> <option value="EUR">Italie</option> <option>Choisissez</option> </select> </div></td> <td width="25%"><div align="center"> <input name="zonepays" type="submit" id="zonepays" value="CALCULER">
et je voudrais apres selection d'un pays memoriser dans une variable la valeur en fonction du pays (EUR ou AMN...) et conserver aussi ce choix visible dans ce menu deroulant...

voila, si une bonne ame veut bien me filer un coup de main...merci :)

Eléphant du PHP | 337 Messages

10 sept. 2006, 11:34

Tu peux réutiliser le principe du tableau. Moi j'ai opté pour une table sql, mais le tableau pourrait tout autant faire l'affaire. Ça donnerait qqchose dans ce goût-là :

Code : Tout sélectionner

$ZONE_PAYS = array( 'FR' => 1, 'US' => 2, 'BE' => 1, 'DE' => 1, 'UK' => 1, 'CA' => 2 );
(les zones indiquées dans l'exemple sont sans doute fausses, je ne suis pas chez moi 8))

Etc... il faudrait assigner à chaque pays, selon son code ISO3166, la zone tarifaire correspondant : ce sera sans doute un peu fastidieux, mais une fois que c'est fait, ça n'a pas de raison de changer par la suite.

Enfin, pour récupérer la valeur des Etats-Unis par exemple, tu passes par $ZONE_PAYS['US']. Et donc dans un traitement automatisé, si tu as affiché le pays dans un champ de type <select>, tu retrouveras ta valeur en utilisant quelque chose du genre :
$zone = $ZONE_PAYS['".$_POST['zone']."']
...ceci dans le cas où ton formulaire a été posté bien sûr.

Voilà voilà ! : )

Eléphant du PHP | 297 Messages

10 sept. 2006, 16:50

merci...
j'y suis presque ! dernier petit probleme,
conserver la liste de menu deroulant sur le pays choisi lorsque le visiteur
navigue sur le site et revient sur la page.
Vu que je mémorise le choix dans la variable $pays, j'ai essayé sur deux pays de mon menu comme ceci :

Code : Tout sélectionner

<select name="zone" id="zone"> <option value="Argentine"<?php if ($pays=Argentine) echo "SELECTED"; ?>>Argentine</option> <option value="Canada"<?php if ($pays=Canada) echo "SELECTED"; ?>>Canada</option> <option value="Chine">Chine</option> <option value="Europe">Espagne</option> <option value="Etats Unis">Etats Unis</option> <option value="France">France</option> <option value="Italie">Italie</option> <option selected>Choisissez</option> </select>
mais ca ne le garde pas en position !!!

Eléphant du PHP | 337 Messages

10 sept. 2006, 21:44

Si tu veux garder la valeur de ta variable sur plus d'une page, il faut que tu stockes l'information dans une variable de session.

Donc quand tu postes ton formulaire, lors du traitement, tu mets un truc du genre :

Code : Tout sélectionner

$_POST['pays'] = $_SESSION['pays'];
Puis, quand dans 1, 2 ou 10 pages plus loin tu dois ressortir ta liste déroulante avec le pays choisi déjà sélectionné, alors tu "construis" ton select comme ceci :
/* Dans cet exemple, je suppose que la liste des pays est stockée
dans une variable de type tableau à 2 dimensions du nom de
$LISTE_PAYS, mais tu peux très bien avoir choisi une autre solution... */

echo "<select name='pays'>";
for($i=0 ; $i<sizeof($LISTE_PAYS) ; $i++)
{
    echo "<option value='".$LISTE_PAYS[$i]['valeur']."'";
    if($_SESSION['pays'] == $LISTE_PAYS[$i]['nom']) echo " selected";
    echo ">".$LISTE_PAYS['nom']."</option>";
}
echo "</select>";
En gros tu lances une boucle qui construit toutes les options de ton champ select, et à chaque itération, tu demandes "Si la variable de session est égale à la valeur de l'option pour cette itération, alors j'ajoute 'selected' dans cette option."

Voilà !

Eléphant du PHP | 297 Messages

11 sept. 2006, 22:57

salut Finipe,
encore merci :wink:
voila, j'ai un peu de mal avec le tableau 2 dimensions,
alors j'ai fouiné sur le forum, j'ai essayé pas mal de truc mais ca marche pas... :cry:
voici mon tableau

Code : Tout sélectionner

$LISTE_PAYS = array ( array ("nom"=>"", "valeur"=>"") ); //c'est un array de array (tableau dans un autre) ou tableau à deux dimensions //remplir la première ligne $LISTE_PAYS[0]["nom"] = "Angleterre"; $LISTE_PAYS[0]["valeur"] = "Angleterre"; //remplir la deuxième ligne $LISTE_PAYS[1]["nom"] = "Argentine"; $LISTE_PAYS[1]["valeur"] = "Argentine";
est-ce que ca vient de la ?
en fait ma liste deroulante reconnait bien qu'il y a deux etages, mais n'affiche rien d'autre...
merci

Eléphant du PHP | 337 Messages

12 sept. 2006, 00:38

Code : Tout sélectionner

$LISTE_PAYS = array( array('nom' => 'Allemagne' , 'valeur' => 'DE'); array('nom' => 'Angleterre' , 'valeur' => 'UK'); array('nom' => 'Belgique' , 'valeur' => 'BE'); array('nom' => 'Etats-Unis' , 'valeur' => 'US'); array('nom' => 'France' , 'valeur' => 'FR'); etc... array('nom' => 'Zimbabwé' , 'valeur' => 'ZW'); );
Avec ça, ça devrait aller normalement.

Ainsi, si on décompose ta variable $LISTE_PAYS, on trouve :

$LISTE_PAYS[0] --> correspond à : array('nom' => 'Allemagne' , 'valeur' => 'DE')
>> $LISTE_PAYS[0]['nom'] --> correspond à : 'Allemagne'
>> $LISTE_PAYS[0][valeur] --> correspond à : 'DE'

$LISTE_PAYS[1] --> correspond à : array('nom' => 'Angleterre' , 'valeur' => 'UK')
>> $LISTE_PAYS[1]['nom'] --> correspond à : 'Angleterre'
>> $LISTE_PAYS[1][valeur] --> correspond à : 'UK'

...et ainsi de suite, jusqu'à l'index $i :

$LISTE_PAYS[$i] --> correspond à : array('nom' => 'Zimbabwé' , 'valeur' => 'ZW')
>> $LISTE_PAYS[$i]['nom'] --> correspond à : 'Zimbabwé'
>> $LISTE_PAYS[$i][valeur] --> correspond à : 'ZW'

C'est là que la boucle for se révèle très pratique pour construire ta liste déroulante, car tu peux facilement énumérer l'index de ton tableau. Et pour récupérer le nombre d'éléments de ton tableau, il suffit donc d'utiliser sizeof($LISTE_PAYS).

Voilà : )

Edition après relecture : j'ai vu qu'avant je t'avais suggéré de faire une variable $ZONE_PAYS donnant la zone géographique tarifaire d'un pays selon son code... Il serait judicieux d'inclure cette information dans ta variable $LISTE PAYS... Ça rajouterait simplement, pour chaque pays, une 3ème valeur en plus de 'nom' et 'valeur', qui se nommerait 'zone' par exemple.

Code : Tout sélectionner

$LISTE_PAYS = array( array('nom' => 'Allemagne' , 'valeur' => 'DE' , 'zone' => 1); array('nom' => 'Angleterre' , 'valeur' => 'UK' , 'zone' => 1); array('nom' => 'Belgique' , 'valeur' => 'BE' , 'zone' => 1); array('nom' => 'Etats-Unis' , 'valeur' => 'US' , 'zone' => 2); array('nom' => 'France' , 'valeur' => 'FR' , 'zone' => 1); etc... array('nom' => 'Zimbabwé' , 'valeur' => 'ZW' , 'zone' => 3); );
(encore une fois, les zones indiquées sont fantaisistes)

Eléphant du PHP | 297 Messages

12 sept. 2006, 11:20

salut,
désolé, j'ai toujours un ti probleme...
les données dans ma liste de selection ne sont pas visibles !!
par contre elles existent car j'ai fait des test d'affichages de variables en fonction du choix de la selection dans la liste et ca marche. ca me donne par exemple mon cout de transport...
le probleme donc cest que ma liste de selection affiche des données invisibles... :cry:
merci

Eléphant du PHP | 337 Messages

12 sept. 2006, 18:59

Je comprends pas trop ton problème... Peux-tu mettre les morceaux de code en question ?

Eléphant du PHP | 297 Messages

12 sept. 2006, 22:20

salut,
ben le seul probleme c'est que la liste deroulante n'affiche rien de visible...
lorsque je "la deroule", c'est blanc ! mais elle tient compte de la valeur du blanc que je vais selectionner :lol: car j'ai fait une variable et je l'affiche pour tester et ca m'affiche bien le nom.
voici mon tableau

Code : Tout sélectionner

$LISTE_PAYS = array( array('nom' => 'Allemagne' , 'valeur' => 'DE'), array('nom' => 'Angleterre' , 'valeur' => 'UK'), array('nom' => 'Belgique' , 'valeur' => 'BE'), array('nom' => 'Etats-Unis' , 'valeur' => 'EU'), array('nom' => 'France' , 'valeur' => 'FR'),
et ma liste deroulante integrée a un formulaire
<form action="panier.php" method="post" name="transport" id="transport">
                              <div align="center">
                                <table width="100%"  border="0" align="center" cellspacing="0">
                                  <tr>
                                    <td width="25%"><div align="center">
									<?php /* Dans cet exemple, je suppose que la liste des pays est stockée 
                                     dans une variable de type tableau à 2 dimensions du nom de 
                                     $LISTE_PAYS, mais tu peux très bien avoir choisi une autre solution... */ 

                            echo "<select name='pays'>"; 
                            for($i=0 ; $i<sizeof($LISTE_PAYS) ; $i++) 
                                { 
                            echo "<option value='".$LISTE_PAYS[$i]['valeur']."'"; 
                            if($_SESSION['pays'] == $LISTE_PAYS[$i]['valeur']) echo "selected"; 
                            echo ">".$LISTE_PAYS['nom']."</option>"; 
                                } 
                            echo "</select>";?>

                             <?php
					  $pais = $_POST['pays'];
					  $zone = $ZONE_PAYS[$pais];
					  $total2=$TARIF_COLIS[$zone][$tranchepoids]*0.8;
 		              $total3=($TARIF_COLIS[$zone][$tranchepoids]*0.8) + $total;
                      
					  $_SESSION['pays']=$pais;//mAj du pays de livraison
					  $_SESSION['zone']=$zone;//mAj de la zone de livraison
                      $_SESSION['total2']=$total2;//mAj du total2 dans la session
					  $_SESSION['total3']=$total3;//mAj du total3 dans la session
                   ?>           
                                    </div></td>
                                    <td width="25%"><div align="center">
                                        <input name="zonepays" type="submit" id="zonepays" value="CALCULER">
merci :?

Eléphant du PHP | 337 Messages

12 sept. 2006, 23:11

Héhé oui, ce n'est pas surprenant : si ta liste est "blanche", c'est que c'est le nom du pays qui n'est pas correctement affiché. Il faut donc voir dans ton code à quel moment ce nom est censé être affiché, et c'est précisément ici :
echo ">".$LISTE_PAYS['nom']."</option>";
Or il se trouve que tu as oublié quelque chose : ce n'est pas $LISTE_PAYS['nom'] qu'il faut indiquer, mais $LISTE_PAYS[$i]['nom']

Tu as oublié l'index de ton tableau :wink:

Eléphant du PHP | 297 Messages

12 sept. 2006, 23:39

:D ca y'est !! tout fonctionne au poil !!
je suis super content ! merci mille fois Finipe :wink:

Eléphant du PHP | 337 Messages

13 sept. 2006, 00:39

Ah ben ça fait plaisir ^^