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

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*