Jump to content

[ $RESOLU ] - Retour sur la page active après login


Recommended Posts

Bonjour à tous,

A force d'utiliser ma boutique et de faire des simulations en tant que client, je me suis aperçu d'une chose:

Je suis sur la page d'un produit, je mets ce produit au panier (je l'achète), j'ai besoin de me logguer pour une raison X, une fois loggué j'arrive sur le menu de mon compte au lieu de retourner sur la page produit où j'étais.
Sachant que j'ai mis X minutes à trouver ce produit, je ne sais plus comment y retourner...
comment faire pour que le log se fasse comme un "span" en apparté.
une fois loggué je reviens sur la page où j' étais ?

merci de vos réponses.

Link to comment
Share on other sites

a vérifier, mais dans authentification.php normalement à la fin de l’authentification tu as un tool::redirect($back)
a toi de voir comment récupérer la dernière page vu et de la rendre à $back

Si c'est juste les produits, tu as dans la bdd une table qui enregistre ton dernier produit vu

Link to comment
Share on other sites

merci pour la réponse,
ça parait pas compliqué mais le authentification.php est bourré de lien redirect qui vont tous vers my-account, ne faudrait il pas en changer un (ou tous) et il y a aussi une fonction Back mais je ne vois pas à quoi elle sert et si je peux l'utiliser...

Link to comment
Share on other sites

de mémoire c'est le dernier redirect de la partie : if (Tools::isSubmit('submitAccount')) peut après le mail::send
je n'ai pas de fonction back dans ma version. tu peux coller le code ?
Ne change pas tous les lien. Certains sont important ^^

Link to comment
Share on other sites

voici la partie dont tu me parles, mais après ... mysteres du php...

if (Tools::isSubmit('SubmitLogin'))
{
   $passwd = trim(Tools::getValue('passwd'));
   $email = trim(Tools::getValue('email'));
   if (empty($email))
       $errors[] = Tools::displayError('e-mail address is required');
   elseif (!Validate::isEmail($email))
       $errors[] = Tools::displayError('invalid e-mail address');
   elseif (empty($passwd))
       $errors[] = Tools::displayError('password is required');
   elseif (Tools::strlen($passwd) > 32)
       $errors[] = Tools::displayError('password is too long');
   elseif (!Validate::isPasswd($passwd))
       $errors[] = Tools::displayError('invalid password');
   else
   {
       $customer = new Customer();
       $authentication = $customer->getByEmail(trim($email), trim($passwd));
       /* Handle brute force attacks */
       sleep(1);
       if (!$authentication OR !$customer->id)
           $errors[] = Tools::displayError('authentication failed');
       else
       {
           $cookie->id_customer = intval($customer->id);
           $cookie->customer_lastname = $customer->lastname;
           $cookie->customer_firstname = $customer->firstname;
           $cookie->logged = 1;
           $cookie->passwd = $customer->passwd;
           $cookie->email = $customer->email;
           if (Configuration::get('PS_CART_FOLLOWING') AND (empty($cookie->id_cart) OR Cart::getNbProducts($cookie->id_cart) == 0))
               $cookie->id_cart = intval(Cart::lastNoneOrderedCart(intval($customer->id)));
           Module::hookExec('authentication');
           if ($back = Tools::getValue('back'))
               Tools::redirect($back);
           Tools::redirect('my-account.php');
       }
   }
}



merci de ton aide

Link to comment
Share on other sites

C'est cette partie qui est concerné :

if ($back = Tools::getValue('back'))
               Tools::redirect($back);
           Tools::redirect('my-account.php');



rapidement,
1er ligne, on récupére la valeur contenu dans back (ici une $_GET), on l'assigne = $back.
Si tous c'est bien passé, on redirige vers cette URL Sinon (si sa existe pas ou que sa n'a pas marché ) on redirige vers my-account.php

Ce que tu dois faire :

