insérer un formulaire de calcule de mensualité

badibad
Invité n'ayant pas de compte PHPfrance

31 mai 2007, 15:36

re bonjour j"'espere que chez vous il y a un meilleur temp que chez moi
bon séreiux j'ai regarder de long en large le doc de oscommerce ms2 mais il y a rien qui y fait réference. mais en cherchent sur le faq du site je suis tomber sur ce code pour changer la langue
echo tep_draw_form('languages', 'orders.php', '', 'get'); ?>
   <?php echo tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onChange="this.form.submit();"'); ?>
donc c'est bien la preuve qu'elle doit etre utiliser

badibad
Invité n'ayant pas de compte PHPfrance

31 mai 2007, 17:16

<td align="right">
 <?php 
  $languages = tep_get_languages();
  $languages_array = array();
  $languages_selected = DEFAULT_LANGUAGE;
  for ($i = 0, $n = sizeof($languages); $i < $n; $i++) {
    $languages_array[] = array('id' => $languages[$i]['code'],
                               'text' => $languages[$i]['name']);
    if ($languages[$i]['directory'] == $language) {
      $languages_selected = $languages[$i]['code'];
    }
  }
   echo tep_draw_form('languages', 'orders.php', '', 'get'); ?>
   <?php echo tep_draw_pull_down_menu('language', $languages_array, $languages_selected, 'onChange="this.form.submit();"'); ?>
   </form>
   
   </td>
voici l'ensemble du code

badibad
Invité n'ayant pas de compte PHPfrance

31 mai 2007, 17:28

bon j'ai essayer ce code les mensualiter s'affiche correctement mais les montants ne change pas
echo tep_draw_pull_down_menu('mensualite', $mens_array, 'onChange="this.form1.submit();"'); 

Invité
Invité n'ayant pas de compte PHPfrance

01 juin 2007, 09:14

Quel talent :-* tu viens de mettre terme à notre dilème, j'en étais sûr qu'il était possible de passer les paramètres selected et l'évènement javascript à la fonction

Et en plus tu as bien apporté les changement nécessaires sauf que tu as écrit "form1" au lieu de "form" mais c'est pas grave

Je t'explique d'abord pourquoi il fallait écrire "this.form.submit()" au lieu de "this.form1.submit()"
Hé bien pour la simple raison que :
  • 1. "this" est un mot réservé dans la programmation javascript qui désigne un objet en cours (ici il désigne la liste déroulante sur laquelle est écrit le "onChange"
    2. "this.form" désigne l'objet formulaire "form" auquel appartien "this" (l'objet en question = la liste) le mot "form" désigne donc un objet formulaire et ce n'est pas le nom du formulaire mais tout le formulaire. On utilise "this.form" quand on connait le fils et on veut accèder à son parent sans savoir son nom.
    3. le mot "this.form.submit()" exécute alors le submit du formulaire qui contient l'objet qui déclenche cette exécution.
    "this.form" est une référence objet

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 juin 2007, 10:26

Heu, j'ai oublié de me connecter.
Je disais donc, tu n'as qu'a corriger ton onChange et rajouter la valeur selected aussi.
Seulement, je t'explique commen utiliser le selected dans notre programme:

Le paramètre selected requis par ta fonction n'est pas un booléen true/false mais la valeur à sélectionner dans le tableau des options "mens_array" qu'on a fourni à la fonction. ça doit être écrit comme ça:
Pour la valeur à sélectionner:
if ($_POST["mensualite"]==$row["valeur_mens"]) $mens_selected = $row["valeur_mens"];
et pour la liste:
echo tep_draw_pull_down_menu('mensualite', $mens_array, $mens_selected, 'onChange="this.form.submit();"');
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 juin 2007, 10:40

C'est encoe moi, je me suis permis d'écrire le programme de test suivant qui montre le résultat de notre code. Même si je n'est pas OsCommerce (que je ne connais pas d'ailleurs) j'ai créer les fonctions nécessaires, les constantes et la base de données et ça tourne comme du tonnere:
<?php
//constantes simulant celles de OsCommerce
define ("TABLE_MENSUALITES", "Mensualites");
define ("ENTRY_MENSUALITE", "Mensualité");
define ("ENTRY_MENSUALITE_TEXT", "*");
define ("ENTRY_TOTAL_MENSUALITE", "Montant");
define ("ENTRY_TOTAL_MENSUALITE_TEXT", "*");

//Connexion au serveur et la base de données "esinger"
tep_db_connect("localhost,root", "esinger");

