phpbar.de logo

Mailinglisten-Archive

[php] Artikelverwaltung

[php] Artikelverwaltung

Björn Schotte php_(at)_phpcenter.de
Sun, 17 Jun 2001 22:35:50 +0200


* Manfred G. wrote:
> http://phpnuke.org
> Kennt sich jemand damit aus?

Nein. Ich möchte aber gerne mal das System beschreiben, welches
ich im PHP-Center entwickelt habe. Es basiert im Wesentlichen
auf der Sache, die ich für die Online-Community http://www.telemat.de/
entwickelt habe, fürs PHP-Center jedoch noch mal schnell komplett
neu schrieb. Benötigter Zeitaufwand für die etwas über 1000 Zeilen
Code war ein halber Manntag (4h). Ich kann das include-file dafür
gerne releasen, allerdings wird es sicherlich nicht out-of-the-box
einsetzbar sein, mithin befindet es sich auch noch in Entwicklung.

Dennoch hier zum Verständnis eine "Artikelverwaltung" beschrieben,
wie ich sie für sinnvoll erachte - die ursprüngliche Idee dazu stammt
vom Betreiber von telemat.de, Jürgen Christ.

Das System kennt einen Datensatz Artikel mit den üblichen Feldern:

- Timestamp
- Art des Artikels (die Art wird hierbei als normales Char
  abgespeichert, ist kein Verweis auf eine zweite Tabelle, um
  hier Joins zu sparen, außerdem ist es bei den wenigen
  Rubriken, deren Rubrikname sich sowieso nicht ändern wird,
  IMHO oversized, das auszulagern)
- Autor (Verweis auf die User-ID der Usertabelle, die PHPLIB-like
  ist)

- Redakteur, der die letzte Änderung machte bzw. es freischaltete
  (Verweis auf User-ID der Usertabelle)
- Timestamp der Redakteurs-Änderung

- published-Flag (0: nicht veröffentlicht, 1: veröffentlicht)
- wiedervorlage-Flag (dazu später mehr)

- Titel des Artikels
- Teaser
- eigentlicher Text
- Zusätzliche Links (Typ: TEXT)
(- bei telemat.de noch Möglichkeit eines Dateiuploads, hier wäre
dann der Filename verzeichnet)
- Hinweistext an die Redaktion
- existiert ein Phorum für diesen Artikel
- Clicks auf diesen Artikel

Zwei Felder bedürfen der weiteren Erklärung: die Wiedervorlage
kann man sich wie ein System aus verschiedenen Körben vorstellen,
in die der Artikel wandert. Das ist dann nötig, wenn der Redakteur
den Beitrag redigiert (d.h. überarbeitet), ihn jedoch noch nicht
freischalten, sondern zurückstellen möchte. In meinem System hat
die Zurückstellung den einfachen Wert "1", damit landet es in der
Auflistung in der Wiedervorlage. Das könnte man dahingehend leicht
erweitern, indem man mehrere Wiedervorlage-"Körbe" einrichtet und/oder
diese "Körbe" jeweils nur bestimmten Redakteuren zugänglich macht,
um mit ein klein wenig mehr Aufwand einen Workflow zu erreichen. Ist
jedoch bei uns (noch) nicht nötig.

In der Benutzeroberfläche erscheint die Wiedervorlage als eine
abgetrennte Liste. Hier könnte man sicherlich an der Usability
noch drehen, doch dazu später mehr.

Der Hinweistext an die Redaktion hat folgende Funktion: damit kann
der Autor eines Artikels der Redaktion noch gewisse Dinge mitteilen,
zum Beispiel "Das Buchcover liegt auf http://www.bla.de/fasel.jpg,
bindet es ein, wenn Ihr mögt" oder ähnliche Hinweise. Existiert solch
ein Hinweis, wird der Text in der Liste unterhalb des Titels mit
roter Farbe und fettgedruckt angezeigt.

Siehe dazu auch den Screenshot auf

   http://www.phpcenter.de/img/redaktion.jpg


Bei jedem Proposal eines Beitrags geht eine automatische E-Mail
an unsere Mailingliste redaktion_(at)_phpcenter.de, die in Kurzfassung
alle eingegebenen Daten anzeigt.

Der Redakteur hat dabei in der Spalte "Aktion" weitere Möglichkeiten:
er kann den Artikel bearbeiten (und dabei auch Publikationsdatum und
-uhrzeit verändern), ihn löschen, ihn in die Wiedervorlage schmeißen
oder ihn publizieren und damit öffentlich zugänglich machen.

