polskie znaki w adresach Joomla

Joomla 1.5 ma opcję tworzenia przyjaznych adresów dla wyszukiwarek (ang. SEF URL’s – Search Engine Friendly URL’s) jednakże posiada ona pewną niedoróbkę związaną z tworzeniem aliasów dla tytułów zawierających polskie znaki. Przy tworzeniu aliasu dla tytułu Joomla opuszcza po prostu wszystkie polskie znaki przykładowo nasz artykuł jest zatytułowany
Pchnąć w tę łódź jeża lub ośm skrzyń fig
powinien zostać przekształcony w alias w postaci tranliterowanej
pchnac-w-te-lodz-jeza-lub-osm-skrzyn-fig
lub z rzeczywistymi polskimi znakami
pchnąć-w-tę-łódź-jeża-lub-ośm-skrzyń-fig
natomiast domyślnie Joomla tworzy nam taki oto alias
pchn-w-t-od-jea-lub-om-skrzy-fig
przez co staje się nieczytelny i nie jest zgodny z oryginałem oraz traci swoje znaczenie.

Brak polskich znaków w aliasach Joomla

Błędnie utworzony alias przez Joomlę 1.5 z opuszczonymi polskimi znakami

Wersje Joomli 1.6 oraz Joomla 1.7 są wolne od tego braku i tworzą one poprawne aliasy.

Jak na razie adresy powinny składać się tylko ze znaków z tablicy ASCII a polskie ogonki powinny zostać zamienione na ich graficzne odpowiedniki bez nich np. ę > e itd. W adresach nie powinno być spacji ani innych znaków niedrukowanych są zastępowane przez myślniki. Polskie znaki mogą występować w adresie ale zaleca się aby strona w takim wypadku pracowała w kodowaniu UTF-8 np. Joomla.

Aktywowanie przyjaznych adresów w Joomli

Nasz serwer musi mieć załadowany i uruchomiony moduł mod_rewrite na serwerze Apache. Następnie w głównym katalogu Joomli umieszczamy plik .htaccess o treści:

# @version $Id: htaccess.txt 21064 2011-04-03 22:12:19Z dextercowley $
#Zakomentuj poniższą linie jeśli pojawiają się błędy
Options +FollowSymLinks
 
RewriteEngine On
RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR]
RewriteCond %{QUERY_STRING} base64_encode[^(]*\([^)]*\) [OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2})
RewriteRule .* index.php [F]
 
#Odkomentuj i ustaw odpowiednio poniższą linię jeśli korzystasz z wirtualnych folderów
#RewriteBase /
 
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteCond %{REQUEST_URI} !^/index\.php
RewriteCond %{REQUEST_URI} (/[^.]*|\.(php|html?|feed|pdf|raw))$ [NC]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L]

lub zmieniamy nazwę htaccess.txt dostarczanego w paczce.

Potem przechodzimy na Zaplecze lub jak kto woli do panelu administratora, wybieramy kolejno Witryna ≫ Konfiguracja i w sekcji Optymalizacja dla wyszukiwarek widzimy ustawienia, które nas interesują:

Przyjazne adresy Joomla Ustawienia

Ustawianie przyjaznych adresów w Joomli

Kolejne opcje:

  1. Proste adresy – czy stosować przyjazne adresy, wybieramy “Tak”
  2. Korzystaj z mod_rewrite – jeśli dodaliśmy odpowiednie wpisy w .htaccess to zaznaczamy “Tak” (zalecane: “Tak”)
  3. Adresy z przyrostkiem – decyduje o tym czy dodawać na końcu adresu suffix odpowiadający typowi dokumentu. Dla zwykłych podstron byłby to .html (takie rozszerzenie pliku w adresach, decyzja dowolna)

Po wybraniu odpowiednich opcji kliknij w prawym górnym rogu Zapisz lub Zastosuj.

Polskie znaki w aliasach Joomli

Ażeby poprawić tworzenie aliasów w Joomli i polskie znaki były zamieniane na swoje odpowiedniki bez ogonków należy zmodyfikować jeden plik. Poniższą funkcję sam stworzyłem, transliteruje ona dużo więcej niźli tylko polskie znaki np. niemieckie znaki. Tablice są zapisane w formacie szesnastkowym dzięki czemu przy modyfikacji pliku nie musisz pamiętać aby zapisywać go w kodowaniu UTF-8 (bo dla tego kodowania są stworzone tablice).

Polskie znaki w adresach Joomla

Podmienione polskie znaki w adresie Joomli

Otwórz plik filteroutput.php znajdujący się w katalogu /libraries/jooml/filter/. Znajdź w nim:

	function stringURLSafe($string)
	{
		//remove any '-' from the string they will be used as concatonater
		$str = str_replace('-', ' ', $string);
 
		$lang =& JFactory::getLanguage();
		$str = $lang->transliterate($str);
 
		// remove any duplicate whitespace, and ensure all characters are alphanumeric
		$str = preg_replace(array('/\s+/','/[^A-Za-z0-9\-]/'), array('-',''), $str);
 
		// lowercase and trim
		$str = trim(strtolower($str));
		return $str;
	}

