Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Appel de pages et retour

8 réponses
Avatar
Dominique Ottello
Bonjour,

Ma question s'apparente peut-être plus à une recherche d'algorithme qu'à
du PHP pur ; néanmoins, mes pages étant écrites en PHP, je la pose ici.

De manière à pouvoir effectuer le même cheminement au retour, mes appels
de pages ( pageA --> pageB --> pageC retour --> pageB --> pageA) sont
effectués par des liens href="mapageB?retour=mapageA".

Où cela se corse - tout du moins pour moi - c'est lorsqu'il peut y avoir
plusieurs pages différentes d'appel :

pageA --> pageB --> pageC
pageJ --> pageB --> pageC
pageL --> pageC

et pour lesquels je voudrais le chemin inverse au retour -- bien sûr, à
condition d'appuyer sur les liens "retour" et non "accueil".

Comme je n'aime pas trop voir - en clair - le chemin de mes pages, j'ai
fait des essais avec des variables globales ($_SESSION[]) ; cela
fonctionne bien lorsqu'il n'y a qu'un seul niveau d'appel :
pageA --> pageB retour --> pageA
pageJ --> pageB retour --> pageJ
mais je cafouille lamentablement dès que l'on passe au deuxième niveau
et à fortiori au troisième.

Un petit peu d'aide ou le déclic logique qui va bien me serait d'un
grand secours.

Merci.
--
= Dominique Ottello = http://www.ottello.net
Aujourd'hui, l'idéal du progrès est remplacé par l'idéal de l'innovation :
il ne s'agit pas que ce soit mieux, il s'agit seulement que ce soit nouveau,
même si c'est pire qu'avant et cela de toute évidence. Montherlant

8 réponses

Avatar
__marc.quinton__
Dominique Ottello wrote:

Comme je n'aime pas trop voir - en clair - le chemin de mes pages, j'ai
fait des essais avec des variables globales ($_SESSION[]) ; cela
fonctionne bien lorsqu'il n'y a qu'un seul niveau d'appel :
pageA --> pageB retour --> pageA
pageJ --> pageB retour --> pageJ
mais je cafouille lamentablement dès que l'on passe au deuxième niveau
et à fortiori au troisième.

Un petit peu d'aide ou le déclic logique qui va bien me serait d'un
grand secours.



pourquoi ne pas creer une pile avec les pages qui s'empilents
les unes a la suite des autres.

il suffit de faire résider cette pile en session et l'affaire
est jouée.

si la pile dispose d'une API (interface) suffisante, il sera possible
de recuperer les liens précédents jusqu'a l'arrivée de l'utiliteur,
enfin a condition que toutes les pages alimentent bien la pile.

voici une implementation objet (partielle)


$p = new Pile();

# alimentation
$p->push_url('titre', $url);
$p->push_page('titre', $array); # avec des parametres (peut-etre est-ce utile)

# retrait:
$p->pop();

# lecture :
$p->stack(); # retourne le contenu de la pile sous forme d'un
tableau associatif : 'titre' -> 'url'


# il doit etre nécessaire de supprimer de la pile a partir d'un rang n.
# la difficulté est de determiner 'index' ; il peut etre passé dans
# l'url au moment de la construction des liens.
# ex : http://..../?index=2
#
$p->flush($index);

cela reste a creuser (un peu), mais tres accessible.

Avatar
Olivier Miakinen

De manière à pouvoir effectuer le même cheminement au retour, mes appels
de pages ( pageA --> pageB --> pageC retour --> pageB --> pageA) sont
effectués par des liens href="mapageB?retour=mapageA".

Où cela se corse - tout du moins pour moi - c'est lorsqu'il peut y avoir
plusieurs pages différentes d'appel :

pageA --> pageB --> pageC
pageJ --> pageB --> pageC
pageL --> pageC

et pour lesquels je voudrais le chemin inverse au retour

[...] je cafouille lamentablement dès que l'on passe au deuxième niveau
et à fortiori au troisième.


<réponse irréfléchie>
Il te suffit d'avoir quelque part une table de correspondance indiquant
que pour aller de pageA à pageC le seul chemin possible est pageA -->
pageB --> pageC. Plus simplement, tu stockes une table par page, par
exemple associé à pageC tu as une table indiquant que si la page de
départ était pageA, alors la page précédente est pageB.

Bien évidemment, cela ne peut pas fonctionner si plusieurs chemins
existent, par exemple :
pageA --> pageB --> pageC
pageA --> pageM --> pageN --> pageC

Dans ce cas, tu peux mettre le chemin complet dans les liens, du style
href="mapageC?retour=mapageA+mapageB"
</>


<réponse réfléchie>
Mais pourquoi diable as-tu besoin de gérer de tels chemins de retour ?

Chaque page peut avoir une page qui se trouve « logiquement avant », par
exemple la page précédant pageC sera forcément pageB. Mais si tu veux
pouvoir revenir à la page précédente « selon l'historique de navigation
de l'utilisateur », il est inutile de réinventer la roue !

Au cas où tes visiteurs l'ignoreraient, ils ont un bouton de retour
intégré à leur navigateur, traditionnellement nommé BACK sur les
navigateurs en anglais : <http://www.miakinen.net/vrac/fenetre#t2>.
</>

--
Olivier Miakinen
Non, monsieur le juge, je vous le jure : jamais je n'ai cité
Bruxelles dans ma signature.

Avatar
Dominique Ottello
écrivait :

cela reste a creuser (un peu), mais tres accessible.


Merci.
Je vais creuser... Mais il va d'abord falloir que je creuse la
programmation objet.
Vu que je suis un ancien, j'en suis resté à la programmation linéaire et
séquentielle et mes neurones vont avoir du mal à absorber, et surtout
comprendre, le concept de l'objet.