récupérer le dernier produit visiter (regarde du coté de la variable $cookie je crois qu'il y a un last_visited mais je ne suis pus sur)

construire le lien avec le produit (new product(intval($blabla_de_lid_du_produit)))

et le mettre à la place de $back
puis faire le tool:redirect($back)

Bon courage,
bon week-end

Link to comment
Share on other sites

Merci, j'ai suivi ton résonnement mais il y a qqe chose qui m'intrigue, tu me dis "si tout c'est bien pass'e, on redirige vers cette url, sinon vers my-account...

mais moi à chaque fois que je me logue (tout se passe bien) et ça me dirige d'office vers my account... jamais je n'ai eu la possibilite d'être redirigé sur une autre page...

je vais faire des tests et te dirai lundi como va.

merci

Link to comment
Share on other sites

A mon sens tu dois intervenir sur blockuserinfo.tpl , en insérant la page actuelle dans un champ hidden , pour qu'elle soit transmise à my-account.php :

>    </pre>
<ul>

{l s='Welcome' mod='blockuserinfo'},

           {if $logged}
{$customerName}
({l s='Log out' mod='blockuserinfo'})
           {else}
               <input type="hidden" name="back" value="{$request_uri}"/>
{l s='Log in' mod='blockuserinfo'}
           {/if}



Ensuite il faut tweaker my-account.php car il ne prend pas $back en compte, contrairement à authentication.php

<?php

/* SSL Management */
$useSSL = true;

include(dirname(__FILE__).'/config/config.inc.php');
include(dirname(__FILE__).'/init.php');
if (!$back = Tools::getValue('back')) $back = 'my-account.php';
if (!$cookie->isLogged()){
   Tools::redirect('authentication.php?back='.$back);
}



Je n'ai pas testé , mais il y a des chances que celà fonctionne

Link to comment
Share on other sites

Merci Broceliande,

j'ai fait la modif mais juste après m'Être loggué, je tombe comme d'hab directement sur le menu de my-account.php avec l'historique, les remboursements, etc... au lieu de retouner vers la page de l'article ou j'etais avant de me logguer (je ne sais même plus si j'écris bien "logguer" enfin je vais essayer la modif de jherbaux au cas où.
sinon ne faudrait il pas changer :

if (!$back = Tools::getValue('back')) $back = 'my-account.php';
if (!$cookie->isLogged()){
Tools::redirect('authentication.php?back='.$back);

le my-account.php par autre chose pour qu'il retourne en arriere (que je reste loggué mais que je revienne sur la page ou j'etais ?).

Link to comment
Share on other sites

oui forcément je me suis gourré dans blockuserinfo.tpl, car c'est un lien et non un formulaire, donc mon hidden ne sert à rien, il faut plutôt :

            {if $logged}
{$customerName}
({l s='Log out' mod='blockuserinfo'})
           {else}
{l s='Log in' mod='blockuserinfo'}
           {/if}



Avec ça et la modif suivante dans my-account.php :

<?php

/* SSL Management */
$useSSL = true;

include(dirname(__FILE__).'/config/config.inc.php');
include(dirname(__FILE__).'/init.php');

if (!$cookie->isLogged())
{
   if (!$back = Tools::getValue('back')) 
   {
       Tools::redirect('authentication.php?back=my-account.php');
   }
   else     Tools::redirect('authentication.php?back='.$back);
}



On a bien le redirect au final traîté par authentication, mais hélas , il manque un truc à ce stade , je te laisse constater par toi même....

On perd au moment de la redirection final la partie qui vient avant la 'request_uri'

Si je trouve 5mn , je testerais , mais là déja ton back arrive jusqu'au bout.

Link to comment
Share on other sites

Bon ben hervehh , le / en début de l'url retournée par $request_uri pose pb , il faut l'enlever ... je cherche la fonction smarty kivabien , car

 $request_uri |replace:'/':''

fonctionne bien sur les urls simples mais pas si on est dans un sous dossier...
Je fouille ça et je te donne un code 100% fonctionnel

Link to comment
Share on other sites

Voilà , j'ai eu enfin 5 mn à moi ... ou à toi lol...

Ca va être beucoup plus fiable avec une regex :

voici blockuserinfo.tpl au grand complet, ainsi modifié (si d'autres veulent faire comme toi ;) ) :

<!-- Block user information module HEADER -->



{l s='Welcome' mod='blockuserinfo'},

           {if $logged}
{$customerName}
({l s='Log out' mod='blockuserinfo'})
           {else}
{l s='Log in' mod='blockuserinfo'}
           {/if}

{l s='Your Account' mod='blockuserinfo'}

{l s='Cart:' mod='blockuserinfo'}

{$cart_qties}
{l s='product' mod='blockuserinfo'}
{l s='products' mod='blockuserinfo'}

           {if $cart_qties > 0}

                   {if $priceDisplay == 1}
                       {convertPrice price=$cart->getOrderTotal(false, 4)}
                   {else}
                       {convertPrice price=$cart->getOrderTotal(true, 4)}
                   {/if}

           {/if}
{l s='(empty)' mod='blockuserinfo'}



<!-- /Block user information module HEADER -->



Et pour rappel l'autre modif nécessaire, dans son intégralité itou (on a de la chance les fichiers sont petits), qui concerne my-account.php :

<?php

/* SSL Management */
$useSSL = true;

include(dirname(__FILE__).'/config/config.inc.php');
include(dirname(__FILE__).'/init.php');

if (!$cookie->isLogged())
{
   if (!$back = Tools::getValue('back')) 
   {
       Tools::redirect('authentication.php?back=my-account.php');
   }
   else     Tools::redirect('authentication.php?back='.$back);
}

include(dirname(__FILE__).'/header.php');
$smarty->assign(array(
   'voucherAllowed' => intval(Configuration::get('PS_VOUCHERS')),
   'returnAllowed' => intval(Configuration::get('PS_ORDER_RETURN')),
   'HOOK_CUSTOMER_ACCOUNT' => Module::hookExec('customerAccount')));

$smarty->display(_PS_THEME_DIR_.'my-account.tpl');

include(dirname(__FILE__).'/footer.php');

?>



Merci de tester :) et nous dire...

Link to comment
Share on other sites

Ah ...
Oui mais là tu as testé sur un presta configuré sur /prestashop et non à la racine.
Ma modif ne fonctionne que si ton url boutique est à la racine.
En clair si tu mets en ligne sur ton site http://www.nuestratienda.eu/ ça marchera
Si tu mets sur http://www.test.eu/prestashop , marche plus ... pas étudié ce cas de figure . Il va falloir foncer les yeux fermés lol et mettre en ligne

Link to comment
Share on other sites

Broceliande comment faire pour en savoir autant que toi ?
Je ne te remercierai jamais assez.
Enfin pour ceux qui prennent ce post au passage, la solution fonctionne et permet donc (je le rappelle) de se logguer sans être redirigé d'office vers la page de my-account (avec le menu historiques, bons de réduction, etc...) et donc de revenir sur la page, fiche produit, sur laquelle vous étiez avant de vous logguer.
En espérant avoir été assez clair.

je met donc un RESOLU et encore un grand merci à Broceliande (ils devraient te donner une étoile de plus...)

Link to comment
Share on other sites

  • 1 month later...
  • 3 months later...

Bonjour,

un petit up concernant la solution proposée.

 

Lorsque je modifie les 2 fichiers (blockuserinfo.tpl et my-account.php) comme indiqué, mon block UserInfo disparait et suite à l'identification je suis toujours redirigée vers la page "Mon compte".

 

Je suis sur Prestshop Version 1.3.6.0.

Pouvez-vous me préciser les modifications à apporter svp?

 

Merci

Link to comment
Share on other sites

  • 9 months later...
  • 2 months later...
  • 3 weeks later...

Bonjour,

 

J'avais trouvé ça, sur le forum:

 

modif sur Presta 1.4.8.2 fichier controllers/AuthController.php

 

si redirection après inscription - ligne 203

 

Changer Tools::redirect('my-account.php'); par Tools::redirect('ta_page.php');

 

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

 

si redirection après connexion - ligne 275

 

Changer Tools::redirect('my-account.php'); par Tools::redirect('ta_page.php');

 

Mais apparemment, ça ne fonctionne pas.

 

Cdlt,

Philippe

Link to comment
Share on other sites

  • 2 months later...

Je relance le sujet

Toujours pas de up ? pour cette modif essentielle

 

ne pas revenir au compte quand on se connecte (surtout après avoir ajouté un produit au panier)

c'est une fonction essentielle pour ne pas lasser les clients;

j'ai testé les différentes solutions pas une ne marche

sur une install 1.5.2

 

quelqu'un a t'il trouvé les fichiers à modifier (controllers - tpl -php ??????) et comment ?

 

Ce serait une bonne nouvelle avant la fin du monde ! :wacko:

 

Best regards

Link to comment
Share on other sites

Bonjour Brocéliande

 

est ce que cette modif marche avec PS 1.5.2.

et le onepageCheckout

ou faut il modifier dd'autres fichiers

 

Merci de votre réponse ? :)

oui forcément je me suis gourré dans blockuserinfo.tpl, car c'est un lien et non un formulaire, donc mon hidden ne sert à rien, il faut plutôt :

 

			{if $logged}
			{$customerName}
[url="{$base_dir}index.php?mylogout"]({l s='Log out' mod='blockuserinfo'})[/url]
		{else}
			[url="{$base_dir_ssl}my-account.php?back={$request_uri}"]{l s='Log in' mod='blockuserinfo'}[/url]
		{/if}

 

Avec ça et la modif suivante dans my-account.php :

 

<?php

/* SSL Management */
$useSSL = true;

include(dirname(__FILE__).'/config/config.inc.php');
include(dirname(__FILE__).'/init.php');

if (!$cookie->isLogged())
{
if (!$back = Tools::getValue('back'))
{
	Tools::redirect('authentication.php?back=my-account.php');
}
else	 Tools::redirect('authentication.php?back='.$back);
}

 

On a bien le redirect au final traîté par authentication, mais hélas , il manque un truc à ce stade , je te laisse constater par toi même....

 

On perd au moment de la redirection final la partie qui vient avant la 'request_uri'

 

Si je trouve 5mn , je testerais , mais là déja ton back arrive jusqu'au bout.

Link to comment
Share on other sites

  • 2 months later...

Bonjour,

 

 

Petit aparté : En parlant de redirection vers la page courante, il serait intéressant que le forum l'applique ^^

 

Sous PS 1.5.3, la redirection est applicable sur le fichier AuthController.php.

 

la fonction processSubmitLogin() (~ line 261)

if (!$this->ajax)
{

 if ($back = Tools::getValue('back'))
  Tools::redirect(html_entity_decode($back));
 Tools::redirect('index.php?controller=my-account');
}

 

La fonction gère la redirection vers la ligne 314. En théorie, il suffit de rajouter ?back=ma_page_ou_je_serais_redirige sur le lien d'authentification.

 

Si on reprend la reco de brocéliande, dans l'action du formulaire :


<form action="{$link->getPageLink('authentication.php', true)}?back={$request_uri|regex_replace:'/^\/(.*)$/':'$1'}" id="signin" method="post">

...

</form

 

 

Mais le soucis est que cette fonction ne prend en compte que le controlleur, et tronquera le reste.

Exemple si vous mettez index.php?controlleur=category&id_category=11.

 

Vous serez redirigé vers la page index.php?controlleur=category ==> erreur 404. normal.

Il faut donc modifier cette fonction, voire en utiliser une autre pour l'authentification pour qu'elle prend en compte id_category.

 

 

 

 

Je vous propose une solution parmi tant d'autre.. mais j'arrive rapidement à mes fins avec ceci.

 

Class Tools.php (override)

 

 public static function redirectOverride($url)
{
 if (!$link)
 $link = Context::getContext()->link;

 $redirect = $link->getPageLink($url);
 header('Location: '.$redirect);
 exit;
}

 

le module qui gère la connexion du compte ( blockuserinfo.tpl?) désolé je n'utilise pas lui d'où mon point interrogation.

 

Rajouter au niveau du fichier blockuserinfo.php dans la fonction du hookTop

$return = '';
 switch(Tools::getValue('controller')){

  case 'category':
$return = 'category&id_category='.Tools::getValue('id_category');
  break;
  case 'product':
$return = 'product&id_product='.Tools::getValue('id_product');
  break;

  default:
  break;

 }
$smarty->assign('return', $return);

 

au niveau du tpl du module : rajouter un input dans le formulaire

 


<form>
..
..
..
{if isset($return) && $return != ''}<input type="hidden" name="return" value="{$return}" />{/if}
</form>

 

Fichier AuthController.php (override) rajouté ceci avec

 

/* ajout */
if ($return = Tools::getValue('return')):

  Tools::redirectOverride($return);
 endif;
/* fin ajout */
if ($back = Tools::getValue('back')):
					Tools::redirect(html_entity_decode($back));

 

Vous aviez bien compris que je construis mon url de retour. Je pars du principe que l'on se reconnect sur la même page que si nous sommes sur une page catégory ou product. Si vous souhaitez à avoir la meme action pour les pages CMS il vous faut rajouter dans le switch un controller cms

Edited by Myst26 (see edit history)
Link to comment
Share on other sites

  • 4 months later...
  • 3 months later...

Bonjour,

 

 

encore un point qui merite une réponse, meme problème pour moi sur 1.5.6.

 

Du meme avis que redtango2; un point essentiel à modifier!!!!

 

San réponse...

 

cordialement

 

PS/ Entre la redirection apres identification qui est essentielle, et le module Mondial Relais qui n'a jamais marcher depuis sa premièere version qui lui aussi est essentiel vis a vis des tarifs appliquer..... ca commence à faire beaucoup de point important négliger....Que faire? payer un prestataire pour un logiciel open source. Autant avoir un prestashop payant mais fonctionnel.

Edited by sabrina (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...