a następnie zamień na:

	function stringURLSafe($string) {
		$map1 = array(
			"\xc4\x84", "\xc5\x81", "\xc4\xbd", "\xc5\x9a",
			"\xc2\xa7", "\xc5\xa0", "\xc5\x9e", "\xc5\xa4",
			"\xc5\xb9", "\xc5\xbd", "\xc5\xbb", "\xc4\x85",
			"\xc5\x82", "\xc4\xbe", "\xc5\x9b", "\xc5\xa1",
			"\xc5\x9f", "\xc5\xa5", "\xc5\xba", "\xc5\xbe",
			"\xc5\xbc", "\xc5\x94", "\xc3\x81", "\xc3\x82",
			"\xc4\x82", "\xc3\x84", "\xc4\xb9", "\xc4\x86",
			"\xc3\x87", "\xc4\x8c", "\xc3\x89", "\xc4\x98",
			"\xc3\x8b", "\xc4\x9a", "\xc3\x8d", "\xc3\x8e",
			"\xc4\x8e", "\xc4\x90", "\xc5\x83", "\xc5\x87",
			"\xc3\x93", "\xc3\x94", "\xc5\x90", "\xc3\x96",
			"\xc3\x97", "\xc5\x98", "\xc5\xae", "\xc3\x9a",
			"\xc5\xb0", "\xc3\x9c", "\xc3\x9d", "\xc5\xa2",
			"\xc3\x9f", "\xc5\x95", "\xc3\xa1", "\xc3\xa2",
			"\xc4\x83", "\xc3\xa4", "\xc4\xba", "\xc4\x87",
			"\xc3\xa7", "\xc4\x8d", "\xc3\xa9", "\xc4\x99",
			"\xc3\xab", "\xc4\x9b", "\xc3\xad", "\xc3\xae",
			"\xc4\x8f", "\xc4\x91", "\xc5\x84", "\xc5\x88",
			"\xc3\xb3", "\xc3\xb4", "\xc5\x91", "\xc3\xb6",
			"\xc5\x99", "\xc5\xaf", "\xc3\xba", "\xc5\xb1",
			"\xc3\xbc", "\xc3\xbd", "\xc5\xa3",
		);
		$map2 = array(
			"\x41", "\x4c", "\x4c", "\x53", "\x53", "\x53",
			"\x53", "\x54", "\x5a", "\x5a", "\x5a", "\x61",
			"\x6c", "\x6c", "\x73", "\x73", "\x73", "\x74",
			"\x7a", "\x7a", "\x7a", "\x52", "\x41", "\x41",
			"\x41", "\x41", "\x4c", "\x43", "\x43", "\x43",
			"\x45", "\x45", "\x45", "\x45", "\x49", "\x49",
			"\x44", "\x44", "\x4e", "\x4e", "\x4f", "\x4f",
			"\x4f", "\x4f", "\x78", "\x52", "\x55", "\x55",
			"\x55", "\x55", "\x59", "\x54", "\x73\x73",
			"\x72", "\x61", "\x61", "\x61", "\x61", "\x6c",
			"\x63", "\x63", "\x63", "\x65", "\x65", "\x65",
			"\x65", "\x69", "\x69", "\x64", "\x64", "\x6e",
			"\x6e", "\x6f", "\x6f", "\x6f", "\x6f", "\x72",
			"\x75", "\x75", "\x75", "\x75", "\x79", "\x74",
		);
		$string = str_replace($map1, $map2, $string);
		$string = strtolower($string);
		$string = preg_replace('#[\\W]{1,}#', '-', $string);
		$string = trim($string, '-');
		return $string;
	}
Polskie znaki w adresach Joomla

Zamienione polskie znaki w pasku adresu

Zapisz plik i wyślij na serwer FTP, zamień za dotychczas istniejący. Od tej pory wszystkie nowe aliasy będą poprawnie tworzone z podmienionymi polskimi znakami.

Rzeczywiste polskie znaki w adresach Joomli

Jeśli chcesz aby polskie znaki wyświetlały się w pasku adresu to skorzystaj z tej opcji. Będą akceptowane wszystkie znaki z tablicy $map1 = array();, aktualnie obsługuje ona znaki w języku:

  • polskim
  • słoweńskim
  • bośniackim
  • węgierskim
  • słowackim
  • serbsko–chorwackim
  • czeskim
  • chorwackim
  • rumuńskim
  • górno oraz dolnołużyckim
  • serbskim (w transkrypcji łacińskiej)