--
Un ordinateur résout des problèmes que nous n'aurions pas sans lui
Technique aéronautique : http://aviatechno.free.fr
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr

Avatar
Dominique Ottello
Olivier Miakinen <om+ écrivait :

Mais pourquoi diable as-tu besoin de gérer de tels chemins de retour ?


Bonne question !
À la limite, je me le demande aussi ;-), surtout avec la réponse
ci-dessous.

Au cas où tes visiteurs l'ignoreraient, ils ont un bouton de retour
intégré à leur navigateur, traditionnellement nommé BACK sur les
navigateurs en anglais : <http://www.miakinen.net/vrac/fenetre#t2>.


Le nec plus ultra, amha, serait de pouvoir mettre dans mes pages un
« bouton » nommé "Retour" qui ferait ce que fait le bouton "back" du
navigateur, mais il me semble bien avoir lu (où ?) que ceci ne pouvait
être effectué qu'en Javascript et non pas en PHP avec HTML 4.01 strict
et CSS.


--
Ce n'est pas parce que l'erreur se propage qu'elle devient vérité. Gandhi
Technologie aéronautique : http://aviatechno.free.fr (http://ottello.net)
Concorde dans la presse de 1965 à 2003 : http://le.pointu.free.fr

Avatar
G Roydor
ceci se fait en javascript et html

history.go(-1)

donc sur la page il faut :

<a href="javascript:history.go(-1)">Retour</a>
ou
<a href="javascript:history.go(-1)"><img src="truc.png"></a> pour une image





Dominique Ottello a écrit:
Olivier Miakinen <om+ écrivait :


Mais pourquoi diable as-tu besoin de gérer de tels chemins de retour ?



Bonne question !
À la limite, je me le demande aussi ;-), surtout avec la réponse
ci-dessous.


Au cas où tes visiteurs l'ignoreraient, ils ont un bouton de retour
intégré à leur navigateur, traditionnellement nommé BACK sur les
navigateurs en anglais : <http://www.miakinen.net/vrac/fenetre#t2>.



Le nec plus ultra, amha, serait de pouvoir mettre dans mes pages un
« bouton » nommé "Retour" qui ferait ce que fait le bouton "back" du
navigateur, mais il me semble bien avoir lu (où ?) que ceci ne pouvait
être effectué qu'en Javascript et non pas en PHP avec HTML 4.01 strict
et CSS.





Avatar
Marc

Le nec plus ultra, amha, serait de pouvoir mettre dans mes pages un
« bouton » nommé "Retour" qui ferait ce que fait le bouton "back" du
navigateur, mais il me semble bien avoir lu (où ?) que ceci ne pouvait
être effectué qu'en Javascript et non pas en PHP avec HTML 4.01 strict
et CSS.


oui, sauf que si le bouton possede des attributs (titre ...) qui
dependent du contexte, ils peuvent tres bien etre réalisés avec php.

Avatar
bruno modulix
Dominique Ottello wrote:
(snip)
Le nec plus ultra, amha, serait de pouvoir mettre dans mes pages un
« bouton » nommé "Retour" qui ferait ce que fait le bouton "back" du
navigateur, mais il me semble bien avoir lu (où ?) que ceci ne pouvait
être effectué qu'en Javascript et non pas en PHP avec HTML 4.01 strict
et CSS.


<HS>
Et où à tu vu que Javascript était incompatible avec HTML 4.01 strict et
CSS ?-)

Ceci étant, je ne vois guère l'intérêt de rajouter du javascript pour
dupliquer une fonctionnalité de base de la majorité des navigateurs...
</HS>

--
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in ''.split('@')])"

Avatar
P'tit Marcel
Dominique Ottello wrote:

De manière à pouvoir effectuer le même cheminement au retour, mes appels
de pages ( pageA --> pageB --> pageC retour --> pageB --> pageA) sont
effectués par des liens href="mapageB?retour=mapageA".

Où cela se corse - tout du moins pour moi - c'est lorsqu'il peut y avoir
plusieurs pages différentes d'appel :

pageA --> pageB --> pageC
pageJ --> pageB --> pageC
pageL --> pageC

et pour lesquels je voudrais le chemin inverse au retour -- bien sûr, à
condition d'appuyer sur les liens "retour" et non "accueil".



Je pense que tu peux t'en sortir, sans OO, avec une approche du genre :


# récupération de la navigation antérieure
$url = (isset($_SESSION['url']) ? unserialize($_SESSION['url']) : array());
$nomurl = (isset($_SESSION['nomurl']) ? unserialize($_SESSION['nomurl'])
: array());
$utaille = min(count($url), count($nomurl)) ;

# cas de clic sur un lien de navigation antérieure
# => il faut supprimer une partie des liens antérieurs
if(isset($_GET['niveau'])) {
$niveau = $_GET['niveau'];
if (is_numeric($niveau) and ($niveau < $utaille) ) {
for ($i = 0 ; $i < $niveau ; $i++) {
array_pop($url);
array_pop($nomurl);
}
}
}

# affichage de ladite navigation
for ($i = 0 ; $i < $utaille ; $i++) {
if ($i <> 0) echo ' --> ';
echo '<a href="'.$url[$i].'?niveau='.
($utaille - $i).'">'.$nomurl[$i].'</a>';
}

# ajout de la page actuelle dans la navigation
$url[] = $_SERVER['SERVER_NAME'] . $_SERVER['PHP_SELF'];
$nomurl[] = 'pageZ';
$_SESSION['url']=serialize($url);
$_SESSION['nomurl']=serialize($nomurl);

...


SGDG touçatouça
--
P'tit Marcel