In der Zwischenzeit habe ich das ganze Thema auch für die PHPConference aufgearbeitet und dort in einem 45 min. Vortrag vorgestellt (das Script gibt es hier zum download). Daher hat es auch etwas länger gedauert, da ich mir für das bloggen immer etwas von der quasi nicht vorhandenen freien Zeit abknapsen muss. Egal, die Tränen aus dem Gesicht gewischt und los geht’s.
Wir kommen nun zum zweiten Menüpunkt „Comments“. Hier sollen die eingegangenen Kommentare zunächst einmal angezeigt werden, später dann auch in einem bestimmten Rahmen bearbeitet werden.
Die übergeordnete Ablaufsteuerung bindet im Normalfall den comments-Controller ein. Im constructor der Klasse registrieren wir zwei zusätzlich Tasks „unpublish“ und „view“. Diese beiden sind dann Synonyme für die Funktionen auf die sie verweisen. D.h. rufen ich als Task „view“ auf wird die Funktion „display“ aufgerufen. Hier der PHP-Code zum construktor:
<?php
function __construct( $config = array() )
{
parent::__construct( $config );
// Register Extra tasks
$this->registerTask( 'unpublish','publish' );
$this->registerTask( 'view','display' );
}
?>Die Funktion display ist nicht besonders umfangreich, hier den PHP-Code dazu:
<?php
function display()
{
$model = &$this->getModel( 'comments' );
require_once(JPATH_COMPONENT.DS.'views'.DS.'comments.php');
$view = &$this->getView( 'comments');
$view->setModel( $model, true );
$view->display();
}
?>und nun die Erklärung
In der ersten Zeile erzeugen wir ein Model. Joomla sucht sich die Datei selber und findet diese im „model“-Verzeichnis. In der zweiten Zeile binden wir die Datei mit der View-Klasse ein.
Einmal lassen wir Joomla! die Datei finden und ein anderes Mal suchen wir selber? Das sind die beiden Möglichkeiten die man hat. Entweder man lässt Joomla! nach der Klassendatei suchen oder macht die Klasse selber bekannt. Im zweiten Fall muss man die Datei natürlich an die richtige Stelle legen. Im ersten Fall habe ich das gemacht und bei dem zweiten nicht. Für die Views sieht Joomla! einen etwas komplizierten Mechanismus vor, den möchte ich aber hier nicht nutzen. Grundsätzlich testet Joomla! gibt es die Klasse, wenn Ja dann Objekt erzeugen, wenn Nein dann Datei suchen und ggf. dann erst das Objekt erzeugen. Wie das für die Views auch anders geht sehen wir dann, wenn wir zum Frontend kommen.
In der dritten Zeile wird das View-Objekt erzeugt, die vierte verbindet View und Model und in der letzten wird die display Methode der View-Klasse aufgerufen.
Der Programmablauf geht also nun in der View-Klasse weiter.
Die Erläuterung beschränke ich auf die für den Gesamtablauf wichtigen Programmzeilen:
<?php
function display()
{
global $mainframe;
RdbsCommentViewComments::setListToolbar();
.....
?>Erstellt die Toolbar, das unterscheidet sich nicht sonderlich von dem schon vorgestellten.
<?php
...
$rows = &$this->get('Data');
$page = &$this->get('Pagination');
....
}
?>Holt die Informationen für die anzuzeigenden Zeilen und die Pagenavigation. Hier kommt nun das Model ins Spiel. Das
<?php
$rows = &$this->get('Data');
?>ruft im Model eine Methode „getData“ auf, diese sollte dann passendes zurückliefern. Das schauen wir uns jetzt mal an, der Rest in display-Methode der View-Klasse besorgt die Anzeige ist also nicht ganz so spannend.
<?php
function getData ()
{
global $mainframe;
// Datenbankverbindung aufbauen
$db =& JFactory::getDBO();
// Den context fuer die speicherung von request variabelen festlegen
// Die folgenden Werte bleiben auch ueber mehrere Seitenaufrufe erhalten
$context= 'com_rdbs_comment.comments.list.';
$filter_order= $mainframe->getUserStateFromRequest(
$context.'filter_order', 'filter_order','' );
if (!$filter_order) { $filter_order = 'c.title'; }
$filter_order_Dir= $mainframe->getUserStateFromRequest(
$context.'filter_order_Dir', 'filter_order_Dir', '' );
$filter_state = $mainframe->getUserStateFromRequest(
$context.'filter_state', 'filter_state','*' );
$search = $mainframe->getUserStateFromRequest(
$context.'search','search', '' );
$limit = $mainframe->getUserStateFromRequest( $context.'limit', 'limit',
$mainframe->getCfg('list_limit'), 0);
$limitstart = $mainframe->getUserStateFromRequest( $context.'limitstart', 'limitstart', 0 );
//Wir bauen die where-Bedingung des sqls
$where = array();
if ( $filter_state )
{
if ( $filter_state == 'P' ) {
$where[] = 'c.published = 1';
}
else if ($filter_state == 'U' ) {
$where[] = 'c.published = 0';
}
}
if ($search) {
$where[] = 'LOWER(b.title) LIKE ' . $db->Quote( '%'.$search.'%' );
}
//das bisherige retten
$savewhere = $where;
// jetzt einen string erzeugen
$where = count( $where ) ? "\nWHERE " . implode( ' AND ', $where ) : '';
$orderby = "\n ORDER BY $filter_order $filter_order_Dir";
// weitere Bedingungen ergaenzen
$savewhere[] = 'c.refid = a.id';
// aus den array einen string machen, wie oben eben
$savewhere = "\nWHERE " .implode( ' AND ', $savewhere ) ;
// die gesamtanzahl der datensaetze bestimmen
$query = "SELECT COUNT(*)"
. "\n FROM #__rdbs_comment AS c"
. $where
;
$db->setQuery( $query );
$total = $db->loadResult();
// hier wird zunaechst die pagination objekt klasse geladen
jimport('joomla.html.pagination');
// und hier wird das Objekt erzeugt
$this->_page = new JPagination($total, $limitstart, $limit);
// hier wird das SQL für die Datenabfrage erstellt
$query = "SELECT c.*, a.title as atitle"
. "\n FROM #__rdbs_comment AS c, #__content as a"
. $savewhere
. $orderby
;
// Datenbankabfrage ausfuehren
$db->setQuery($query, $this->_page->limitstart, $this->_page->limit);
// Werte einer Klassenvariablen zuweisen
$this->_data = $db->loadObjectList();
// selectbox fuer der state filter erstellen
$lists['state'] = JHTML::_('grid.state', $filter_state );
// sortierung
if ( $filter_order_Dir == 'DESC' ) {
$lists['order_Dir'] = 'ASC';
} else {
$lists['order_Dir'] = 'DESC';
}
$lists['order'] = $filter_order;
// such filter
$lists['search']= $search;
$this->_lists = $lists;
// wenn die abfrage fehlerhaft war dann einen fehler 500 erzeugen und ende
if ($db->getErrorNum()) {
JError::raiseError( 500, $db->stderr() );
return false;
}
return $this->_data;
}
?>Ich hoffe die Erläuterungen die ich in den Programmcode eingefügt habe reichen aus.
Ein Problem gibt es in dem Programmcode noch, das ist das Sortieren, so ganz funktioniert das noch nicht. Dazu schreibe ich dann mal einen Extra-Artikel.
Das wäre es aber auch schon bzgl. Backend. Wir haben bis jetzt eine Möglichkeit geschaffen Daten aus einer Tabelle anzuzeigen. Das ist sicher ein achtbarer Erfolg, aber mit wenig praktischem Nutzem. Wir müssen uns also jetzt überlegen, wie die Daten in die Tabelle geschrieben werden. Das Zauberwort heißt hier „Plugin“. Eine einfache Version habe ich in dem o.g. Vortag schon entwickelt, diese Version ist aber sicherlich für den harten Einsatz in der Welt der Spammer und der was_weiss_ich_verlängerer nicht gut geeignet. Darüber hinaus müssten wir noch eine Möglichkeit für die Konfiguration unserer Erweiterung schaffen und genau das machen wir jetzt.
Als ich oben den Aufruf für die Erzeugung der Toolbar fast übergangen bin habe ich bewusst etwas ausgelassen, es gibt mit der 1.5 eine super einfache Möglichkeit für die Konfiguration.
<?php
function setListToolbar()
{
$user =& JFactory::getUser();
JToolBarHelper::title( JText::_( 'Comments Manager' ), 'generic.png' );
JToolBarHelper::publishList();
JToolBarHelper::unpublishList();
JToolBarHelper::deleteList();
JToolBarHelper::editListX();
if ($user->get('gid') == 25) {
JToolBarHelper::preferences('com_rdbs_comment', '300');
}
}
?>Interessant ist die Zeile
<?php
JToolBarHelper::preferences('com_rdbs_comment', '300');
?>dadurch wird ein Button erzeugt der beim Klick ein Konfigurationsfenster öffnet,