Die Wiedervorlage kennt momentan nur die Beschränktheit "In die
Wiedervorlage reinschmeißen" und "Aus der Wiedervorlage in die
Liste nicht veröffentlichter Artikel schieben (published=0,
wiedervorlage=0).

Zu jedem Artikel sollte, wie vorhin erwähnt, zusätzlich die
Möglichkeit bestehen, ein Phorum anzuschließen. Phorum bot sich an,
weil wir es bereits einsetzten. Der größte Nachteil bei Phorum ist
jedoch, dass es keine komfortable API bietet. Ich habe mir dazu
1-2 Stunden Zeit genommen und die index.php-Datei aus dem Admin-Teil
von Phorum kopiert, die Loginüberprüfungen herausgebaut und eigene
Funktionen hinzugefügt:

red_get_folderid()
red_activate_phorum()
red_deactivate_phorum()
red_drop_phorum()
red_add_phorum()
red_new_phorum()


red_new_phorum() macht nichts anderes, als einige globale Variablen,
die normalerweise beim Erzeugen eines neuen Phorums durch die
Eingabeformulare belegt werden, mit definierten Werten zu belegen,
d.h. zum Beispiel die Farbgebung des Phorums, wie die Tabelle in
der Datenbank heißen soll (bei uns ein md5-Hash) etc.pp. Die funktion
ruft dann red_add_phorum() auf, die den ursprünglichen Phorum-Code
zum Erzeugen eines neuen Phorums enthält.

red_get_folderid() benötige ich, um die ID eines Folders mit dem
Namen ABC (z.B. "Artikel", oder "News", oder "Zend") herauszubekommen.

Die Redaktionsoberfläche macht nichts anderes, als beim Veröffentlichen
eines Beitrags über diese selbstgestrickte/gekrüppelte Phorum-API ein
Phorum anzulegen und in der Artikel-Tabelle die ID des Phorums abzulegen,
damit später darauf verlinkt werden kann. Wenn ein Beitrag aus der
Veröffentlichung zurückgenommen wird, wird das Phorum deaktiviert, wird
der Beitrag gelöscht, wird auch das Phorum gelöscht.

Zusätzlich kennt das include-File noch einige Funktionen, um z.B. die
einzelnen Artikel auf der Startseite anzuteasern, die detail.php-Seite
mit dem Inhalt des Artikels zu providen sowie eine Liste aller Artikel
ohne Teaser (nur mit dem Titel) aufzulisten. Eingesetzt wird hierbei
PHPLIBs DB- sowie die Template-Klasse mit Blöcken.

Das System ist nicht perfekt, es fehlen noch folgende Funktionen, die
ich noch einbauen möchte:

- bevor ein Autor seinen Beitrag submitted, muß er ihn vorher
  previewen (so wie bei slashdot, freshmeat et al.)

- ein Locking-Mechanismus, wenn ein Redakteur gerade einen Artikel
  bearbeitet. Ist momentan noch nicht nötig dank social engineering.

- einen Batchmode wie bei telemat.de, d.h. dass der Redakteur nicht
  eine Liste der Artikel sieht, sondern direkt in die Eingabemaske
  des neuesten Artikels kommt und somit alle Artikel wie am Fließband
  abarbeiten kann (lohnt aber nur, wenn sehr viele Artikel auf einmal
  reinkommen)

- eine Rückkommunikation zum Autor, d.h. dass Beiträge declined werden
  können: der Autor erhält beim Einloggen ins PHPCenter die Nachricht,
  dass sein Beitrag aus XYZ Gründen abgelehnt wurde und er ihn direkt
  online nachbearbeiten und wieder zurück zur Redaktion schicken kann

- Kleinigkeiten wie ein netter Kalender (http://www.phpinsider.com/php/code/Date_Calc/,
  danke Sebastian für den Tipp damals), den nur die Redakteure sehen

