THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Salut

Encore une question, cette fois-ci je ne comprend pas la logique de compte_modifiererr.html dans la template Thelia. Quand on est loggé sur son compte et qu'on clique sur "mon compte" puis sur "modifier mes coordonnées" on arrive sur une page compte_modifier.html.

Mettons que je clique sur le premier "valider" sous les deux champs qui donnent la possibilité de changer le mot de passe, sans rien entrer dans ces champs ou en faisant volontairement une erreur (- de 6 car ou 2 mots de passe différents). On se retrouve sur une page compte_modifiererr.html qui signale l'erreur mais qui demande maintenant "Mon email" et "mon mot de passe".

Et là, que doit-on faire ? si on saisit effectivement le email et le bon mot de passe on reste sur le même ecran sans message d'erreur à ce niveau, on ne sait pas vraiment ce qu'on doit faire ... on arrive à revenir à l'écran de modif des mots de passe en refaisant tout le chemin ci-dessus, mais je dois avouer que je ne comprends pas la logique. Pour moi, si erreur sur le mot de passe (- de 6 carac ou discordance) on devrait se retrouver sur un écran qui demande de recommencer la saisie de 2 mots de passe ...

Je pose cette question mais je commence à douter car après 2 jours de dev, je commence à coincer dans tous les coins, sur des pbms qui me paraissent basiques mais dont je ne vois pas la solution. On peut effectivement se replonger dans le code (j'ai déjà été assez loin pour mon pbm non résolu de livraison_modifier), mais bon, le but d'utiliser ce genre d'outil c'est justement d'éviter ça. Je précise que je conduis tous les tests sur les templates de Thelia en parallèle des miennes, donc pour l'instant j'écarte mes erreurs !
Je serai même prêt à envisager du support payant s'il existe pour éviter de coincer bêtement, c'est dire à quel point je prend au sérieux le travail d'Octolys sur le sujet ... en plus j'ai pas l'impression qu'une formation changerait grand chose, j'ai plus un problème de bugs ou de mauvaise compréhension de points très spécifiques.

Enfin bref, si quelqu'un voit les mêmes pbms que moi, ça m'intéresse, au moins je saurai que c'est pas moi le pbm !

Offline


Non Pierrot, je ne pense pas que ce soit toi le problème ! Le traitement des formulaires et des erreurs d'entrée est assez déroutant, notamment lorsque l'on veut modifier son mot de passe, comme tu l'indiques en exemple. D'ailleurs si la modification du mot de passe s'est déroulée avec succès, aucun message ne le signale à l'utilisateur, ce qui est perturbant aussi.

Je pense, pour plus de logique, qu'il faudrait modifier le template "compte_modifiererr.html" en remplaçant le couple "mon email/mot de passe" du 1er form par le code html du 1er formulaire du template "compte_modifier.html". A tester...

Offline


Oui,
Il y a effectivement un côté déroutant dans la logique des fichiers d'erreurs. J'ai fait la remarque à YOAN, en lui demandant à quel niveau il faut intervenir pour effectuer son propre chemin. Donc j'ai modifié le fichier action.php, c'est vers la fin du fichier qu'il faut modifier la redirection en cas d'erreur dans la modification du mot de passe. Ensuite j'ai créé mon propre fichier d'erreur. Allez vous en avez pour 3 minutes pour modifier cela, courage. Il faut savoir que dans la structure des templates de base, si les mdp sont bons on est redirigé sur la dernière page consultée (pas sur mais presque).

Offline


Voici, à titre indicatif, une manière de séparer le formulaire de modification du mot de passe, du formulaire de changement de coordonnées.

Avantage : le processus est plus clair, mieux cadré pour le client
Inconvénient : il faut intervenir dans le code de Thelia, ce qui est assez contraignant vis-à-vis des mises à jour futures

1. Créer les fichiers suivants :

- mdp_modifier.php
- mdp_modifier.html (formulaire initialement présent dans le template compte_modifier.html)

- mdp_modifiererr.php
- mdp_modifiererr.html (reprise du formulaire + message d'alerte indiquant que le client a fait une erreur)

- mdp_modifierok.php
- mdp_modifierok.html (comportant un message convivial indiquant que la modification du mot de passe s'est bien déroulée)

2. Dans action.php, ajouter à la fin du fichier la fonction suivante :

	function mychmdp($motdepasse1, $motdepasse2) {
		$client = New Client();
		$client->charger_id($_SESSION['navig']->client->id);
		if ( $motdepasse1 == $motdepasse2 && strlen($motdepasse1)>5 ) {		
			$client->motdepasse = $motdepasse1;
			$client->crypter();
			$client->maj();
			$_SESSION['navig']->client = $client;	
			redirige("mdp_modifierok.php");	
		} else  {
			$_SESSION['navig']->formcli->motdepasse = "";
			redirige("mdp_modifiererr.php");
		}
	}

3. Dans moteur.php, dans la partie :

// Actions
switch($action){
...

ajouter la ligne :

case 'mychmdp' : mychmdp($motdepasse1, $motdepasse2); break;

et enfin dans les formulaires des templates mdp_modifier.html et mdp_modifiererr.html, remplacer "modifiercompte" par "mychmdp" :

	<p><input type="hidden" name="action" value="mychmdp" /></p>

Offline


Mci, la modif marche bien. J'ai d'ailleurs poussé le concept en créant aussi un compte_modifierok.php/html pour appliquer le même principe à la modif de compte, avec modif supplémentaire dans le redirige de action.php.

Ca fait bcp de fichiers pour de simples modifs de mot de passe et de comptes ... ajax serait peut-être la solution.
Pierre.

Offline


pierrot wrote:

Mci, la modif marche bien. J'ai d'ailleurs poussé le concept en créant aussi un compte_modifierok.php/html pour appliquer le même principe à la modif de compte, avec modif supplémentaire dans le redirige de action.php.

Ca fait bcp de fichiers pour de simples modifs de mot de passe et de comptes ... ajax serait peut-être la solution.
Pierre.

Ajax ne changera rien. Ca ne servira qu'à enrichier l'expérience utilisateur, de manière à éviter 4 rechargements de pages parce qu'il existe une erreur dans le formulaire smile

Offline


En Ajax je pense qu'on pourrait tout traiter depuis un seul fichier php plutôt que 3 ... bien sûr en contrepartie il faudrait un traitement ajax.
Pierre.

Offline


Perso, j'ai repris le concept de Cecile et ai ajouté le souhait de pierrot, ce qui donne...

1/ j'ai créé un fichier password-change.php et password-change.html qui gèrent les 3 cas de figure (étati initial, erreur et confirmation) dont voici le code:

<?php
if ( (isset($_GET['error'])) && ($_GET['error'] == '1') ) {
	echo '<p class="formError">'.LBL_MODIFIERPASSWORD_ERROR1.'</p>';
}
if ( (isset($_GET['error'])) && ($_GET['error'] == '2') ) {
	echo '<p class="formError">'.LBL_MODIFIERPASSWORD_ERROR2.'</p>';
}
if ( (isset($_GET['ok'])) && ($_GET['ok'] == '1') ) {
	echo '<p class="formSuccess">'.LBL_MODIFIERPASSWORD_OK.'</p>';
}
?>

<form action="moncompte.php" method="post" name="formulaire" id="formulaire">
<input type="hidden" name="action" value="GiB_passwordChange" />
<fieldset>
	<legend><?php echo LBL_MODIFIERPASSWORD;?></legend>
	<table class="formConnexion">
		<tr>
			<td><label for=""><label for="motdepasse1"><?php echo LBL_NEWPASSWORD;?></label></td>
			<td><input name="motdepasse1" id="motdepasse1" type="password" /></td>
		</tr>
		<tr>
			<td><label for="motdepasse2"><?php echo LBL_NEWPASSWORDCONFIRM;?></label></td>
			<td><input name="motdepasse2" id="motdepasse2" type="password" /></td>
		</tr>
	</table>
	<div align="right"><a href="javascript:document.getElementById('formulaire').submit()" class="btnValider"><?php echo LBL_VALIDER;?></a></div>
</fieldset>
</form>

Tout ce qui est en MAJUSCULE sont des constantes définies à part à l'aide de define(), c'est ma manière de gérer le multi-lingue avec un seul squelette.

Bien sûr, pour que le PHP soit interprété / évalué j'ai $parsephp = 1 dans le password-change.php

Bien sûr, dans mon moteur.php j'ai le code

case 'GiB_passwordChange' : GiB_passwordChange($motdepasse1, $motdepasse2); break;

dans le bloc

// Actions
switch($action) {
...
}

comme le dit Cecile

Afin de me faciliter les mises à jour, je mets toutes les fonctions perso de ce style dans un fichier à part que j'apelle par un include dans moteur.php

Offline


Peux-tu publier le code de ta fonction "GiB_passwordChange" pour compléter ton idée ? Ce qu'a fait Cécile marchait bien et ta solution permet de n'avoir qu'un couple php/html au lieu de 3, ce qui est plus simple.
C'est vrai qu'entre temps est apparue la possibilité de parser du php, ce que n'avait pas Cécile ... ajax était une autre solution avant cette possibilité pour tout réduire en 2 fichiers, mais c'est le genre de problème sur lequel on essaye d'éviter de passer des heures et des heures, il y a plus important !
En tout cas merci d'avoir publié ça !

Offline


Je reviens sur ton utilisation de define(). Une meilleure solution (dans le cadre de Thelia) me semble être l'utilisation des variables et messages et de leurs substitutions #VARIABLE et #MESSAGE_TITRE/CHAPO/DESCRIPTION, ces dernières permettant le multilinguisme intégré.

J'utilise déjà #VARIABLE qui marche, par contre j'ai l'impression qu'il y a un bug dans les #MESSAGE_*.

Si dans substitmessage.php, je remplace en ligne 34:

        ereg("\(([^\"]*)\)", "$texte", $cut);

par

        ereg("MESSAGE_TITRE\(([^\"]*)\)", "$texte", $cut);

ça marche pour le titre du message, mais j'arrive pas à trouver l'expression qui permettrait que CHAPO et DESCRIPTION marchent aussi et simultanément (si on utilise les 3 dans une template). Il y a peut-être un bug ailleurs dans la fonction, trop tard pour que j'ai les yeux en face des trous !

Offline


Je n'avais pas inclus le code de ma fonction passwordChange car c'est pratiquement la même que celle de Cecile.

Mais la voici:

function GiB_passwordChange ($motdepasse1, $motdepasse2) {
	$client = New Client();
	$client->charger_id($_SESSION['navig']->client->id);
	if ( ($motdepasse1 == $motdepasse2) && (strlen(trim($motdepasse1)) >= 6) ) {
	   $client->motdepasse = $motdepasse1;
	   $client->crypter();
	   $client->maj();
	   $_SESSION['navig']->client = $client;
	   redirige("password-change.php?ok=1");
	}
	elseif($motdepasse1 != $motdepasse2)  {
	   $_SESSION['navig']->formcli->motdepasse = "";
	   redirige("password-change.php?error=1"); // les passwords 1 et 2 ne correspondent pas
	}
	elseif (strlen(trim($motdepasse1)) < 6)  {
	   $_SESSION['navig']->formcli->motdepasse = "";
	   redirige("password-change.php?error=2"); // le password est trop court
	}
}

Oui, c'est vrai que #VARIABLE est fait pour ça mais je trouve plus pratique de gérer le multi-langue dans des fichiers textes, plus souple à mettre à jour que des entrée multiples dans une base de données, surtout via une interface d'admin...