in diesem Fenster werden je nach Inhalt der Datei config.xml (diese muss im Erweiterungsverzeichnis im backend liegen) Parameter angeboten. Hier die Beschreibung aus config.xml.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
< ?xml version="1.0" encoding="utf-8"?> <config> <params> <param name="autopublish_comment" type="radio" default="0" label="auto publish comments" description="TIPAUTOPUBLISHCOMMENT"> <option value="0">No</option> <option value="1">Yes</option> </param> <param name="@spacer" type="spacer" default="" label="" description="" /> <param name="donotify" type="radio" default="0" label="Send Notification" description="TIP"> <option value="0">No</option> <option value="1">Yes</option> </param> <param name="emailnotify" type="text" default="" label="Email for notification" description="TIPEMAILNOTIFY" /> </params> </config> |
Die Werte werden in die Datenbank geschrieben und stehen dann über einen simplen Aufruf zur Verfügung. Die nötigen Zeilen sind:
<?php
$config = &JComponentHelper::getParams( 'com_rdbs_comment' );
$val=$config->get('autopublish_comment',0);
?>Die bisherigen Konfigurationsparameter sind noch etwas dünn, daher mal ein Aufruf „Was möchtet Ihr an der Erweiterung konfigurieren können?“. Ich habe bisher folgendes gesammelt:
- Benachrichtigung über neue Kommentare (ja / nein)
- Emailadressen für die Benachrichtigung
- Kommentar dürfen erstellt werden von (allen / nur registrierten)
- Kommentar sofort veröffentlichen (ja / nur von registrierten / nein)
- Kommentierung von unkategorisierten Artikeln (ja/nein)
- Kommentierung von kategorisierten Artikeln (Auswahl der Sections / Categories)
- Sortierung der Kommentar (neuste / älteste) zuerst
- Formular (vor / nach) den Kommentaren
- Maximal Anzahl links im Kommentar
- Bei allen links nofollow ergänzen
- Maximal Anzahl Kommentare pro ip-adresse und Tag
In der nächsten Folge geht es dann um die Methode wie die Daten möglichst geschickt in die Datenbank kommen und wie man das, dann ggf. auch noch im Zusammenhang mit dem eigenen Template, an die eigenen Erfordernisse anpassen kann.
Für die Leute die es mal wieder nicht erwarten können: Es geht weiter, wenn ich fertig bin, also nervt nicht mit nachfragen.


Kommentare
1) LOL
Autor(in): Miri
LOL* - nach dem langen und gehaltvollen Text darf man sich dann auch ein Ende wie dieses erlauben, wa???
"Für die Leute die es mal wieder nicht erwarten können: Es geht weiter, wenn ich fertig bin, also nervt nicht mit nachfragen."
aber find ich gut - werde ich bei gelegenheit auch verwenden :)
Neuen Kommentar hinzufügen
RDBS Comment entwickelt von Robert Deutz Business Solution