Zur Übersicht

Beispiel: Golem.de - Facebook-Applikation

Die Golem.de-Applikation für Facebook bietet die Anzeige der neusten Artikel innerhalb einer Box auf der eigenen Profilseite, und erlaubt zusätzlich die Suche nach Artikeln auf der Canvas-Seite der Applikation bzw. wenn die Applikation als Tab auf der Profilseite eingebunden wurde.

Den Quellcode der Applikation finden Sie unter http://api.golem.de/download/index.php#fbexample. Diese Erläuterung ist keine Einführung in die Nutzung der Facebook-API oder Programmierung von Facebook-Applikation. Wenn Sie diese benötigen, können Sie sich auf http://developers.facebook.com kundig machen.

Die Facebook-Applikation besteht aus einem zentralen Controller-Skript controller.php, das abhängig von einer konkreten Aktion, die geforderte Funktionalität einbindet:

  • page.php für die Anzeige der aktuellen Artikel
  • search.php für die Suche und Anzeige der Suchergebnisse

Dazu kommt helper.php, sie enthält verschiedene Funktionen, die von beiden obigen Skripten verwendet werden. Damit die Belastung möglichst gering bleibt, die Liste der neuesten Artikel in der Profilseiten-Box stets aktuell zu halten, wird ein Cronjob eingesetzt, dessen Code sich in cronjob.php befindet. In config.php sind eine Reihe von Variablen definiert, die an verschiedenen Stellen eingesetzt werden.

Ruft ein Facebook-Nutzer die Applikation auf unter apps.facebook.com/golem_de_demo auf, ruft Facebook seinerseits das Controller-Skript auf.

Im Controller-Skript werden die Facebook-Klassen eingebunden und ein neues Facebook-Objekt erzeugt, dass erforderlich ist, um die Facebook-API anzusprechen.

require_once 'config.php';
require_once 'helper.php';

require_once $GLOBALS['fbPath'].'facebook.php';

...

$facebook = new Facebook($GLOBALS['fbKey'], $GLOBALS['fbSecret']);
Einbindung Facbook-API

Als nächstes erfolgt eine Reihe von Parameterprüfungen. Da bei diesem Aufruf von Facebook keine eigenen Parameter übergeben wurden, wird standardmäßig page.php inkludiert.

In page.php wird als Erstes die Liste der letzten 10 Artikel geladen über die Klasse Golem_Api_Article_Latest.

require_once $GLOBALS['golemPath'].'Golem/Request.php';
require_once $GLOBALS['golemPath'].'Golem/Api/Article/Latest.php';

$request = new Golem_Api_Article_Latest($GLOBALS['golemKey']);

$request->fetch();

$articles = $request->getArticles();
Artikel holen

Mit dieser Liste wird der Code für die Box erstellt bzw. aktualisiert, die auf der Profilseite des Nutzers dargestellt wird.

if( !$GLOBALS['inTab'] ) {

    createProfileBox($GLOBALS['facebook'], $GLOBALS['userId'], $articles);

}
Profilbox erstellen

Der Code für die Box der Profilseite besteht eigentlich nur aus dem FBML-Tag fb:ref mit dem applikationsweit eindeutigen Handle golemde_latestarticle.

function createProfileBox($facebook, $userId, $articles) {

    $contentBox = createBoxArticleList($articles);

    $facebook->api_client->fbml_setRefHandle("golemde_latestarticles", $contentBox);
    $box = '';
    $facebook->api_client->profile_setFBML(null, $userId, null, null, null, $box);

}
Die Funktion createProfileBox()

Facebook ersetzt das Tag durch den eigentlichen HTML-Code der Artikel-Liste, welcher dem Handle zugewiesen wurde, erst bei der Darstellung der Box auf der Profilseite.

Zum Schluss wird die eigentliche HTML-Seite erzeugt und ausgegeben. Dazu werden zwei Hilfs-Funktionen benutzt: createPageHeader() erzeugt den Kopf der Seite mit dem Logo und dem Eingabefeld für die Artikelsuche, und createArticleList() baut aus der übergebenen Artikelliste die HTML-Liste.

$content = createArticleList($articles);

echo createPageHeader();

echo $content;
Ausgabe der Artikelliste

Canvas-Darstellung

Wenn der Benutzer einen Suchbegriff in das Eingabefeld eingibt, wird neben dem Suchbegriff auch der Parameter action übergeben mit dem Wert search. Dadurch wird das Skript search.php eingebunden. Mit der Klasse Golem_Api_Article_Search wird die Suche angeworfen.

$request = new Golem_Api_Article_Search($GLOBALS['golemKey']);

$request->setQuery($query);
$request->setStartIndex($page);

$request->fetch();

$articles = $request->getArticles();
Artikel suchen

War die Suche erfolgreich, wird geprüft ob die Anzahl der Suchergebnisse auf eine Seite passt oder Links zur Navigation zwischen den einzelnen Ergebnisseiten erforderlich sind. Die Links rufen das Controller-Skript mit den entsprechenden Parametern auf.

Die Liste der Ergebnisse wird analog dargestellt zur Artikelliste in page.php. Es kommt lediglich über und unter der Liste die Navigation zwischen den Ergebnisseiten hinzu.

$content = createArticleList($articles);

echo createPageHeader($query);

echo createSearchNav($firstpage, $prevpage, $nextpage, $lastpage);

echo $content;

echo createSearchNav($firstpage, $prevpage, $nextpage, $lastpage);
Suchergebnisse ausgeben

Box auf der Profilseite

Wie oben bereits erwähnt, wird in page.php auch der HTML-Code bzw. vielmehr der FBML-Code für die Applikationsbox auf der Profilseite erzeugt und an Facebook übermittelt. Normalerweise wird der Code von Facebook gespeichert und weitgehend statisch ausgeliefert. Soll die Box aber die aktuellen Artikel darstellen, muss der Inhalt regelmäßig erneuert werden. Der erste Schritt dazu bestand darin, tatsächlich nur ein einzelnes fb:ref-Tag mit einem eindeutigen Handle zu übergeben, statt der generierten HTML-Artikelliste. Diese Liste wurde erst im zweiten Schritt als initialer Wert für das Handle übergeben.

Unter diesen Umständen würde die Box aber nur aktualisiert werden, wenn der Benutzer die Anwendung auf der Canvas-Seite aufsucht, also direkt auf apps.facebook.com/golem_de_demo. Dieses Problem wird durch das Skript cronjob.php gelöst. Es wird auf unserem Server in regelmäßigen Abständen angerufen.

Das Skript holt die aktuelle Liste der Artikel, erzeugt daraus die HTML-Liste und übermittelt sie über die Facebook-API an Facebook.

$facebook = new Facebook($GLOBALS['fbKey'], $GLOBALS['fbSecret']);

$request = new Golem_Api_Article_Latest( $GLOBALS['golemKey'], 10);

$request->fetch();

$articles = $request->getArticles();

updateProfileBox($GLOBALS['facebook'], $articles);
Artikelliste updaten

Da das fb:ref-Handle eindeutig für eine Applikation ist, aber nicht benutzerspezifisch, werden durch diesen einzelnen Aufruf die Profilboxen aller Nutzer der Applikation auf einmal aktualisiert.



Zur Übersicht