Autor wpisu: batman, dodany: 11.03.2010 07:54, tagi: internet
Autor wpisu: batman, dodany: 09.03.2010 18:00, tagi: zend_framework
Autor wpisu: stormfly, dodany: 09.03.2010 14:48, tagi: php, sql
Autor wpisu: batman, dodany: 08.03.2010 08:00, tagi: internet
Autor wpisu: Vokiel, dodany: 07.03.2010 21:30, tagi: css, jquery, javascript
Tak jak zaplanowałem na końcu wpisu The Small Calendar – jQuery + PHP w praktyce, postanowiłem stworzyć systemowy (windowsowy) gadżet z The Small Calendar. W tym wpisie postaram się przybliżyć tajniki tworzenia takowych gadżetów. Gadżety pojawiły się wraz z Vistą – jako element sidebar’a, w Windows 7 są już autonomicznymi programikami, które mogą być porozrzucane wszędzie na pulpicie.
Pierwsze kroki
Platforma gadżetów Windows jest frameworkiem dla tworzenia i hostowania mini-aplikacji. Tworzenie aplikacji odbywa się niemalże tak samo, jak zwykłych stron internetowych. Do wykorzystania są technologie (x)HTML, CSS, JavaScript, JScript, VBscript. Oczywiście dołączanie gotowych bibliotek jest możliwe, w tym przykładzie pokażę jak łatwo można skorzystać z biblioteki jQuery.
Katalog przechowywania
Gadżety są przechowywane w konkretnym katalogu. Rozpoczynając tworzenie nowego gadżetu katalog najlepiej utworzyć smodzielnie (później, po zakończeniu prac utworzony gadżet będzie się sam instalował). Folder przechowywania gadżetów w Windows 7: %localappdata%\Microsoft\Windows Sidebar\Gadgets\. Czyli dla użytkownika Vokiel będzie to np: C:\Users\Vokiel\AppData\Local\Microsoft\Windows Sidebar\Gadgets\. W tym katalogu należy utworzyć folder dla danego gadżetu, nazwę kończąc na .gadget. W naszym przypadku będzie to TheSmallCalendar.gadget.
Manifest
Plik gadget.xml opisuje zawartość paczki, czyli gadżetu. Zawiera podstawowe informacje na temat dodatku, które później widoczne są na ekranie gadżetów.
Tworzony przeze mnie kalendarz zawiera następujący opis:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8" ?> <gadget> <name>The Small Calendar</name> <namespace>vokiel.widgets</namespace> <version>1.0.2</version> <author name="Vokiel"> <info url="http://blog.vokiel.com/the-small-calendar-jquery-php-w-praktyce" /> <logo src="img/icon.png" /> </author> <copyright>© Vokiel | vokiel.com</copyright> <description>To jest mały kalendarz, który pozwala sprawdzić dzień tygodnia dla wybranej daty. Ten kalendarz jest inny niż wszystkie, posiada tylko jeden blok dni!</description> <icons> <icon height="48" width="48" src="img/TheSmallCalendar_48x48.png" /> </icons> <hosts> <host name="sidebar"> <base type="HTML" apiVersion="1.0.0" src="TheSmallCalendar.html" /> <permissions>Full</permissions> <platform minPlatformVersion="1.0" /> <defaultImage src="img/TheSmallCalendar_48x48.png" /> </host> </hosts> </gadget> |
Opisywanie szczegółów zawartości tego pliku nie jest konieczne, znaczniki XML są tak dobrane, iż same w sobie są dostatecznym opisem. Najważniejszą rzeczą w tym pliku jest wskazanie pliku głównego gadżetu, w tym przypadku jest to TheSmallCalendar.html, ten plik zostanie otwarty przy starcie aplikacji.
Wynik opisu zawartego w powyższym listingu kodu przedstawia się następująco:
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:
Kanał ATOM