//Requête SQL 
$mens_query = tep_db_query("select valeur_mens, montants from ".TABLE_MENSUALITES." order by valeur_mens"); 
//Lecture du résultat 
$mens_selected="";
$mens_array = array(); //pour la liste déroulante des mensualités
$i=0; //pour compter les enregistrements
while ($row = tep_db_fetch_array($mens_query)) { 
	//Remplir la liste des mensualités tout en sélectionnant celle déjà choisie ou par défaut la première
	if ($_POST["mensualite"]==$row["valeur_mens"]) $mens_selected = $row["valeur_mens"]; 	
	$mens_array[] = array('id' => $row["valeur_mens"], 'text' => $row["valeur_mens"]); 
   
    //Préparer la liste des montants de la mensualité choisie ou par défaut pour la première  
    if ( ($_POST["mensualite"] && $_POST["mensualite"] == $row["valeur_mens"]) 
	|| (!$_POST["mensualite"] && $i==0) ){
		$montants_array = array(); 
		$montants = explode(";" , $row["montants"]); //récup des montants séparés par ; 
    	//construction du tableau source de la liste déroulante 
    	$total_selected="";
		foreach ($montants as $un_montant){ 
			if ($_POST["total_mensualite"]==$un_montant) $total_selected = $un_montant;	 
    		$montants_array[] = array('id' => $un_montant, 'text' => $un_montant);  
    	} 
	}
	//compteur d'enregitrements
	$i++;
}//fin while
//afficher la mensulaité en cours 
?> 
<table><form name="form1" method="post">
<tr> 
  <td class="main"><?php echo ENTRY_MENSUALITE; ?></td> 
  <td class="main">
