Aplikacja w Facebooku
Wstępne założenia: aplikacja będzie w iframe, będzie wywoływać ajaxa, pisać na ścianie oraz wyświetlać facebookowe okna z informacjami (zamiast alertów).
Integracja z Facebookiem
Na stronie (np. przed ) umieszczamy kod osadzający facebookowe skrypty:
<div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({ appId: 'ID_APLIKACJI', session : <?php echo json_encode($session); ?>, status: true, cookie: true, xfbml: true}); FB.Event.subscribe('auth.login', function(response) { window.location.reload(); }); FB.Canvas.setSize(); }; (function() { var e = document.createElement('script'); e.async = true; e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; document.getElementById('fb-root').appendChild(e); }()); </script>
Div #fb-root posłuży jako kontener pod javascript, który zostanie wstawiony po załadowaniu się strony (document.ready). Następnie zostanie wywołana funkcja FB.init. Najważniejsze w tej funkcji jest appId (określające numer aplikacji) oraz session (dzięki któremu określamy, że użytkownik jest zalogowany i można wysłać mu tekst na ścianę). FB.Event.subscribe zadba o zapytanie użytkownika o odpowiednie zezwolenia, a FB.Canvas.setSize o dopasowanie ramki do wielkości strony (dzięki czemu nie będą potrzebne suwaki). Jedynym problemem jest uzyskanie zmiennej $session. Na stronie http://github.com/facebook/php-sdk/tree/master/src/ jest plik facebook.php, ściągamy i wgrywamy go obok strony. Następnie na stronie na początku wstawiamy:
<? require 'facebook.php'; $facebook = new Facebook(array( 'appId' => 'ID_APLIKACJI', 'secret' => 'SEKRETNY_KLUCZ', 'cookie' => true, )); $session = $facebook->getSession(); if (!$session) { $url = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0 )); echo "<script type='text/javascript'>top.location.href = '$url';</script>"; exit() ; } ?>
ID_APLIKACJI oraz SEKRETNY_KLUCZ bierzemy z panelu informacyjnego aplikacji. Całość działa automatycznie, a w ostateczności dostajemy odpowiednie dane w zmiennej $session.
Publikowanie na ścianie
Utworzenie wiadomości wymaga wywołania FB.ui z odpowiednimi parametrami. Całość może wyglądać następująco:
<script type="text/javascript"> FB.ui({ display: "dialog", method: 'stream.publish', message: '', attachment: { name: '', caption: '', description: (''), media: [ {'type': 'image','src': 'ADRES_OBRAZKA','href': 'ADRES_DOCELOWY'} ], href: 'ADRES_DOCELOWY' }, action_links: [ { text: '', href: '' } ], user_message_prompt: '' }, function(response) { if (response && response.post_id) { // dobrze } else { // źle } } ); </script>
Display określa sposób przedstawienia okienka (według informacji znalezionych na forach dostępne są wartości: dialog, iframe, popup). To ostatnie powoduje wyświetlenie zwykłego okienka popup. Tak samo stanie się przy próbie wyświetlenia okienka bez podania wartości session w FB.Init. Media w załączniku (attachment) pozwala określić element do dołączenia do wiadomości (obrazek, plik muzyczny lub wideo). W przypadku obrazków występuje ograniczenie wielkości.
Okna z wiadomościami
Informacje z publikowania na ścianie można wyświetlać jako alerty, ale nie wygląda to zbyt dobrze. Warto napisać własną funkcję, która użyje okienek facebookowych.
<script type="text/javascript"> function show_dialog( title, message ) { FB.UIServer.Methods["fbml.dialog"].size = {width:280, height:60}; FB.ui({ method:'fbml.dialog', display: 'dialog', fbml: ( '<div class="pop_content" id="pop_content">'+ '<h2 class="dialog_title"><span>'+title+'</span></h2>'+ '<div class="dialog_content">'+ '<div class="dialog_body">'+message+'</div>'+ '</div>'+ '</div>' ), width: '280px', height: '60px' }, function(response) { }); } </script>
Domyślne okienko na Facebooku ma wymiary ustawione na sztywno, więc nawet jeśli treści jest niewiele, to zajmuje ono sporo miejsca. Przy pomocy FB.UIServer.Methods[„fbml.dialog”].size określamy wielkość jaką powinno mieć okienko. Jeśli będziemy pokazywać więcej okien, to warto wcześniej zapamiętać domyślną wartość (tak na wszelki wypadek). Parametry width i height dla FB.ui dodałem tak na wszelki wypadek (być może nie potrzebnie). Gdy już mamy gotową funkcję możemy wstawić ją w miejsce oznaczone wcześniej jako „// dobrze” i „// źle” np:
show_message( 'Dodanie wiadomości', 'Udało się dodać wiadomość !' );
Ajax
jQuery wzięte z code.google (CDN) działa bez problemów. Dotyczy to także ajaxa. Bez problemu można wywoływać zapytania typu:
var id_obrazka ; $.ajax({ url: 'http://adres/rob_obrazek.php', data: 'dane='+dane, type: 'GET', async: false, success: function(data) { id_obrazka = data ; } });
Ważne jest, żeby adres był identyczny jak adres strony w iframe. Jeżeli strona znajduje się w miejscu http://xxx.yy, to błędem będzie wpisanie http://www.xxx.yy (zostanie wykonana operacja, ale nie otrzymamy odpowiedzi, a na dodatek odpali się zdarzenie obsługi błędu). Przy przekazywaniu danych można dorzucić kilka facebookowych zmiennych np: fb_sig_user (id użytkownika) albo session (dane sesyjne, na podstawie których użytkownik jest autoryzowany). Przydadzą się, gdy będziemy chcieli powiązać danego użytkownika z wywołaniem.
Zakładki
Możliwe jest osadzenie zakładek (fb:tabs) na stronie z iframe:
<fb:serverFbml style="height:20px; padding-bottom:20px; overflow: hidden; display: block;"> <script type="text/fbml"> <fb:fbml> <fb:tabs> <fb:tab-item href='http://apps.facebook.com/adres_aplikacji/?akcja=poza' title='Wyskocz poza aplikację' /> <fb:tab-item href='http://apps.facebook.com/adres_aplikacji/?akcja=tutaj' title='Tu jesteś' selected='true'/> </fb:tabs> </fb:fbml> </script> </fb:serverFbml>
Tylko takie rozwiązanie udało mi się znaleźć i nie spełnia ono swojej funkcji zbyt dobrze (aplikacja jest w iframe, zakładki wstawiane są do jeszcze jednego iframe). Ogółem efekt kliknięcia jest nieciekawy (w najlepszym wypadku zobaczymy logo facebooka w miejscu menu).
Mniej kłopotliwym rozwiązaniem jest wstawienie diva z ul i odpowiednimi linkami (całość odpowiednio ostylowana) i przekierowania javascriptowego na samym początku strony:
<? if( $_GET['akcja'] == 'poza' ) { ?><script type="text/javascript"> top.location.href = 'http://www.facebook.com/jakaś_strona/' ; </script> <? exit() ; } elseif( $_GET['akcja'] == 'tutaj' ) { ?> <script type="text/javascript"> top.location.href = 'http://apps.facebook.com/adres_aplikacji/' ; </script> <? exit() ; } ?>
To pozwala wyskoczyć z aplikacji, np. na facebookową stronę, którą ta aplikacja ma reklamować.
Dodaj komentarz