O świetności danej encyklopedii internetowej świadczy ilość i jakość znajdujących się tam artykułów. Dlatego nie ma powodu by wstydzić się numerka reprezentującego ile jest stron w naszej wiki. Przeciwnie! Należy się z tym obnosić. A jeszcze lepiej jak robią to nasi użytkownicy. Dlatego w tym poradniku nauczymy się tworzyć dynamiczny obrazkowy banerek, na którym będzie wypisana ilość artykułów na naszej stronie w MediaWiki.
Nasze miejsce pracy
Dla naszych banerków najlepiej przygotować osobny folder. W nim umieśćmy obrazek który będzie podstawą naszego dzieła. Ja dla banerka mojej encyklopedii o grach firmy Valve przygotowałem coś takiego:
Plan jest taki aby pod tytułem strony znajdował się napis n artykuły(ów) o grach Valve gdzie n jest oczywiście liczbą stron. Przed napisaniem tego skryptu musimy jednak zadbać jeszcze o jedną rzecz. Nasz baner będzie generowany w PHP przy każdym zapytaniu. Link do naszego obrazka nie może być jednak linkiem do pliku php, gdyż wtedy nie będzie się wyświetlał w podpisach na forach internetowych. Musimy skorzystać z możliwości jakie daje nam plik .htaccess. Po utworzeniu go w folderze z naszym banerem umieszczaniu w nim poniższy kod:
RewriteEngine On RewriteRule ^baner.png$ generator.php [L]
Ta instrukcja spowoduje, że chociaż adres będzie prowadził do pliku baner.png to serwer będzie zwracał treść z pliku generator.php.
Generowanie obrazka
Teraz możemy przystąpić do pisania skryptu PHP. Tworzymy więc nasz plik generator.php i na samym jego początku łączymy się z bazą naszej wiki
$serverdb='localhost'; //adres serwera bazy danych $dbuser='user'; //uzytkownik bazy danych $dbuserpass='password'; //haslo uzytkownika $db='database'; //nazwa bazy danych $link = mysql_connect ($serverdb, $dbuser, $dbuserpass) or die (mysql_error()); mysql_select_db ($db);
Gdy jesteśmy już połączeni z bazą możemy pobrać informacje o ilości artykułów. Wyciągniemy ta informację ze specjalnych tabel gdzie są przechowywane tego typu statystyki.
$uchwyt = mysql_query ('SELECT ss_good_articles from wiki_site_stats');
$rekord = mysql_fetch_array($uchwyt);
$ilosc = $rekord['ss_good_articles'];
Teraz, gdy ilość artykułów mamy już w w zmiennej $ilosc możemy napisać część kodu, która odmieni wyraz artykuły na potrzeby naszego napisu i złoży cały tekst w całość.
$jednostki = substr($ilosc, strlen($ilosc)-1, 1); if($jednostki == 2 || $jednostki == 3 || $jednostki == 4) $art = 'arykuły'; else $art = 'arykułów'; $tekst = "$ilosc $art o grach Valve";
Gdy to już mamy gotowe nic nie stoi na przeszkodzie by rozpocząć generowanie grafiki.
$image = imagecreatefrompng("baner.png");
$black = imagecolorallocate($image, 0, 0, 0);
imagettftext($image, 10, 0, 250, 45, $black, 'calibri.ttf', $tekst);
Podany kod kolejno wczytuje obrazek baner.png, tworzy indeks koloru czarnego i na końcu nakłada tekst na załadowaną grafikę. Użyta przy ostatniej operacji funkcja imagettftext przyjmuje kolejno jako argumenty zmienną z obrazkiem, rozmiar czcionki, pochylenie fontu w stopniach, współrzędne umieszczenia napisu, link do pliku z czcionką oraz na końcu treść napisu. W tym przykładzie użyliśmy czcionki calibri.ttf, której plik należy również umieścić w folderze z banerem.
W stronę przeglądarki
Aktualnie w zmiennej $image przechowujemy gotowy obrazek. Przed jego wyświetleniem musimy jednak zamienić co najmniej jedną informację w nagłówku wysyłanym do przeglądarki. Wersja minimalistyczna kodu odpowiedzialnego za wyświetlanie baneru wygląda tak:
header("Content-type: image/jpeg");
imagejpeg($image);
W tym przypadku informujemy tylko, że przesyłana treść jest grafiką, a nie tekstem jak wskazywałoby jego pochodzenie z pliku .php. Później przesyłamy sam obrazek. Jeśli zaś chcemy aby informacje wyświetlane na banerze były zawsze aktualne, musimy wymusić na przeglądarce by za każdym razem na nowo go pobierała z serwera. Użyjemy do tego tricku polegającego na wyłączeniu cachowania grafiki oraz ustawieniu przeszłej daty wygaśnięcia jej ważności.
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Content-type: image/jpeg");
imagejpeg($image);
Podsumowanie
Oto gotowy efekt nasze pracy:
Fajnie wygląda i co najważniejsze spełnia swoje zadania. Należy jednak pamiętać by nie nadużywać opcji wyłączania cachowania przy dużych serwisach by nie obciążyć bazy danych. A przy naprawdę dużych encyklopediach internetowych zalecane jest napisanie skryptu cachującego liczbę artykułów.
Na koniec załączam paczkę z wszystkimi plikami powyższego baneru.





Brak komentarzy do tego artykułu