<?php 
echo tep_draw_pull_down_menu('mensualite', $mens_array, $mens_selected, 'onChange="this.form.submit();"');
if (tep_not_null(ENTRY_MENSUALITE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_MENSUALITE_TEXT . '</span>'; 
?>
  </td> 
  <td class="main"><?php echo ENTRY_TOTAL_MENSUALITE; ?></td> 
  <td class="main"> 
<?php                     
//afficher la liste déroulante de ses montants 
echo tep_draw_pull_down_menu('total_mensualite', $montants_array, $total_selected); 
if (tep_not_null(ENTRY_TOTAL_MENSUALITE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_TOTAL_MENSUALITE_TEXT. '</span>'; 
?> 
   </td>
</tr> 
</table></form>
<style>
.inputRequirement {color:red}
</style>
<?php 
//Fonctions simulant celles de OsCommerce
function tep_db_connect($server, $dbName){
	List($host, $userName, $password) = split(",|;|[ ]", $server);
	return $host&&$userName&&$dbName?mysql_connect($host, $userName, $password) && mysql_select_db($dbName):null;
}
function tep_db_query($sql){
	return $sql?mysql_query($sql):null;
}
function tep_db_fetch_array($result){
	return $result?mysql_fetch_array($result):null;
}
function tep_draw_input_field($name, $value="", $type="text", $Js_event=""){
	echo "<input type=\"$type\" name=\"$name\" value=\"$value\" $Js_event>";
}
function tep_draw_pull_down_menu($name, $options=array(), $selected_value="", $Js_event=""){
	echo "<select name=\"$name\" $Js_event>";
	if (is_array($options))foreach($options as $option){
		$if_selected = $option["id"]==$selected_value?" SELECTED ":"";
		echo "<option value=\"$option[id]\" $if_selected>$option[text]</option>";
	}
	echo "</select>";
}
function tep_not_null($value){
	return trim($value)!="" or $value!=null;
}
?>
Remarque: dans ce code je resélectionne aussi un montant déjà choisi avant un changement de mensualité du coup le programme trouve automatiquement le montant en commun entre les mensualités changées
Modifié en dernier par sadeq le 01 juin 2007, 13:12, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

badibad
Invité n'ayant pas de compte PHPfrance

01 juin 2007, 11:35

yyyyyyyyyyooooooooouuuuuuupppppiiiiiii ca marche merci mille fois :D :D :D :P :P


je n'y serais jamais arriver sans toi si tu passe dans l'ain près de oyonnax fait moi plaisir passe au mag je te payerai le cafe (ou tee)(ou autre)


par contre ca marche vu que ca me reactualise la page ca me mais des erreur du type ( vous n'avai pas selectionner le nom par exemple)

foudrais que je désactiver les erreur de champ quand les client sont en train de selectionner les mensualiter

et merci mille fois

badiabd
Invité n'ayant pas de compte PHPfrance

01 juin 2007, 11:58

j'ai esayer le nouveaux code que tu à fait mais il marche pas donc on va pas s'enbete j'ai mis l'encien et ca marche a par ce léger probleme de signalisation d'erreur a chaque fois qu'on change de mensualité

en tout cas merci mille fois et n oublie pas si tu passe je te payerai à manger pour te remercier.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 juin 2007, 12:43

Merci pour ta gentillesse, le plaisir était pour moi :wink:

Concernant ta remarque:
par contre ca marche vu que ca me reactualise la page ca me mais des erreur du type ( vous n'avai pas selectionner le nom par exemple)

foudrais que je désactiver les erreur de champ quand les client sont en train de selectionner les mensualiter
C'est normal, puisque ta liste mensualité provoque un submit de tout le formulaire, mais il y a une solution pour ne pas t'embêter à désactiver les erreurs:
Il faut t'appuyer sur le bouton de validation du formulaire général (je pense qu'il y en a un) hé bien ce bouton doit avoir un nom par exemple "action" et une valeur par exemple "Valider"
Ainsi, pour que ton programme sache quel objet submit a déclenché l'envoi, il peut tester dans le postage $_POST si le paramètre "action" contient la valeur "Valider" alors le formulaire est finalisé comme le montre cet algorithme
if ($_POST("action"] == "Valider") {
     //traiter le formulaire finalisé
}
Sinon si le submit est déclenché par le onChange de la liste mensualité le paramètre "action" ne contiendra rien et à ce moment là le programme exécute notre fameux code de remplissage des listes

En l'occurence, le remplissage des listes doit se faire par défaut au début mais le traitement du formulaire finalisé ne doit se faire que si action = Valider :wink:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 juin 2007, 13:09

Voici donc le dernier test fonctionnel avec le script SQL de la base de test:
Le code à tester sur un localhost sans avoir besoin de OsCommerce.
<?php
//constantes
define ("TABLE_MENSUALITES", "Mensualites");
define ("ENTRY_MENSUALITE", "Mensualité");
define ("ENTRY_MENSUALITE_TEXT", "*");
define ("ENTRY_TOTAL_MENSUALITE", "Montant");
define ("ENTRY_TOTAL_MENSUALITE_TEXT", "*");
define ("ENTRY_NOM_PRENOM", "Nom & Prénom");
define ("ENTRY_NOM_PRENOM_TEXT", "*");

//Connxion au serveur et la base de données "esinger"
tep_db_connect("localhost,root", "esinger");

//Requête SQL 
$mens_query = tep_db_query("select valeur_mens, montants from ".TABLE_MENSUALITES." order by valeur_mens"); 
//Lecture du résultat 
$mens_selected="";
$mens_array = array(); //pour la liste déroulante des mensualités
$i=0; //pour compter les enregistrements
while ($row = tep_db_fetch_array($mens_query)) { 
	//Remplir la liste des mensualités tout en sélectionnant celle déjà choisie ou par défaut la première
	if ($_POST["mensualite"]==$row["valeur_mens"]) $mens_selected = $row["valeur_mens"]; 	
	$mens_array[] = array('id' => $row["valeur_mens"], 'text' => $row["valeur_mens"]); 
   
    //Préparer la liste des montants de la mensualité choisie ou par défaut pour la première  
    if ( ($_POST["mensualite"] && $_POST["mensualite"] == $row["valeur_mens"]) 
	|| (!$_POST["mensualite"] && $i==0) ){
		$montants_array = array(); 
		$montants = explode(";" , $row["montants"]); //récup des montants séparés par ; 
    	//construction du tableau source de la liste déroulante 
    	$total_selected="";
		foreach ($montants as $un_montant){ 
			if ($_POST["total_mensualite"]==$un_montant) $total_selected = $un_montant;	 
    		$montants_array[] = array('id' => $un_montant, 'text' => $un_montant);  
    	} 
	}
	//compteur d'enregitrements
	$i++;
}//fin while

//Validation du formulaire
if ($_POST["action"]=="Valider"){
	//traitement du formulaire finalisé
	echo "<pre><h1>Vous avez envoyé les données suivantes:</h1>";
	print_r($_POST);
	echo "</pre>";
}

//Afficher le formulaire
?> 
<table><form name="form1" method="post">
<tr> 
  <td class="main"><?php echo ENTRY_NOM_PRENOM; ?></td> 
  <td class="main">
<?php 
//Afficher la zone de saisie nom_prenom
echo tep_draw_input_field('nom_prenom', $_POST["nom_prenom"]?$_POST["nom_prenom"]:"");
if (tep_not_null(ENTRY_NOM_PRENOM_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_NOM_PRENOM_TEXT . '</span>'; 
?>
  </td>
</tr>
<tr> 
  <td class="main"><?php echo ENTRY_MENSUALITE; ?></td> 
  <td class="main">
<?php 
echo tep_draw_pull_down_menu('mensualite', $mens_array, $mens_selected, 'onChange="this.form.submit();"');
if (tep_not_null(ENTRY_MENSUALITE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_MENSUALITE_TEXT . '</span>'; 
?>
  </td> 
  <td class="main"><?php echo ENTRY_TOTAL_MENSUALITE; ?></td> 
  <td class="main"> 
<?php                     
//afficher la liste déroulante de ses montants 
echo tep_draw_pull_down_menu('total_mensualite', $montants_array, $total_selected); 
if (tep_not_null(ENTRY_TOTAL_MENSUALITE_TEXT)) echo '&nbsp;<span class="inputRequirement">' . ENTRY_TOTAL_MENSUALITE_TEXT. '</span>'; 
?> 
   </td>
</tr> 
<tr> 
  <td class="main" colspan="2">
<?php 
//Afficher le bouton de validation du form
echo tep_draw_input_field('action', 'Valider', 'submit');
?> 
  </td> 
</tr>
</table></form>
<style>
.inputRequirement {color:red}
</style>
<?php 
//Fonctions
function tep_db_connect($server, $dbName){
	List($host, $userName, $password) = split(",|;|[ ]", $server);
	return $host&&$userName&&$dbName?mysql_connect($host, $userName, $password) && mysql_select_db($dbName):null;
}
function tep_db_query($sql){
	return $sql?mysql_query($sql):null;
}
function tep_db_fetch_array($result){
	return $result?mysql_fetch_array($result):null;
}
function tep_draw_input_field($name, $value="", $type="text", $Js_event=""){
	echo "<input type=\"$type\" name=\"$name\" value=\"$value\" $Js_event>";
}
function tep_draw_pull_down_menu($name, $options=array(), $selected_value="", $Js_event=""){
	echo "<select name=\"$name\" $Js_event>";
	if (is_array($options))foreach($options as $option){
		$if_selected = $option["id"]==$selected_value?" SELECTED ":"";
		echo "<option value=\"$option[id]\" $if_selected>$option[text]</option>";
	}
	echo "</select>";
}
function tep_not_null($value){
	return trim($value)!="" or $value!=null;
}
?>
Le script SQL de la base de données de text nommée "esinger"

Code : Tout sélectionner

-- -- Base de donnéees: `esinger` -- CREATE DATABASE `esinger`; -- -------------------------------------------------------- -- -- Structure de la table `mensualites` -- CREATE TABLE `mensualites` ( `valeur_mens` float default NULL, `montants` varchar(255) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -- Contenu de la table `mensualites` -- INSERT INTO `mensualites` (`valeur_mens`, `montants`) VALUES (15, '75;270;100;110;130;140'), (25, '100;120'), (35, '140;170;200');
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

badibad
Invité n'ayant pas de compte PHPfrance

01 juin 2007, 13:51

Rebonjour bon j'ai bien créer une nouvelle base mais aparament le deux ne ce suporte pas car j'ai cette erreur
Fatal error: Cannot redeclare tep_db_connect() (previously declared in /home/WwwBSD/esinger.fr/createPOaccount.php:1290) in /home/WwwBSD/esinger.fr/includes/functions/database.php on line 13
voici la ligne 1290
function tep_db_connect($server, $dbName){ 
aparament je ne peux pas apeller deux bases en même temp car au debut j'ai require aplication top qui renvoi vers le fichier database et ce fichier sert à ce connect à la base esinger

merci beaucoup

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

01 juin 2007, 19:58

Ah Non, ne fais pas le test sur ton application actuelle pour ne pas la corrompre. Je l'ai écrit comme ça pour les gens qui veulent tester sans avoir OsCommerce d'installer.

Si toute fois, tu veux le faire, il faut le faire sur un environnement local type WAMP ou EASYPHP avec une base Mysql.

Mais ce n'est pas la peine si t'as compris ce qu'il faut mettre sur ton projet actuel. Je t'ai suggérer simplement de rajouter le test
if ($_POST["action"] == "Valider") {
   //ici tu mets le programme qui traite et enregistre le formulaire définitivement
}
où "action" doit être le nom du bouton de validation du formulaire et "Valider" est sa valeur.

Puisque ce qu'on fait jusqu'alors fonctionne bien, tu en reste là. Mais il faut surtout pas toucher à ta base de données réelle ni à ton programme.

PS: N'oublie pas de t'inscrire sur le forum, ne reste pas invité, tu peux alors modifier et suivre tes messages et surtout mettre "Résolu" sur ton message quand ton problème est résolu.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

badibade
Invité n'ayant pas de compte PHPfrance

02 juin 2007, 22:04

salut tous le monde

j'ai ouvert un nouveaux sujet car j'ai des probleme avec le action value

merci

ps j'ai ouvert un compte j'ai esayer de me connecter mais ca marche pas


merci baucoup

ViPHP
ViPHP | 5924 Messages

03 juin 2007, 01:52

ps j'ai ouvert un compte j'ai esayer de me connecter mais ca marche pas
Quand tu crées un compte, tu recois un mail d'activation dans lequel il y a un lien que tu dois cliquer pour activer ton compte...

Eléphant du PHP | 56 Messages

03 juin 2007, 12:48

bonjour et merci

en effet qu'est ce que je peut etre bete quand je mis met

pour ma defence je venais juste de me reveiller :D :D :D