PhpFreeChat in Elgg

Dieser Artikel ist veraltert. Aktuelle Versionen dieses Plugins finden sie unter Projekte

Elgg ist das einzige mir bekannte gute Social Network auf OpenSource-Basis. Sobald man die Struktur und die Logik dieser Software verstanden hat, ist es nicht allzu schwer, selbst Module zu schreiben. Dieser Artikel beschäftigt sich mit der Integration des PhpFreeChats in die Elgg-Software als Modul, da auf der Homepage von Elgg kein Chat-Modul zum Download bereit steht.

Als gegeben wird ein vollständig installiertes und funktionierendes Elgg-System angenommen. Ich empfehle, vorher ein Backup aller Elgg-Dateien zu machen.

1. PhpFreeChat downloaden und entpacken
Zunächst downloade den PhpFreeChat von der Website. Achte darauf, dass es sich um die 1.0er Version handelt. Diese ist aktuell nur in der Beta-Version verfügbar, läuft jedoch trotzdem stabil und sicher. Da der PhpFreeChat sowieso ohne Datenbankzugriff arbeitet, besteht auch theoretisch kein Risiko der Gefährdung der gesamten Integrität des Systems. Erstelle in dem Elgg-Installationsordner einen Ordner namens _chat und entpacke den PhpFreeChat darin, sodass die index.php direkt im Ordner _chat liegt.
2. Konfiguration des PhpFreeChat
Hier muss eigentlich nur die Sprache geändert werden. Dies geschieht in der Datei _chat/src/pfcglobalconfig.class.php. Suche die Variable $language und setze sie auf Deutsch (Zeile 125).
var $language = "de_DE-formal";
Sollte dies nicht reichen änder noch Zeile 183 von
pfcI18N::Init(isset($params['language']) ? $params['language'] : '');
in
pfcI18N::Init(isset($params['language']) ? $params['language'] : 'de_DE-formal');
3. Anpassen der .htaccess
Damit das in Elgg oft benutzte Apache-Modul mod_rewrite nicht zu kurz kommt, müssen in der .htaccess im Elgg-Installationsordner folgende Zeilen eingefügt werden.
# Chat (PhpFreeChat)
RewriteRule ^([A-Za-z0-9]+)/chat/?(.+)$ _chat/$2
4. Implementierung als Modul
Bei keinem Elgg-Modul darf die lib.php fehlen. Sie definiert den Chat als Elgg-Modul und integriert ihn. Dazu erstelle im Ordner mod (Unterordner des Elgg-Installationsordner) den Ordner chat und kopiere dort die folgende lib.php hinein.

function chat_pagesetup() {
// register links --
global $profile_id,$PAGE,$CFG,$metatags,$function,$USER;

if (defined("context") && context == "chat") {
$PAGE->menu[]= array (
'name' => 'chat',
'html' => '<li><a href="' . $CFG->wwwroot . $_SESSION['username'] . '/chat/" class="selected">Chat ' .
" (0)".'</a></li>');
} else {
$PAGE->menu[]= array (
'name' => 'chat',
'html' => '<li><a href="' . $CFG->wwwroot . $_SESSION['username'] . '/chat/">Chat' .
" (0)". '</a></li>');
}
}

5. Abschluss
Natürlich kann die index.php im Ordner _chat nicht so bleiben wie sie ist, sonst würde man ja, sollte man den Chat aufrufen, nur den PhpFreeChat ohne ein bisschen Elgg sehen. Außerdem würden nützliche Verbindungen (wie die Definition des Nicknames im PhpFreeChat mithilfe des Elgg-Usernames) nicht möglich sein. Ersetze also zum Abschluss noch die genannte index.php mit folgendem Code.

/*
* Elgg-Bereich
*/

// Run includes
require_once(dirname(dirname(__FILE__))."/includes.php");

run("profile:init");
define('context','chat');
templates_page_setup();

$title = 'Chat :: '.run("profile:display:name");

protect(1);

// define what profile to show
if (empty($profile_id)) {
$profile_id = optional_param('profile_id', -1, PARAM_INT);
}
/*
* PhpFreeChat-Bereich
*/
require_once dirname(__FILE__)."/src/phpfreechat.class.php";
$params = array();
$params["title"] = "Elgg - Chat";
$params["nick"] = user_info('username',$profile_id); // setup the intitial nickname
$params["isadmin"] = true; // just for debug
$params["serverid"] = 'phpfreechat'; // calculate a unique id for this chat
$params["debug"] = false;
$chat = new phpFreeChat( $params );

/*
* Und beide Zusammenwerfen
*/

//Bei $chat->printChat(true) steht true für return, sodass der Chat nicht an die stdout ausgegeben wird
$body = templates_draw(array(
'context' => 'contentholder',
'title' => $title,
'body' => $chat->printChat(true)
)
);

echo templates_page_draw( array(
$title, $body
)
);

Solltest du Probleme bei der Implementierung haben, schreibe einen Kommentar oder wende dich direkt an mich.