- generelle Verbesserung der Usability, z.B. durch Einsatz der overlib
  (http://www.bosrup.com/web/overlib/), um eine bessere Benutzbarkeit
  des Redakteursfrontends zu erzeugen und um damit die Produktivität
  zu steigern.

Den Schwierigkeitsgrad, so etwas zu entwickeln, stufe ich als gering
bis mittel ein, da hier im Prinzip nur basics (aus der Datenbank
rauslutschen und in sie reinschmeißen, Template-Geschichte, Login-
Mechanismus via PHPLIB out of the box etc.) vorkommen. Die größere
Schwierigkeit sehe ich bei solchen Dingen in der Benutzbarkeit der
Frontends (für Redakteure und Autoren), die durch Dinge wie overlib
oder eine bessere Darstellung der Listen oder Sachen wie Batchmodus
erhöht werden könnten. Dies läßt sich jedoch nur im Laufe der Zeit
feststellen, da Redakteure letztendlich die Opfer, äh, eigentlichen
Benutzer sind und dementsprechend Vorschläge für das System bringen
können.

PHPNuke hatte ich mir bereits angeschaut, allerdings war der Code
nicht besonders gut dazu geeignet, um sich leicht in unser bereits
vorhandenes System integrieren zu lassen. Insbesondere wollte ich
kein zweites Slashdot aufbauen. Wenn ich mich jetzt über die fehlende
Objektorientierung in PHPNuke beschweren würde, müßte ich zugeben,
dass beitraege.inc.php auch nicht objektorientiert daherkommt, was
ich jedoch für meine Zwecke für vernachlässigbar halte, da die Zeit
nicht da war, sich um ein sauberes OO-Design zu kümmern.

Eine wichtige, abschließende Geschichte möchte ich auch nicht
vergessen: das Sammeln von Community-Points. Communities bieten
in der Regel einen zusätzlichen Anreiz für die Benutzer, damit
diese mitarbeiten und die Community mitgestalten (Online Panels
arbeiten nach dem gleichen Prinzip, hier geht es jedoch darum,
die Benutzer dazu zu bekommen, bei Umfragen mitzumachen), in Form
von Punkten. Bei uns ist es z.B. so, dass jeder, der sich einen
Account einrichtet, 100 Startpunkte bekommt. Für jeden eigenen
Beitrag, der veröffentlicht wurde, werden weitere 20 Punkte
gutgeschrieben. Wird ein Beitrag wieder gelöscht, werden die 20
Punkte abgezogen. Damit Redakteure auch etwas von ihrer Arbeit
haben, bekommen sie für jedes Veröffentlichen eines Beitrags 5
Punkte, für jedes Un-Publish'en eines Beitrags werden ihnen diese
5 Punkte wieder abgezogen. Nach einigen Monaten sollen die aktivsten
Nutzer (mich ausgeschlossen) von Sponsoren mit Preisen belohnt
werden.

Das System soll eine Mischung aus vorhandenen Systemen (konkret
Slashdot und linux-community.de) sein, jedoch die Funktionalität
dessen bieten, was ich bereits einmal für eine Community (telemat.de)
entwickelt hatte.

Der Hintergedanke war, dass ich bisher die Meldungen per Hand
auf der Startseite eintrug, es mir jedoch mit der Zeit (da ich
häufig unterwegs bin) unmöglich wurde, möglichst tagesaktuell
zu bleiben - und damit die Arbeit auch nicht nur an mir haften
bleibt, da sonst das Ziel der Aktualität nicht gewährleistet
werden kann.

Mein nächstes Ziel, in das ich noch einiges an Arbeit stecken
muß, ist die Migrierung vorhandener, statischer Contents (z.B.
aus der Rubrik PHP Inside oder von den Case Studies) in das
Beitragssystem. Danach soll es auch durchsuchbar sein.

Positiver Nebeneffekt des ganzen ist, dass wir endlich auch
einen RDF-/RSS-Newsfeed bieten können, der über

   http://www.phpcenter.de/backend/phpcenter.rss

erreichbar ist. Erzeugt wird er übrigens mit der Klasse von

   http://linux.gelrevision.nl/php/ (phpChannel)

Zusätzlich gibt es eine nette Newsbox auf

   http://www.phpcenter.de/backend/box.php und
   http://www.phpcenter.de/backend/box.php?roundtable=1

die übrigens auch bei yaps.de in die eigene Startseite
integriert werden kann.

Das war's soweit, weitere Vorschläge, wie man solch ein
Beitragssystem verbessern kann, sind gerne Willkommen. Vielleicht
hilft es dem einen oder anderen ja, der etwas Ähnliches auf
die Beine stellen möchte - schwierig ist es wie gesagt nicht
bei einem Coding-Aufwand von 4h. (Konzeptionierung hat sicherlich
noch einiges mehr gekostet)

-- 
PHP Schulungen und                     | International PHP Conference
Schulungsmaterial:                     |             05. - 07.11.2001
                                       |      Astron Hotel, Frankfurt
http://thinkphp.de/                    |  http://www.php-kongress.de/


php::bar PHP Wiki   -   Listenarchive