flickr.com to serwis, w którym można umieszczać własne zdjęcia. Obecnie jest ich bardzo dużo i łatwo znaleźć tam poszukiwane, ciekawe grafiki. Dodatkowej wyjątkowości temu serwisu przysparza pełne API (
dokumentacja) umożliwiające integrację komponentów flickr.com ze stronami www czy zwykłymi aplikacjami komputerowymi.
By korzystać z API flickr.com musimy zarejestrować się i wygenerować klucz API (za darmo,
tutaj). Gdy go mamy możemy przystąpić do dzieła.
Istnieje kilka wrapperów w PHP:
-
PEAR::Flickr_API
-
phpflickr
-
phickr - PHP5
-
Flickr API Parser - PHP5, moja klasa
W poniższym warsztacie wykorzystam kod mojej klasy z wykorzystaniem funkcji
simplexml_load_file dostępnej w PHP5.
z Flickr można rozmawiać poprzez trzy formaty: REST, XML-RPC i SOAP. Najprostszy to REST, który dla zapytań sprowadza się do skonstruowania linka zawierającego określone zmienne, a odpowiedzią są dane w postaci XML. Ten format wykorzystamy w naszej wyszukiwarce zdjęć.
Utwórz w CI konstruktor
flickr.php o kodzie:
class Flickr extends Controller
{
private $api_key;
public function __construct()
{
parent::Controller();
$this->response = array();
$this->api_key = 'TWÓJ KLUCZ API';
}
public function index()
{
echo '<pre>';
print_r(Flickr::_search('kubica'));
}
private function _search($query)
{
$x = simplexml_load_file('http://www.flickr.com/services/rest/?method=flickr.photos.search&text='.$query.'&per_page=20&api_key='.$this->api_key);
$ret['total'] = (int)$x->photos['total'];
foreach($x->photos->photo as $res)
{
$r[] = array('id' => (int)$res['id'], 'title' => (string)$res['title'], 'owner' => (string)$res['owner'], 'secret' => (string)$res['secret'], 'server' => (int)$res['server']);
}
$ret['img'] = $r;
return $ret;
}
}
Wprowadź swój klucz, a następnie wejdź na
index.php/flickr a zobaczysz tablicę z danymi wyszukanych zdjęć. Klasa stosuje nieco modelu obiektowego PHP5 (jeżeli kod i tak wymaga PHP5 to warto używać reszty zalet tej wersji PHP). Różnice to nazwa konstruktora oraz dostępność metod
public - metoda dostępna poza klasą,
private - metoda dostępne tylko i wyłączenie wewnątrz klasy...
Metoda
_search zwraca tablicę, która zawiera serię tablic z wynikami, oto jedna z nich:
[0] => Array
(
[id] => 209252923
[title] => Robert Kubica
[owner] => 93661155@N00
[secret] => d83a760613
[server] => 60
)
id to numer ID zdjęcia,
title to jego tytuł,
owner to identyfikator właściciela zdjęcia (osoby, która je dodała),
server - numer serwera, na którym znajduje się to zdjęcie. Otwierany przez
simplexml_load_file link:
'http://www.flickr.com/services/rest/?method=flickr.photos.search&text='.$query.'&per_page=20&api_key='.$this->api_key
To właśnie przykład żądanie w formacie REST. Wywołuje on metodę API o nazwie
flickr.photos.search (
dokumentacja) i przekazuje dodatkowe parametry. Odpowiedź to XML, który jest parsowany przez wspomnianą funkcję, tworzony jest obiekt, z którego wyciągane są interesujące nas dane. Otrzymujemy tablicę, na której łatwiej operować.
Dla nas ważne jak dostać się do zdjęcia na podstawie tych danych. Bezpośredni link do "strony zdjęcia" wygląda tak:
http://www.flickr.com/photos/OWNER/ID/
Gdzie za "OWNER" i "ID" wstawiamy dane z powyższej tablicy. Oprócz tego mamy dostęp bezpośrednio do grafik. Dla nas potrzebne będą miniatury:
-
75x75: http://static.flickr.com/SERWER/ID_SECRET_s.jpg
-
100x75: http://static.flickr.com/SERWER/ID_SECRET_t.jpg
-
240x180: http://static.flickr.com/SERWER/ID_SECRET_m.jpg
Rozmiary mogą ulegać zmianom dla niektórych grafik.
Gdy znamy postać linków oraz mamy tablicę z wynikami to trzeba to połączyć. Zmień metodę
index konstruktora na:
public function index()
{
$ar = Flickr::_search('kubica');
foreach($ar['img'] as $val)
{
echo '<a href="http://www.flickr.com/photos/'.$val['owner'].'/'.$val['id'].'/"><img src="http://static.flickr.com/'.$val['server'].'/'.$val['id'].'_'.$val['secret'].'_s.jpg" style="margin:5px;" border="0"></a>';
}
}
Odświerz stronę CI (index.php/flickr) a powinieneś zobaczyć coś takiego:

Każda miniaturka prowadzi do "strony zdjęcia". Do pełni szczęścia "wyszukiwarki" przydałby się formularz, w którym można podać frazę, ale to nie problem. Problemem może być powolność tego systemu, jako że łączymy się z innym serwerem, który musi przygotować dane i wysłać odpowiedź. Jeżeli stosujemy jakiś komponent Flick API na stronie to albo powinniśmy go keszować albo ładować asynchronicznie by nie blokować ładowania całej strony. Keszowanie polegałoby na zapisaniu wyniku i używania przez jakiś czas zapisanej kopii a nie wysyłania żądania do flickra. Metoda asynchroniczna to generalnie Ajax (lub ramka), którym zajmiemy się w najbliższym czasie.