Indice

Modificare plugin Discussion per usarlo sul blog di Dokuwiki

Autore: Fabio Di Matteo
Ultima revisione: 17/09/2008

Potrebbe capitare di voler usare il software cms Dokuwiki per creare un blog e si potrebbe avere l'esigenza di attivare il plugin per i commenti (Discussion). E fin qui nulla di strano, tranne che non esiste un sistema di notifica dei commenti, ovvero se non si va a guardare nel blog non si sarà informati sull'invio di nuovi commenti.

Lo scopo di questa guida e' creare un sistema di notifica dei commenti e fare in modo che i commenti inviati vengano pubblicati solo dopo che l'amministratore li abbia moderati.

Quello che serve

  1. Plugin Discussion 2008-08-08

Scriviamo il sistema di notifica dei commenti

Il sistema di notifica dei commenti farà le seguenti cose:

  1. Ci informerà via mail dell'invio di un commento
  2. scriverà su un file di log ip, data commento e posta elettronica dell'utente.

Per prima cosa è necessario installare il plugin Discussion dopodichè si dovrà provvedere a modificare il file {dokuwiki}/lib/plugins/discussion/action.php aggiungendo il codice qui sotto dentro la funzione function _notify($comment, $subscribers) :

Ecco solo il codice da aggiungere,nella funzione function _notify($comment, $subscribers) invece nel paragra successivo pubblico la funzione nella sua interezza (contenuta sempre nel file {dokuwiki}/lib/plugins/discussion/action.php .

//Notifica sempre all'amministratore
		$replace = array(
                        $ID,
                        $conf['title'],
                        strftime($conf['dformat'], $comment['date']['created']),
                        $comment['user']['name'],
                        $comment['raw'],
                        wl($ID, '', true) . '#comment__' . $comment['cid'],
                        wl($ID, 'do=unsubscribe&hash=' . $hash, true, '&'),
                        DOKU_URL,
                );
 
        $admin_mails="admin@fml.org";
	$body = str_replace($search, $replace, $text);
	mail_send($admin_mails, $subject, $body, $conf['mailfrom']);
	//fine notifica all'amministratore

Non e' il caso di scrivere le istruzioni per implementare il sistema dei log, in quanto i log di tutti i commenti stanno nel file {dokuwiki}/data/meta/_comments.changes .

La funzione _notify($comment, $subscribers) modificata

Codice relativo alla versione al plugin Discussion 2008-08-08 .

function _notify($comment, $subscribers) {
        global $conf;
        global $ID;
 
        $text = io_readfile($this->localfn('subscribermail'));
        $subject = '['.$conf['title'].'] '.$this->getLang('mail_newcomment');
 
        $search = array(
                '@PAGE@',
                '@TITLE@',
                '@DATE@',
                '@NAME@',
                '@TEXT@',
                '@COMMENTURL@',
                '@UNSUBSCRIBE@',
                '@DOKUWIKIURL@',
                );
 
        // notify page subscribers
        if (($conf['subscribers']) && ($conf['notify'])) {
            $bcc = subscriber_addresslist($ID);
            $to = $conf['notify'];
 
            $replace = array(
                    $ID,
                    $conf['title'],
                    strftime($conf['dformat'], $comment['date']['created']),
                    $comment['user']['name'],
                    $comment['raw'],
                    wl($ID, '', true) . '#comment__' . $comment['cid'],
                    wl($ID, 'do=unsubscribe', true, '&'),
                    DOKU_URL,
                    );
 
                $body = str_replace($search, $replace, $text);
                mail_send($to, $subject, $body, $conf['mailfrom'], '', $bcc);
        }
 
        // notify comment subscribers
        if (!empty($subscribers)) {
 
            foreach($subscribers as $mail => $hash) {
                $to = $mail;
 
                $replace = array(
                        $ID,
                        $conf['title'],
                        strftime($conf['dformat'], $comment['date']['created']),
                        $comment['user']['name'],
                        $comment['raw'],
                        wl($ID, '', true) . '#comment__' . $comment['cid'],
                        wl($ID, 'do=unsubscribe&hash=' . $hash, true, '&'),
                        DOKU_URL,
                        );
 
                $body = str_replace($search, $replace, $text);
                mail_send($to, $subject, $body, $conf['mailfrom']);
            }
        }
	//Notifica sempre all'amministratore
		$replace = array(
                        $ID,
                        $conf['title'],
                        strftime($conf['dformat'], $comment['date']['created']),
                        $comment['user']['name'],
                        $comment['raw'],
                        wl($ID, '', true) . '#comment__' . $comment['cid'],
                        wl($ID, 'do=unsubscribe&hash=' . $hash, true, '&'),
                        DOKU_URL,
                );
 
        $admin_mails="admin@fml.com";
	$body = str_replace($search, $replace, $text);
	mail_send($admin_mails, $subject, $body, $conf['mailfrom']);
	//fine notifica all'amministratore
    }

Non pubblicare immediatamente i commenti

Per far in modo che i commenti non vengano pubblicati immediatamente, ma piuttosto vengano resi invisibili in attesa della moderazione dell'amministratore e' sufficente editare il file action.php nella funzione function _add($comment, $parent) con le seguenti istruzioni

...
// fill in the new comment
        $data['comments'][$cid] = array(
                'user'    => $comment['user'],
                'date'    => array('created' => $date),
                'show'    => false,
                'raw'     => $comment['raw'],
                'xhtml'   => $xhtml,
                'parent'  => $parent,
                'replies' => array()
                );
...

Da notare 'show' ⇒ false .