Autor wpisu: Athlan, dodany: 07.03.2010 20:12, tagi: php, internet
Ostatnio byłem zobligowany napisać nową klasę tagów do mojego projektu Sypacz.pl, która de facto zachowała stare API, lecz rozszerzyła swoje funkcjonalności, więc w kodzie projektu nie było wielu zmian. Wena spowodowała to, że zacząłem pisać kod od zera.
Cały problem polega na tym, aby napisać na tyle elastyczną klasę tagów, która przyjmie nam zestaw danych, a następnie zaprezentować ją w formie chmury, czym zaopiekuje się arkusz stylów CSS:
Nazwa tagu => Ilość występowań
Parę osób mnie pytało, jak wyciągnąć takie informacje z bazy danych:
SELECT tag_name, COUNT(tag_name) AS tag_times FROM tags GROUP BY tag_name ORDER BY tag_times LIMIT 1, 50
Wykorzystałem obiekt Vframe_Attribute, aby ustandaryzować komponent względem pozostałych w moim frameworku. Jeżeli ktoś nie chce używać obiektu Attribute, może w prosty sposób przekształcić klasę tagów, otrzymując ten sam efekt, deklarując tylko atrybut chroniony protected $_aAttributes = array();
. Temat chmury tagów wydaje mi się na tyle trywialny, że nie ma się co nad nim zbyt wiele rozwodzić, zamieszczę tylko klasę i opiszę krótko w przykładach jej możliwości.
- Vframe_Tagcloud – klasa tagów,
- Vframe_Attribute – pomocnicza klasa atrybutów dla stosu $_aAttributes, dziedziczenie można usunąć i zadeklarować atrybut samemu.
Aby stworzyć nowy obiekt tagów, po prostu wywołujemy konstruktor:
$oCloud = new Vframe_Tagcloud();
Konstruktor nie przyjmuje żadnych argumentów, wiec możemy od razu przejść do podawania obiektowi tagów. W tym miejscu warto nadmienić, że każdy znak jest rozróżniany (ze względów elastycznych), więc jeżeli chcesz, aby Nazwatagu oraz nazwatagu były rozpoznawane jako jeden klucz, wypadałoby użyć funkcji strtolower lub mb_strtolower (dla Multibyte Strings):
foreach($aDataTags as $iKey => $aRow) $oCloud->add(strtolower($aRow['tag_name']), $aRow['tag_times']);
Najistotniejszą częścią klasy jest sposób renderowania chmury, które może działać w dwóch trybach:
- Tryb prosty zwraca nam nazwę tagu oraz jego wagę po przeliczeniu w formie liczby.
- Tryb zaawansowany zwraca nam nazwę tagu oraz tablicę z danymi:
level
– waga tagu po przeliczeniu,count
– ilość występowań, taka jaką podaliśmy,count_percentage
– informacja, w jakiej procentowej części ilości występowań znajduje się tag, przyjmując za 100% tag, który występuje najczęściej.
Aby w prosty sposób wyrenderować chmurę tagów, używamy poniższego przykładu:
$aDataTagsRender = $oCloud->render();
Najczęściej używa się trybu prostego. Oba tryby są dalej rozbudowane, bowiem mamy możliwość zdefiniowania zakresu i dokładności wag tagów. Domyślnie wagi tagów zawierają się pomiędzy 1, a 10. Możemy na przykład przyjąć, że najmniejszą wagą jest liczba 3, największą 5, a precyzja wag tagów to 2 miejsca po przecinku: