La balise base et les ancres

Eléphant du PHP | 246 Messages

11 Déc 2007, 10:54

Salut à tous !

J'utilise l'url rewriting pour mon site et j'ai du ajouter une balise pour que les liens soient correct :

Code : Tout sélectionner

<base href="http://monsite.com/" >


Le problème c'est que j'utilise à un endroit une ancre pour remonter tout au haut d'une page.

Code : Tout sélectionner

<a href="#">Top</a>


Le problème c'est qu'avec la balise base j'obtient ce lien :

Code : Tout sélectionner

http://monsite.com/#


au lieu de

Code : Tout sélectionner

http://monsite.com/ma-page-en-cours.html#


Alors est-ce que je dois abandonné ? Ou il y a t'il des techniques pour éviter ça ?

Merci d'avance

ViPHP
ViPHP | 4670 Messages

11 Déc 2007, 13:25

Quelques mots rapidement (je suis en cours :lol:, TP LW -- langage Web --).
La balise <base> est à l'abandon pour HTML 4.01, et je ne parle pas de HTML 5. Il faudra que je me renseigne plus précisemment, mais de mémoire, il y a <host> ou <ihost> qui vont arriver, et <xml:base> également. Donc bon ... Rien de précis, et beaucoup de flou.
Evite l'utilisation de cette balise pour l'instant.

Le plus simple actuellement, et définir la base de ton site avec une constante déclarée en PHP (voir define()). Et tu appelles cette constante dans ton code HTML (<?php echo MA_BASE; ?>). Quitte à sortir la constante de toutes tes pages, et de le mettre dans un fichier de configuration par exemple.

C'est la meilleur solution actuelle d'après moi.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 246 Messages

11 Déc 2007, 13:48

HyWaN a écrit :Le plus simple actuellement, et définir la base de ton site avec une constante déclarée en PHP (voir define()). Et tu appelles cette constante dans ton code HTML (<?php echo MA_BASE; ?>). Quitte à sortir la constante de toutes tes pages, et de le mettre dans un fichier de configuration par exemple.

C'est la meilleur solution actuelle d'après moi.


Salut. Donc ce que tu m'expliques, c'est qu'il faudrait que tous mes liens soient en absolue ? Que je devrai afficher ma constante php devant tous mes liens ? Bouaf pourquoi pas, mais si c'est juste pour résoudre ce problème d'ancre alors je vais plutôt l'enlever, c'est plus simple ^^

ViPHP
ViPHP | 4670 Messages

11 Déc 2007, 16:08

Si tu veux utiliser une ancre, pas besoin de base.
L'utilisation de base n'est utile que dans le cas de redéfinition de lien. Soit HTML le dit au navigateur, ou alors tu le forces en PHP. Mais dans les deux cas, l'ancre ne dépend pas de la base.

Edit : je viens de relire ton poste, j'avais mal compris (lu trop vite, désolé). Ton problème est étrange en fait. Si tu enlèves ton moteur de réécriture d'URLs, ça le fait encore ou pas (en conservant <base>) ?

Et c'est toujours mieux d'avoir des liens en absolus, enfin, ça ne reste que mon opinion (je n'ai pas une grande expérience d'applications Web, mais en ce qui concerne les sites, c'est tout de suite plus simple, autant du côté d'HTML que de PHP).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 2937 Messages

11 Déc 2007, 16:51

Nico128 a écrit :Le problème c'est que j'utilise à un endroit une ancre pour remonter tout au haut d'une page.

Code : Tout sélectionner

<a href="#">Top</a>

Attention ! le raccourci # ne fonctionne pas sous Opera. Dans ce cas, insère un attribut id à l'élément body

Code : Tout sélectionner

<body id="top">

et code ton ancre comme suit :

Code : Tout sélectionner

<a href="#top">Top</a>
.

Quant à l'élément base, il n'est pas "deprecated" par la spécification HTML 4. Si tu veux l'utiliser, essaie comme suit :

Code : Tout sélectionner

<base href="http://monsite.com/ma-page-en-cours.html">

HyWaN, désolé de te contredire, mais l'élément base n'est pas abandonné par le chantier de HTML 5. :wink:

ViPHP
ViPHP | 4670 Messages

11 Déc 2007, 18:06

Au temps pour moi ! Je n'étais plus sûr (et il me semble l'avoir préciser).
Le lien # ne fonctionne pas sur Opera ? Mince. Je pensais que c'était corrigé depuis un moment.

Il faut vraiment que je dorme moi ... je vais revenir sur PHPFrance après 36h de sommeil, à toute :wink:.

PS : ne t'excuse pas de me contredire ;-), on a tous le droit de faire des erreurs, et c'est normal de me reprendre si j'en fais.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Mammouth du PHP | 2937 Messages

11 Déc 2007, 18:33

HyWaN a écrit :Le lien # ne fonctionne pas sur Opera ? Mince. Je pensais que c'était corrigé depuis un moment.

En fait (je viens de le vérifier), le raccourci est implémenté par la version 9.5 bêta. :wink:

Eléphant du PHP | 246 Messages

