Archive for januari, 2011

Bättre url_title() i Codeigniter

onsdag, januari 5th, 2011

Codeigniter är bra på många vis när man ska bygga php-applikationer, dessvärre finns det en del funktioner som inte är helt optimerade för det svenska språket, exempelvis url_title(). url_title() är en funktion som finns i en helper som heter URL Helper och gör om en textsträng till en URL-vänlig sträng så här:

$title = "What's wrong with CSS?";
$url_title = url_title($title);
echo $url_title;

Detta skulle eka ut Whats-wrong-with-CSS, alltså utan mellanslag och apostrofer. Problematiken kommer när man vill göra om en sträng som innehåller svenska tecken eller accenter.

$title = "Jag håller med";
$url_title = url_title($title);
echo $url_title;

Detta skulle bara eka ut Jag-h, allt från och med det svenska tecknet strippas bort, vilket naturligtvis inte är önskvärt. Som tur är kan man i Codeigniter åsidosätta de inbyggda funktionerna med sina egna om man vill, genom att skapa en egen helper i katalogen application/helpers/, exempelvis better_helper.php. I den här filen lägger vi en funktion med samma namn som den inbyggda, i detta fall url_title. Nu kommer vår funktion i better_helper.php att användas istället för den inbyggda. Vi måste även se till att ladda vår nya helper innan URL Helper, annars kommer vår nya funktion inte att fungera.

Vår nya funktion som ska ligga i better_helper.php och som min kollega Jocke ligger bakom, ser ut så här:


/**
* Create better url_titles
*/
if ( ! function_exists(‘url_title’))
{
 function url_title($str, $separator = ‘dash’)
 {
  $separator = ($separator == ‘underscore’) ? ‘_’ : ‘-’;
  $str = strtolower(htmlentities($str, ENT_COMPAT, ‘UTF-8′));
  $str = preg_replace(‘/&(.)(acute|cedil|circ|grave|ring|tilde|uml);/’, “$1″, $str);
  $str = preg_replace(‘/([^a-z0-9]+)/’, $separator, html_entity_decode($str, ENT_COMPAT, ‘UTF-8′));
  $str = trim($str, $separator);
  return $str;
 }
}
// ————————————————————————

Den här funktionen gör om svenska tecken till a respektive o, samt tar bort accenter, så om vi kör samma kod igen får vi följande.

$title = "Jag håller med";
$url_title = url_title($title);
echo $url_title;

Detta ekar ut Jag-haller-med, vilket är vad vi vill ha. Tack Jocke 🙂