Interne links (Drupal)

Uit De Vliegende Brigade
Ga naar: navigatie, zoeken

Het is aanlokkelijk om links naar een bepaald object binnen een site (bv. een pagina of afbeelding) absoluut te specificeren. Maar da's nie handig bij bv. migraties. En het hoeft ook niet: Vaak kun je relatieve URL's 'gebruiken en anders zijn er diverse modules om dit voor je te fixen.

Relatieve URL's

  • Relatieve URL's zijn gespecificeerd vanaf de wortel van een installatie
  • Ze moeten doorgaans voorafgegaan worden door /. Anders zijn de paden relatief tov. de pagina waar ze staan.

Voorbeeld: Relatieve link naar winkelwagen & "/"

In de header van een site staat in een blok op elke pagina een link naar de winkelwagen:

<a href="cart"> 
   <img src="sites/default/files/shopping-cart-50x.png">
</a>

Vanaf de home page van de site werkt dit prima. Vanaf bv. de pagina aanbieding, werkt dit niet:

  • De link wordt example.com/aanbieding/cart
  • De locatie van de afbeelding wordt example.com/aanbieding/shopping-cart-50x.png (of zoiets).

Door toevoeging van / aan beide links, is het probleem verholpen:

<a href="/cart"> 
   <img src="/sites/default/files/shopping-cart-50x.png">
</a>

Voorbeeld: HTML-blok met link naar een andere eigen pagina

This site is part of ...|Prices are including 21% VAT | 
Our <a href="general-conditions"> general conditions</a> 
apply on all our transactions.

Voorbeeld: Link naar winkelwagen

De oorspronkelijke code:

<a href="http://example.com/?q=cart"> 
   <img src="http://example.com/sites/example.com/files/shopping-cart-50x.png"> 
</a>

Wordt:

<a href="/cart"> 
   <img src="/sites/default/files/shopping-cart-50x.png">
</a>

Veelbeeld: Link naar winkelwagen - Zonder CleanURL's

In het voorbeeld hiervoor werd aangenomen dat CleanURL's functioneert. Wil je daar niet van afhankelijk zijn, dan werkt dit ook:

<a href="?q=cart"> 
   <img src="sites/default/files/shopping-cart-50x.png">
</a>
  • Ik ga zelf trouwens wel uit van de aanname dat CleanURL's functioneert: Als dat niet het geval is, doet oa. ImageCache het ook niet, en doet de site het niet
  • Het staat me bij dat ik situaties had waarbij links naar inlogpagina's inclusief ?q= niet functioneerden in situaties waarin CleanURL's gebruikt wordt → Een rede te meer om uit te gaan van het functioneren van CleanURL's.

Alternatief: Tokenize harde URL's

Allereerst installeer je
https://www.drupal.org/project/token_filter

Die geeft je de optie om een vinkje aan te zetten bij het betreffende text format. In dit geval het html format
Dit zorgt ervoor dat als er tokens worden gebruikt in velden waar html als text format staat deze worden vervangen.

Nu hebben we alleen nog een token nodig voor het het publieke file systeem pad nodig (e.g. /sites/default/files)
Die zit niet in de standaard tokens maar is wel beschikbaar als variabele.

Gelukkig is er een module waarmee je variabelen beschikaar kan maken als token: 
https://www.drupal.org/project/token_var

Na installatie ga je naar
http://example.com/admin/config/system/tokenizevariables
en zet je vinkje aan voor file_public_path

Nu kan je het volgende doen

Deze regel:
<a href="http://example.com/?q=cart"> <img src="http://example.com/sites/default/files/example-shopping-cart-50x.png"> </a>

In het blok:
http://www.example.com/admin/structure/block/manage/block/6/configure?destination=node

Word dan b.v.
<a href="http://example.com/?q=cart"> <img src="[variables:file_public_path]/example-shopping-cart-50x.png"> </a>

Deze aanpak kan oa. interessant zijn als je heel veel content hebt met hardcoded relatieve paden en je moet ooit van een single site naar een multisite: dan hoef je niet alles handmatig aan te passen.