12 Déc 2007, 01:38

Je regarderai ça demain ou jeudi. je vous tient au courant.

Eléphant du PHP | 246 Messages

01 Jan 2008, 18:13

J'ai trouvé la solution à mon problème ^^

[php]<a href="<?php echo $_SERVER['REQUEST_URI']; ?>#" />Top</a>[/php]

ViPHP
ViPHP | 4670 Messages

01 Jan 2008, 19:43

En quoi est-ce plus simple que d'avoir <body id="top"> et toujours appeler tes liens vers #top ? C'est plus simple à manipuler et à maintenir. Je rappelle que c'était la solution proposé par Victor.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 246 Messages

02 Jan 2008, 15:56

Le problème c'est que lorsque je faisais l'ancre, que ce soit :

Code : Tout sélectionner

<a href="#">Top</a>


Ou bien

Code : Tout sélectionner

<a href="#top">Top</a>


Dans tous les cas lorsque je survolais le lien j'obtenais :

Code : Tout sélectionner

http://monsite.com/#


Ou

Code : Tout sélectionner

http://monsite.com/#top


Alors que j'étais censé avoir :

Code : Tout sélectionner

http://monsite.com/ma-page-en-cours.html#top


Donc fallait que j'aie l'adresse de la page en cours. Mais je savais pas qu'une variable existait déjà, je suis tombé dessus par hasard ^^. Sinon je vais quand même utilisé la solution de Victor, j'avais oublié ce problème sous Opera.

ViPHP
ViPHP | 4670 Messages

02 Jan 2008, 16:15

Une ancre ne retourne jamais à la racine du site.
Bon je t'explique parce qu'aux vues de ce que nous a écrit là, tu n'as pas compris.

Tu as 2 façons de naviguer sur un site. Tu as les liens entre les pages, qui permettent une navigation non-linéaire d'un site. Mais tu as également des liens dans la page, ce qu'on appelle plus couramment des liens d'évitements (on ne peut pas étendre le terme partout, mais on va tolérer).

Les liens s'écrivent de cette façon (avec plusieurs exemples) :

Code : Tout sélectionner

<a href="maPage.html">aller à ma page</a>
est un lien normal.

on est : site.net/dossier/
et on appelle : href="maPage.html"
on ira : site.net/dossier/maPage.html

on est : site.net/dossier/
et on appelle : href="/maPage.html"
on ira : site.net/maPage.html

on est : site.net/
et on appelle : href="/dossier/maPage.html"
on ira : site.net/dossier/maPage.html

on est : site.net/dossier/
et on appelle : href="dossier/maPage.html"
on ira : site.net/dossier/dossier/maPage.html

Ça c'est pour resituer la chose avec les liens à partir de la racine ou non.

Ensuite, on a les ancres (ou fragments selon les RFCs). Elles permettent seulement la navigation dans la page. On a coutume d'appeler une ancre l'identifiant d'un élément.
La forme est :

Code : Tout sélectionner

<a href="#id">Aller à l'élément qui a l'ID « id »</a>

Si tu donnes l'ID "top" à ta balise <body>. Quand tu appelles href="#top", tu iras forcément en haut de ta page, et pas d'une autre page.
L'ancre vide (href="#") correspond à la page elle-même. Son interprétation diffère selon les navigateurs. Très souvent, il remonte en haut de la page, mais pas toujours.

À la différence d'un lien, une ancre ne recharge pas la page.

Donc :

Code : Tout sélectionner

on est : site.net/dossier/maPage.html
et on appelle : #top
on ira site.net/dossier/maPage.html#top

As-tu compris ? Parce que ce que nous dis n'a aucun sens (notamment que <a href="#">Top</a> serait identique à <a href="#top">lien</a>).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphant du PHP | 246 Messages

20 Jan 2008, 02:04

J'avais oublié ce topic, je viens d'y repensé, et je voudrais quand même y répondre, même si ça date déjà.

HyWaN, je suis entièrement d'accord avec ce que tu as écrit. Sauf que là, j'utilise la balise <base>

Code : Tout sélectionner

<base href="http://monsite.com/" >


Lorsque je l'enlève, ça fonctionne normalement, comme tu me l'as expliqué si bien. Lorsque je la remet, hop, ça ne marche plus et ça me retourne la racine du site. Bizzard ? Bah, oui, j'ai quand même faits des tests avant de raconter "n'importe quoi" et c'est pourtant bien ce qui se passe.

ViPHP
ViPHP | 4670 Messages

20 Jan 2008, 23:11

Pour bien comprendre son fonctionnement, je te redirige vers la meilleur documentation HTML : 12.4 Path information: the BASE element sur le site du W3C.

J'avoue n'avoir pas beaucoup étudié le comportement de <base>. Mais lis la recommandation, et si ton problème persiste, je m'y pencherais pour t'aider :).

La page de recommandation que je te file est très intéressante. Ne te cantonne pas à la section 12.4, mais toutes la page si tu n'es pas très à l'aise avec ces notions de liens (et une bonne révision ne fait jamais de mal ;-)).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).