2012-04-08 7 views
2

Ich erstelle eine Funktion, die ein Protokoll darüber erstellt, was mein Benutzer in meine Datenbank getan hat, damit ich dann einen Aktivitätsfeed für den Aktivitätsfeed anderer Benutzer erstellen kann.Struktur des Aktivitätsfeeds

Was ich es mir vorstellen, so weit zu ähneln.

Aktivität Tisch

id | user_id | source | source_id | timestamp 

Beispiel Eingabe

1 | 1 | photo_upload | 54 | 1333906150 //54 being the ID of the photo in my DB 
2 | 1 | follow | 2 | 1333906159 // 2 being the id of a user 

So kann ich einfach Informationen aus der Datenbank für einen Benutzer Aktivität ziehen kann, "user_id = {$followers} sie dann zeigen, je nachdem, was ihre Quelle zeigt zB das Bild für ein Foto_upload.

BEARBEITEN Was wäre der beste Weg, verschiedene Arten des Feeds anzuzeigen. Dies ist, was ich derzeit habe, aber es scheint ein bisschen viel.

Hat jemand irgendwelche Möglichkeiten, dies zu verbessern?

+0

Die offensichtlichste Verbesserung ist _NOT_ einen Unix-Zeitstempel zu verwenden, sondern eine [richtige DATETIME- Spalte] (http://dev.mysql.com/doc/refman/5.0 /de/datetime.html). –

+0

Sind Sie bisher auf Probleme gestoßen? – Lix

+0

@Micheal Warum würden Sie das empfehlen? – Harry

Antwort

2

Eine abstrakte Klasse beschreibt ein FeedItem Typ:

abstract class Application_Feed_Item_Abstract { 
    protected $_item; 

    public function __construct($itemData) { 
     $this->_item = $itemData; 
    } 

    abstract public function render(); 
} 

Implementieren Sie diese Klasse für verschiedene Arten von Inhalten:

class Application_Feed_Item_Photo extends Application_Feed_Item_Abstract { 
    public function render() { 
     //Custom rendering logic for a Photo 
     return '<div>Watch my <a href="photo.php?id=' . $this->_item['source_id'] . '">photo</a></div>'; 
    } 
} 

class Application_Feed_Item_Follow extends Application_Feed_Item_Abstract { 
    public function render() { 
     //Custom rendering logic for a Follower 
     return '<div>I got a new <a href="photo.php?id=' . $this->_item['source_id'] . '">follower</a></div>'; 
    } 
} 

Also, wenn Sie einen Datensatz ziehen, Sie sind in der Lage ein Renderer erstellen Object on the Fly, abhängig von der Art des Feeditems:

//Pull items from database and store them as an Array or other iterable object. 
//Here i assume we call this collection of rows from the database $feeditems 

//Mapping of source to renderer classes 
$types = array(
    "photoupload" => "Application_Feed_Item_Photo", 
    "follow" => "Application_Feed_Item_Request", 
    "somethingelse" => "Application_Feed_Item_Somethingelse" 
); 

//Process every item 
foreach($feeditems as $item) { 
    $type = $item['source']; 
    if(!array_key_exists($type, $types)) { 
     throw new Exception("Unsupported feeditem type."); 
    } 
    $type = $types[$type]; 

    $renderer = new $type($item); 
    echo $renderer->render(); 
} 

Nur eine lose Idee a für eine Art, es zu implementieren. Aber wie von einem anderen Benutzer angegeben, gibt es viele verschiedene Möglichkeiten, dies zu tun, abhängig von Ihren Anforderungen. Die Methode, die Sie in Ihrer Frage verwendet würde gut funktionieren

+0

Ich bin schrecklich neu in der Klasse und OOP, aber ich habe einen guten Stich in den Code zu verstehen, wenn Sie nicht von mir hören, senden Sie Hilfe. Aber im Ernst, ich werde eine Weile brauchen, um das Problem zu lösen, denn es scheint perfekt! – Harry

+0

Können Sie mir ein Beispiel dafür geben, wie $ feettypes aussehen sollte, damit ich den Code in einer Testumgebung ausprobieren kann? – Harry

+0

Ich habe es repariert, so dass es funktioniert. http://fixee.org/paste/bdpnmso/ Danke! – Harry

0

Es gibt viele Möglichkeiten, eine Katze zu häuten. Ebenso gibt es viele Möglichkeiten, die gleichen Ergebnisse zu erzielen, die Sie benötigen.

Einige Vorschläge für "verbessern" würde IMO sein -

1. diese Daten als vorab generierte HTML mit einem AJAX-Aufruf abgerufen werden.

Mit einem AJAX-Aufruf, sobald die Seite geladen ist, können Sie die HTML-Segmente Ihres Benutzeraktivitätsfeeds von Ihrem Server erstellen lassen. Dadurch wird Ihre Seite viel schneller geladen und Ihr Inhalt wird kurz darauf geladen.

Sie müssen nicht einmal HTML auf dem Server erstellen - Sie könnten auch ein JSON-Objekt vom AJAX-Aufruf zurückgeben und Ihren HTML-Code mit JavaScript erstellen.

2. Erstellen einer zwischengespeicherten statischen HTML-Datei des Benutzerfeeds, die einfach in das Markup eingefügt wird.

Sie könnten Ihren Server den gesamten HTML-Code generieren lassen, der für einen Benutzer in einem bestimmten Intervall benötigt wird - beispielsweise alle 30 Minuten - und dann diesen HTML-Code in eine Datei speichern, um in den vorhandenen HTML-Code aufgenommen zu werden. Sie können dies mit der include()-Funktion von PHP tun.

Mit dieser Methode hat der Aktivitätsfeed eine Verzögerung beim Aktualisieren, daher ist es möglicherweise nicht die beste Option - aber wenn Sie das Intervall verringern - beispielsweise alle 5 Minuten, werden Sie eine Menge Anrufe an die DB.

Check out cron jobs - Sie könnten sie möglicherweise verwenden, um die Updates zu planen.

3. Platzieren Sie index in das Feld user_id in Ihrer Datenbank, da Sie damit nach Benutzern suchen.

Dies ist besonders wichtig, wenn Sie viele Einträge in Ihrer DB erwarten.Durch das Platzieren eines Indexes für die Felder, die Sie zum Durchsuchen einer Tabelle verwenden, wird die Leistung Ihrer Abfragen erheblich gesteigert.


Ich bin sicher, es gibt viele weitere Dinge, die hier vorgeschlagen werden können.

+0

Stört es dich, die ersten beiden etwas tiefer zu erklären? Sie scheinen interessant zu sein. – Harry

+0

:) – Lix

+0

Danke Lix. Aber ihr geht sein Unterschiede zwischen dem, wie die Anhänger div wie im Vergleich zum photo_upload div zum Beispiel aussehen http://gyazo.com/547240b6fd37ca8df7f2dbbfb3c4ff2e Sehen Sie, wie sie anders aussehen? Wenn ich die Seite erzeuge, wie kann ich es so machen, dass wenn source = photo_upload es so anzeigt und für folgt es wie das obere anzeigt? – Harry

Verwandte Themen