Artykuł

kwi 16 2011
0

Powiadomienie o zdarzeniu polubienia wpisu na Facebooku

W ubiegłym tygodniu, postanowiłem iść z duchem czasu i jeszcze bardziej zintegrować moją stronę z Facebookiem. W tym celu, przy wykorzystaniu XFBML (czyli Facebookowe API), dodałem możliwość polubienia samej strony jak i konkretnych wpisów z poziomu bloga. O tym ilu użytkowników polubiło blog, łatwo się dowiedzieć bezpośrednio z poziomu fanpage'a. Niestety nie mamy takich informacji, na temat liczby polubień, każdej z podstron. Możemy co prawda co jakiś czas wejść każdą z nich i to sprawdzić... Ale od czego mamy Facebookowe API, PHP oraz jQuery:)

Facebook API - poznajmy się

Facebook otacza nas zewsząd. A czemu i jak to robi? A no właśnie, dzięki świetnie napisanemu, wszędobylskiemu API;) Pełną dokumentację, można znaleźć tutaj. Nas interesować będzie temat obsługi zdarzeń, a konkretnie tego, które wyzwalane jest przy akcji lubienia czegoś.

Generalnie kod obsługi zdarzeń (z ang. event), prezentuje się następująco (JavaScript):

FB.Event.subscribe('event', function(response) {
  // zrób coś z odpowiedzią
});

Gdzie jako event, należy rozumieć jedno z poniższych zdarzeń:

  • auth.login - zdarzenie uruchamiane przy logowaniu na FB
  • auth.logout - zdarzenie uruchamiane przy wylogowywaniu z FB
  • auth.prompt - zdarzenie uruchamiane gdy użytkownik musi się zalogować po naciśnięciu przycisku Like
  • auth.sessionChange - zdarzenie uruchamiane przy zmianie sesji
  • auth.statusChange - zdarzenie uruchamiane przy zmianie statusu
  • xfbml.render - zdarzenie uruchamiane po zakończeniu funkcji FB.XFBML.parse()
  • edge.create - zdarzenie uruchamiane przy polubieniu (fb:like)
  • edge.remove - zdarzenie uruchamiane gdy użytkownik przestaje coś lubić (fb:like)
  • comment.create - zdarzenie uruchamiane gdy użytkownik dodaje komentarz (fb:comments)
  • comment.remove - zdarzenie uruchamiane gdy użytkownik usuwa komentarz (fb:comments)
  • fb.log - zdarzenie logowania

Nas oczywiście najbardziej interesować będzie zdarzenie edge.create, które z pomocą jQuery, zaraz ładnie sobie obsłużymy:)

Obsługa zdarzenia za pomocą jQuery

Wiemy już jak wygląda obsługa zdarzenia za pomocą JavaScript (patrz poprzedni akapit), wiemy też, że zdarzenie zwraca zmienną response, ale nie wiedzieliśmy dotychczas, że w tej zmiennej znaleźć może się adres URL polubionego elementu. Uzbrojeni w taką wiedzę, możemy zrobić już pewien pożytek z tymi informacjami. Zaczniemy od tego, że po przechwyceniu zdarzenia, wyślemy adres URL, do kodu PHP, który już dalej się z nim rozprawi. Ponieważ zadanie ma się odbywać w tle, nie będziemy potrzebowali żadnej funkcji success, error itp. Musimy po prostu wysłać URL i tyle. Nic na samej stronie się nie zmienia. Oto konieczny kod:

FB.Event.subscribe('edge.create', function (sResponse) {
    if (sResponse) {
        $.ajax({
            type: "POST",
            url: "index.php",
            data: "action=facebooklike&url=" + sResponse, 
            async: true
        });	
    }
});

Kod nie mógłby by być prostszy;) Wysyłamy asynchronicznie komendę facebooklike wraz z URLem do pliku index.php (czytaj więcej na temat Ajaxa i jQuery). Resztą zajmiemy się już po stronie serwera;)

Obsługa Facebook like w PHP

Czas najwyższy na kod PHP. W kodzie PHP, musimy najpierw obsłużyć nadchodzące żądanie post. Zapewne możemy skorzystać z mniej więcej takiej konstrukcji:

<?php
//...
$sFormAction = $_POST['action'];
switch($sFormAction)
{
	case 'addcomment':
		$this->AddCommentCmd();
		break;
	//...
	case 'facebooklike':
		$this->FacebookLikeCmd();
		break;				
}
//...
?>

Jest to oczywiście pewien wycinek istniejącej klasy, dlatego należy złapać ideę. Odbieramy żądania post i zmienną action przypisujemy do zmiennej lokalnej. Następnie za pomocą instrukcji switch, sprawdzamy jaka to akcja i wykonujemy odpowiednie działanie - czytaj uruchamiamy przeznaczoną do tego zadania funkcję np. FacebookLikeCmd.

Wewnątrz funkcji, powinniśmy odebrać URL i podjąć jakieś decyzje co do niego. Przykładowa implementacja tej funkcji może wyglądać tak:

<?php
//...
private function FacebookLikeCmd()
{
	$this->SendEmail('Nowy Facebook Like', 'URL '.$_POST['url']. 
		' otrzymał nowy like.', 'noreply@altcontroldelete.pl');
}
//...
?>

Kolejne wywołanie funkcji? Można dostać zawrotu głowy;) Wysłanie e-maila z powiadomieniem może być tylko jedną z wielu akcji jakie możemy uczynić. Możemy stosowną informację również odnotować np. w bazie danych itp. Przyjrzyjmy się jednak funkcji, która wyśle dla nas e-mail (warunkiem koniecznym jest obsługa funkcji mail na serwerze, sprawdzić możemy to przez PHP Info):

<?php
//...
private function SendEmail($sSubject, $sContent, $sFrom)
{
	if('' == $sFrom)
	{
		$sFrom = 'noreply@altcontroldelete.pl';
	}
	$sTo = 'moj@mail.pl';
	$sEmailMessage = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="font-size: 10pt; font-family: Arial; background-color: #FFF; color: #000;">'; 
	$sEmailMessage .= $sContent;
	$sEmailMessage .= '</body></html>';
	$sHeaders  = "MIME-Version: 1.0\n";
	$sHeaders .= "Content-type: text/html; charset=utf-8\n";
	$sHeaders .= "Content-Transfer-Encoding: 8bit\n";
	$sHeaders .= "From: $sFrom\n";
	return(@mail($sTo, $sSubject, $sEmailMessage, $sHeaders));
}
//...
?>

Wielkiej, magicznej sztuki to tu raczej nie ma, ale przyjrzyjmy się bliżej temu fragmentowi. Do funkcji przekazujemy temat, treść oraz adres nadawcy. Jeśli adres nadawcy jest pusty, możemy skorzystać z domyślnego. Następnie określamy adres docelowy, później sklejamy treść oraz nagłówki. Punktem finalnym, jest wywołanie funkcji mail, ze wszystkim tym co do tej pory skleiliśmy;) Można jeszcze pomyśleć o różnych zabezpieczeniach, choć w tym przypadku, nie jest to operacja, w którą ingeruje użytkownik. I to właściwie tyle co chciałem w tym wpisie przekazać;)

P.S. mam nadzieję, że po tym wpisie moja skrzynka zostanie zasypana... oczywiście informacją o nowych lubiących;)

Data ostatniej modyfikacji: 05.06.2011, 17:21.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus