Barra laterale

programmazione:php:modificare_plugin_discussion_di_dokuwiki

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

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 .


programmazione/php/modificare_plugin_discussion_di_dokuwiki.txt · Ultima modifica: 18/04/2018 - 15:49 (modifica esterna)