logo
close

sNews i polskie krzaczki w URL

22 stycznia 2020
webo Komentarze: 0 Kategoria: Skrypty

Jakiś czas temu mendax opisał na swoim blogu kilka alternatywnych CMSów, którymi warto byłoby się zainteresować. Jednym z nich był sNews. W komentarzach do tego wpisu pojawiła się informacja że ma on problemy z polskimi znakami w tytułach, a dokładniej z tworzeniem przyjaznych adresów na ich podstawie – polskie znaki są z nich usuwane. Ponieważ postanowiłem sam postawić kilka stronek na sNews, zainteresowałem się osobiście tą sprawą.

W wersji 1.7 sNews wyświetla pod polem do wpisywania tytułu dodatkowe pole, w którym na bieżąco podczas wpisywania tytułu pojawia się proponowany adres – oczywiście z usuniętymi polskimi znakami. Można więc ręcznie dodać brakujące literki. Lepiej jednak byłoby nie musieć tego robić.

Po przejrzeniu kodu tego CMSa znalazłem funkcję cleanSEF(), która odpowiada za tworzenie adresów URL. Znajduje się ona w pliku snews.php, od linii 3365. Aby sNews poprawnie zamieniał polskie znaki na ich odpowiedniki bez ogonków, należy ją zamienić na następującą wersję:

function cleanSEF($string) {
    $from = array('ą','ć','ę','ł','ń','ó','ś','ź','ż','Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż');
    $to   = array('a','c','e','l','n','o','s','z','z','A','C','E','L','N','O','S','Z','Z');
    $string = str_replace($from, $to, $string);
    $string = preg_replace('/[^a-zA-Z0-9_]/', ' ', $string);
    $string = trim($string);
    $string = preg_replace('/\s+/', '-', $string);
    return strtolower($string);
}

To wszystko – od tego momentu zamiast polskich znaków w adresach będą pojawiać się ich odpowiedniki bez ogonków.

Przy okazji moich testów okazało się też ze sNews nie radzi sobie dobrze na Windows – w adresie pojawiał się backslash, który powodował że adresy nie działały. Rozwiązaniem okazało się zamienianie backslashy na shashe w ścieżce do skryptu. W tym celu trzeba dodać jedną linię do funkcji site() (linia 39 w pliku snews.php), tak aby wyglądała następująco:

function site() {
    $host = 'http://'.$_SERVER['HTTP_HOST'];
    $directory = dirname($_SERVER['SCRIPT_NAME']);
    $directory = str_replace('\\', '/', $directory);
    $website = $directory == '/' ? $host.'/' : $host.$directory.'/';
    return $website;
}

Komentarze

Komentarz

Komentując, akceptujesz Politykę prywatności