Mimo tego, że tablica ta pokrywa znakami diakrytycznymi z kodowania ISO-8859-2 a kodowanie to z definicji nie wspiera języka niemieckiego to i tak pokrywa wszystkie znaki z tegoż języka. W skrócie: obsługuje także niemieckie znaki.

Polskie znaki w aliasie Joomla

Polskie znaki w aliasie w Joomli

Tak jak wyżej otwórz plik /libraries/joomla/filter/filteroutput.php i odszukaj:

	function stringURLSafe($string)
	{
		//remove any '-' from the string they will be used as concatonater
		$str = str_replace('-', ' ', $string);
 
		$lang =& JFactory::getLanguage();
		$str = $lang->transliterate($str);
 
		// remove any duplicate whitespace, and ensure all characters are alphanumeric
		$str = preg_replace(array('/\s+/','/[^A-Za-z0-9\-]/'), array('-',''), $str);
 
		// lowercase and trim
		$str = trim(strtolower($str));
		return $str;
	}

podmień na:

	function stringURLSafe($string) {
		$map1 = array(
			"\xc4\x84", "\xc5\x81", "\xc4\xbd", "\xc5\x9a",
			"\xc2\xa7", "\xc5\xa0", "\xc5\x9e", "\xc5\xa4",
			"\xc5\xb9", "\xc5\xbd", "\xc5\xbb", "\xc4\x85",
			"\xc5\x82", "\xc4\xbe", "\xc5\x9b", "\xc5\xa1",
			"\xc5\x9f", "\xc5\xa5", "\xc5\xba", "\xc5\xbe",
			"\xc5\xbc", "\xc5\x94", "\xc3\x81", "\xc3\x82",
			"\xc4\x82", "\xc3\x84", "\xc4\xb9", "\xc4\x86",
			"\xc3\x87", "\xc4\x8c", "\xc3\x89", "\xc4\x98",
			"\xc3\x8b", "\xc4\x9a", "\xc3\x8d", "\xc3\x8e",
			"\xc4\x8e", "\xc4\x90", "\xc5\x83", "\xc5\x87",
			"\xc3\x93", "\xc3\x94", "\xc5\x90", "\xc3\x96",
			"\xc3\x97", "\xc5\x98", "\xc5\xae", "\xc3\x9a",
			"\xc5\xb0", "\xc3\x9c", "\xc3\x9d", "\xc5\xa2",
			"\xc3\x9f", "\xc5\x95", "\xc3\xa1", "\xc3\xa2",
			"\xc4\x83", "\xc3\xa4", "\xc4\xba", "\xc4\x87",
			"\xc3\xa7", "\xc4\x8d", "\xc3\xa9", "\xc4\x99",
			"\xc3\xab", "\xc4\x9b", "\xc3\xad", "\xc3\xae",
			"\xc4\x8f", "\xc4\x91", "\xc5\x84", "\xc5\x88",
			"\xc3\xb3", "\xc3\xb4", "\xc5\x91", "\xc3\xb6",
			"\xc5\x99", "\xc5\xaf", "\xc3\xba", "\xc5\xb1",
			"\xc3\xbc", "\xc3\xbd", "\xc5\xa3",
		);
		$map1 = implode('', $map1);
		$string = mb_strtolower($string, 'UTF-8');
		$string = preg_replace('#[^\\w' . $map1 . ']{1,}#', '-', $string);
		$string = trim($string, '-');
		return $string;
	}
Polskie znaki w aliasach Joomla

Polskie znaki na pasku adresu

Teraz nowe aliasy będą zawierały polskie znaki co jednocześnie spowoduje wyświetlanie polskich znaków w pasku adresu przeglądarki. Mogą występować pewne błędy związane z serwerem, ale nie powinny.

Naprawianie aliasów w Joomli

Zacznij od poprawienia funkcji, zgodnie z wytycznymi wyżej. Potem możesz skasować alias i kliknąć Zapisz lub Zastosuj, zostanie utworzony nowy poprawny. Jest to czasochłonne dlatego też napisałem skrypt, który zaktualizuje wszystkie aliasy automatycznie alias-updater.php na razie nie posiada żadnych limitów dlatego może się wysypać. Poprawia aliasy w tabelach w bazie zawartych w tablicy $tables = array(), jeśli jakiejś brakuje to napisz.

Jeśli chcesz aby poprawił na konkretny format to zamień w nim funkcję stringURLSafe() na którąś z tego wpisu, domyślnie podmienia polskie znaki na czyste odpowiedniki.

Zapisz plik jako alias-updater.php, wgraj do głównego folderu Joomli, wywołaj ten plik i gotowe.

  • Wersja 1.0 – brakuje limitowania zapytań oraz możliwe braki tabel do poprawienia

2 Comments

  1. Dobra robota! Dzieki!

  2. …super, człowieku zrobiłeś dobrą robotę… , należą się duże słowa uznania…pozdrawiam

Dodaj komentarz