Steeds meer websites gebruiken favicons van externe websites en geven die weer bij links naar die websites. Hoe werkt dat? Een handleiding.
Om te beginnen moeten we het favicon van de andere website ophalen en converteren in een ander afbeeldingsbestandsformaat. De meeste browsers kunnen bestanden van het formaat .ico namelijk niet in een internetpagina weergeven. We moeten daarvoor de volgende stappen doorlopen:
1. Het favicon ophalen en op de eigen server zetten in een tijdelijk bestand.
2. Het tijdelijke bestand converteren naar bv. een .png bestand.
3. Het tijdelijke bestand weer verwijderen.
We gebruiken hiervoor PHP en ImageMagick.
Een voorbeeld. Stel, we willen een favicon weergeven bij een link naar http://www.domein.nl/map/pagina.htm. De favicon bevindt zich als het goed is op http://www.domein.nl/favicon.ico. We willen het op onze eigen server plaatsen als 'map/nieuw.png'. Het tijdelijke bestand wordt 'map/tijdelijk.ico'. Verder gebruiken we een alternatieve afbeelding op de eigen server 'map/alternatief.png' dat wordt gebruikt als het ophalen van het favicon mislukt. Dit kan bijvoorbeeld een volledige transparante pixel zijn.
Eerst plaatsen we deze adressen in variabelen. Het adres van het externe favicon leiden we daarbij af uit het adres van de link waar het uiteindelijk bij moet komen te staan. Op die manier is het script op alle mogelijke links toe te passen, zolang het favicon maar als 'favicon.ico' in de rootmap van de externe site staat. Je kunt de link natuurlijk ook uit een database halen en voor de namen van het tijdelijke en het nieuwe bestand het id van de link uit de database gebruiken (bijvoorbeeld: '/map/'.$id .'.ico' en '/map/'.$id.'.png').
$link = 'http://www.domein.nl/map/pagina.htm';
$tijdelijk = $_SERVER('DOCUMENT_ROOT') . '/map/tijdelijk.ico';
$nieuw = $_SERVER('DOCUMENT_ROOT') . '/map/nieuw.png';
$alt = $_SERVER('DOCUMENT_ROOT') . '/map/alternatief.png';
$favicon = str_replace('http://','',$link);
$favicon = explode('/',$favicon);
$favicon = 'http://'. $favicon[0] . '/favicon.ico';
Vervolgens moeten we het favicon ophalen en op de eigen server plaatsen. Denk er om dat de map waarin je het bestand plaatst schrijfrechten moet hebben.
$copy = 0;
$copy = copy($favicon, $tijdelijk);
Vervolgens moet het bestand dat op de server geplaatst is geconverteerd worden. Dit gebeurt via het programma ImageMagick. '/usr/bin' is het adres van ImageMagick op de server en '/convert' de functie die gebruikt wordt. Maar eerst controleren we of het ophalen wel gelukt is.
if ($copy) {
exec("/usr/bin/convert $tijdelijk[0] -resize 16x16 $nieuw");
}
Is het ophalen niet gelukt, dan gebruiken we de alternatieve afbeelding.
else {
exec("/usr/bin/convert $alt -resize 16x16 $nieuw");
}
Nu is het mogelijk dat het converteren mislukt is en daarom voeren we nogmaals een controle uit en gebruiken we zo nodig nogmaals de alternatieve afbeelding.
if (!file_exists($nieuw)) {
exec("/usr/bin/convert $alt -resize 16x16 $nieuw");
}
Tenslotte wordt het tijdelijke bestand weer verwijderd.
unlink($tijdelijk);
Klaar! Je kunt het bestand 'map/nieuw.png' nu weergeven in de uit te voeren pagina.
echo("<a href=\"$link\"><img src=\"$nieuw\" /></a> <a href=\"$link\">$link</a>");
Het is natuurlijk niet verstandig om dit hele script elke keer uit te voeren als het favicon moet worden weergegeven. Eén keer is voldoende. Daarom plaatsen we het ophalen en converteren in een controle structuur en kijken we eerst of het bestand 'nieuw.png' al bestaat.
if (!file_exists($nieuw)) {
// script
}
Dit script werkt alleen wanneer ImageMagick op de server is geïnstalleerd én wanneer het gebruik van de functie copy() voor externe bestanden is toegestaan voor PHP. Vooral het laatste is lang niet altijd het geval.
Tot slot het hele script nog een keer:
<?php
$link = 'http://www.domein.nl/map/pagina.htm';
$nieuw = $_SERVER('DOCUMENT_ROOT') . '/map/nieuw.png';
$tijdelijk = $_SERVER('DOCUMENT_ROOT') . '/map/tijdelijk.ico';
$alt = $_SERVER('DOCUMENT_ROOT') . '/map/alternatief.png';
if (!file_exists($nieuw)) {
$favicon = str_replace('http://','',$link);
$favicon = explode('/',$favicon);
$favicon = 'http://'. $favicon[0] . '/favicon.ico';
$copy = 0;
$copy = copy($favicon, $tijdelijk);
if ($copy) {
exec("/usr/bin/convert $tijdelijk[0] -resize 16x16 $nieuw");
}
else {
exec("/usr/bin/convert $alt -resize 16x16 $nieuw");
}
if (!file_exists($nieuw)) {
exec("/usr/bin/convert $alt -resize 16x16 $nieuw");
}
unlink($tijdelijk);
}
echo("<a href=\"$link\"><img src=\"$nieuw\" /></a> <a href=\"$link\">$link</a>");
?>
Reacties